分类目录归档:网络

对各种网络问题的研究

DN42全攻略-part1-注册gitea

前言

最近在网上看到个很神奇的东西,叫做DN42,这是个实验性的网络,各个玩家通过VPN隧道在世界各地之间的节点建立链接,并通过BGP协议将各个玩家的网络连接到一起,模拟真实的互联网的环境。然后各个玩家可以在这个网络里面部署自己的服务,测试各种技术,实施各种一般情况下需要不少花费(比如说注册ASN,申请IP地址块,和其他人进行peer等)才能达成的操作。

这一下子就激起了我的兴趣,于是仔细阅读了官网的说明,并且根据指引,完成了注册,并peer了不少节点,完成了DNS服务的搭建,姑且算是完成了入门。于是在这里写以下文章,供后人参考。

官网的wiki关于开始的页面里面提供了相当详细的描述,这里就简单的用中文描述一下申请的流程,还有一些我踩过的坑。

准备材料

首先,你得有一些最基础的知识和材料,比如说你得知道什么是VPN、BGP等,还有需要支撑你参与到这个游戏里面的最基本的工具——一个能运行BGP的机器,你可以选择的机器有很多,从普通的x86电脑到ARM的单板机到一些家用的路由器(目前据我所知就只有Openwrt和RouterOS满足条件),都可以。主要能7*24的运行即可。

至于说其他企业级路由器就有点不幸了,因为现在网里面大家基本上都是用wireguard作为VPN隧道,而我所知的企业级路由器,绝大部分都不支持这个功能,所以强烈不推荐用企业级路由器和其他人进行互联,当然,用来做你自己的网络的核心是没问题的。

还有最后一个的话就是互联网链接,这个不多叙述,最好是有公网的ipv4和ipv6地址。

材料都准备好之后,就可以着手开搞了。

订阅消息

参考链接:https://dn42.dev/contact#contact_mailing-list

订阅的方法很简单,往dn42+subscribe /at/ groups.io发一封邮件就行,然后会有一封自动回复的邮件,让你确认是否要订阅。这时候再随便回复点什么就可以完成订阅了。

完成订阅之后就可以进行下一步,也就是正式开始申请资源了。

注册git.dn42.dev

dn42的整个registry信息都是gitea来存储的,所有人都可以pull来获取全部内容,如果想要申请点什么资源,添加点什么记录,方法就是通过PR(pull-request)来向管理员申请。在管理员审核之后,会将你的申请合并进去,就可以让大家都查看到你的信息了。一般来说,管理员每天做一次审核。

大神burble做了一个在线的浏览工具可以查看现在registry里面的内容

registry里面的结构是这样的,不同的文件夹里面以纯文本的方式记录着不同的内容。

.
├── data
│ ├── as-block
│ ├── as-set
│ ├── aut-num
│ ├── dns
│ ├── inet6num
│ ├── inetnum
│ ├── key-cert
│ ├── mntner
│ ├── organisation
│ ├── person
│ ├── registry
│ ├── role
│ ├── route
│ ├── route-set
│ ├── route6
│ ├── schema
│ └── tinc-key
└── utils
└── schema-check

了解到大概的流程之后,就可以着手开干了。

首先,打开https://git.dn42.dev/dn42/registry,会提示登录,这时候注册一个账号,注册完成之后重新打开链接,就能看到默认的readme了。

这时候先去创建一个PGPkey,因为你必须对你提交的内容进行一个签名,于此同时,PGPkey也可以用来证明你的身份,所以要好好保存,不要泄露。

我使用的密钥管理工具是kleopatra,如果你之前没有PGPkey的话,可以用这个工具创建一个新的PGP密钥对。注意,创建的时候需要保证密钥对里面的邮箱地址是你用来注册git.dn42.dev的那个。

在创建完密钥对之后,右键选择对应的key,选择导出,可以导出对应的公钥。

导出来的文件可以直接用文本编辑器打开,就是公钥的内容了。

然后全选,复制。再打开刚完成注册的gitea,进去个人设置,找到SSH/GPG密钥,然后将复制出来的内容填到内容框里面,然后点击“增加密钥”。

保存好之后,再点击增加的密钥旁边的“验证”

系统会生成一段随机的文字,复制出来,粘贴到klepatra的记事本标签页。然后点击“签名记事本”,会找你输入生成GPG密钥对的时候的密码。

输入正确之后,会对记事本的内容进行签名。

再将记事本里面的全部内容复制出来,粘贴到网页上的GPG增强签名文本框里面,点击验证。即可完成验证,之后你就能用这个GPG密钥来对git push进行签名了。

又或者直接复制页面上那段,直接在终端里面运行。会得到一样的签名信息。

echo "911ebb86da4234f38cb65f3d670798422a03205a5cbaba25fb8e6e82da5ab468" | gpg -a --default-key A67CBCEB66739B68 --detach-sig

到此就完成了前期的准备工作,下一步就是fork整个registry,修改本地内容,然后重新push并请求PR,这个下一篇再说。

在Linux中为主机添加一个地址段

一般情况下,一台主机只会有一个,或者几个ip地址,这种情况下,配置ip地址的方法有非常多文章可以搜索到,这里不加赘述。但是如果我想给主机配置很多ip地址,类如ipv6配置一个/64的地址块呢,这时候一个一个的在配置文件里面写配置显得非常的不实际。

万幸,网上有人问过这个问题,里面提到一个叫做AnyIP的东西,可以让linux响应多个ip地址,配置方法也很简单,就写一条静态路由就行了。

ip route add local 2001:db8::/32 dev lo

和平时添加静态路由差不多,就是在目标地址前面加一个“local”,然后目标设备是lo即可。

Mikrotik动态更新从PPPOE获得的dns服务器

手里的那只RB750Gr3之前给几个出租屋的房间配置dhcp的时候,都是将客户端的dns指向RB750Gr3自己作为网关的ip地址,这样,RouterOS会作为一个DNS代理,查询和缓存DNS请求。这样设置其实没啥问题,只是这几天又突发奇想,想着要不直接分发运营商的DNS服务器地址给用户,如此一来,可以稍微的降低一下路由器的负载(其实没多少)。

Mikrotik的脚本功能其实比较强大,但是相关的文档就惨不忍睹,好在论坛上有好心人回答问题,给我提供了一些思路。以下是我写的脚本。

:local dynamic (([/ip dns print as-value]) -> "dynamic-servers" );
:local dns

:set dynamic [:tostr $dynamic]

:for i from=0 to=([:len $dynamic] - 1) do={ 
 :local char [:pick $dynamic $i]
 :if ($char = ";") do={
  :set $char ","
 }
 :set dns ($dns . $char)
}

/ip dhcp-server network set [ find comment=UserNet ] dns-server=$dns

简单的解释以下脚本内容:

  • 1.从/ip dns里面读取“dynamic-servers”的内容,这些ip地址是pppoe拨号之后,从pppoe服务器上获取到的。
  • 2.要将dynamic的内容填充到dhcp-server里面,但是因为读取到的内容是一个array,用”;”分隔,没法直接套用,所以,需要转换成string类型。
  • 3.然后将”;”替换成”,”,然后就可以在修改配置的命令行里面调用了。
  • 因为配置里面,包含了多个dhcp-server,而我不需要修改全部的network的配置,所以,我给需要修改配置的network,写了一个备注,内容是“UserNet”。这样脚本就会只修改备注内容是“UserNet”的network配置了。

脚本做好之后,就是调用了,可以选择定时执行脚本或者是在pppoe会话起来的时候执行,我选择的是在pppoe会话起来的时候执行。找到pppoe调用的ppp profile,在scripts里面调用就行了。

使用OPNsense来保护内网的服务

因为在家里部署了不少应用服务,所以,也想将一些服务暴露到公网上,但是呢,直接暴露的话,会有非常大的风险。全部走vpn也略微有点麻烦,虽然最近看到一些油管的UP主在推荐cloudflare的tunnel服务,但是我都自己托管了,还走cloudflare是不是有点……愚蠢呢。

因为工作的原因有接触过pfSense,然后也尝试过其分支OPNsense,一番测试之后,发现大有可为,不得不说真好使。

安装OPNsense

就是很普通的用iso引导,然后根据屏幕上的说明一路下一步就行。安装完毕之后,顺手更新一下系统。调整一下时区、默认语言等。

安装必要的插件

最主要的插件只有2个,一个是os-acme-client,另外一个是os-nginx。acme负责签署证书,而nginx,则负责做反向代理。

自动注册证书

从侧边栏访问“服务-ACME客户端”,默认的设置页面会报错,这时候,需要切换成英文,就能够正常打开页面了。跑去settings页面,打开启用插件和自动更新,应用。剩下的就可以切换回中文了。

下一步,就是创建一个账号,只要填一下邮箱地址,其他默认就行。

下一步是添加一个“挑战类型”,这里其实翻译成“验证类型”会比较好……

由于国内的环境,80和443端口都不用想了,所以只能走dns,具体用哪一家的dns,就根据对应的服务商的文档来配置就行。

下一步是创建一个自动操作,这里选择重启Nginx,这样证书在续签之后会自动重启nginx,并应用新的证书。

然后就是创建一个证书(申请)

注意这里的域名应该这样设计:一个通用域名(example.com),还有其下的通配符域名(*.example.com)。到时候,example.com应该返回一个404;具体对应的系统,则应该放在子域名来访问,例如nextcloud.example.com。另外,所有的应用都应该使用同一个监听端口,除非是由于某些原因,只能使用”流“(stream)代理。如此,可以最大限度地隐藏服务入口。

最后,自动操作里面选择一下刚创建的重启nginx的操作。保存。

保存之后出来可以手动触发一下证书签署,顺利的话就直接拿到一个可以用的证书了。

配置NGINX

OPNsense使得nginx的配置简单的很多,只要点点点就行,而且附加了很多安全方面的设置,有很多值得学习的内容。

创建错误提示页面

为了误导可能的攻击者,我们需要整点花活,因为默认情况下,被策略拦截之后,会向客户端返回一个页面,提醒被OPNsense上的策略拦截了。这可不行,怎么能让对方知道我们用了什么东西的呢对吧。我们来创建一个错误页面,整一个Nginx默认的500错误页面。并且匹配所有的状态码。

这样,无论是什么错误,用户都只能看到一个500的错误。(邪恶)

创建一个默认的服务器

设计的思路在证书那里已经说过了,首先,创建一个默认的服务器,在访问域名不正确的情况下,所有的访问都会跑到这里来:

位置

首先创建一个位置(HTTP(s)-位置),打开高级模式,修改以下的内容,确认保存:

  • 描述:随便填写
  • 网址格式:/
  • 强制HTTPS:勾选
  • honeypot:勾选

这里解释一下这个honeypot,在打开这个参数之后,如果访问了这个位置,就只会返回一个403,并且源地址将会被记录,然后屏蔽。具体屏蔽的时间,可以在“常规设置”的页面,打开高级选项,就可以自定义屏蔽的时间了。

HTTP服务器

然后创建一个服务器(HTTP(s)-HTTP服务器),修改这些内容:

  • HTTP监听地址:空
  • HTTPS监听地址:0.0.0.0:8443(你应该换个别的端口号)
  • TLS证书:(刚签署的那个)
  • 仅HTTPS:勾选
  • 错误页面:刚创建的糊弄人的默认错误页面

配置好DNS之后就可以测试一下是否生效了。尝试访问一下这个服务器,会得到一个空白页。然后在禁止的页面上就能看到这个ip进入了拦截清单了。

调整防火墙策略

最后一步就是调整防火墙策略,新增一个策略,拦截掉这些坏东西的访问:

  • 操作:阻止
  • 源:nginx_autoblock

这样,那些来源不明的访问就会被拦截。

应用保存之后,一个基本的拦截就做好了,攻击者在不知道你有什么域名的情况下,如果访问了OPNsense,就会被关小黑屋,被防火墙拦截,而被防火墙拦截的情况下,其他的端口也会无法访问。

另外,由于我们签署的证书包含2个域名,一个是example.com,另外一个是*.example.com。所以,即便是通过这次的访问,拿到了SSL证书,也不会知道我们用的是什么域名。这就能最大限度地隐藏访问入口。

添加需要暴露的服务器

基础搭建好了之后,就是增加需要通过nginx反向代理的服务了。一共有4个步骤,简单的说法:

  1. 添加一个“上游服务器”
  2. 添加一个“上游”
  3. 添加一个“位置”
  4. 添加一个“HTTP服务器”

上游服务器

需要填写的一共4项,描述、服务器、端口还有优先级。这里特别说明以下,因为设计上,是有多个后端的,所以必须要填上一个优先级。因为一般只有1个后端,所以……随便填一个数字就行。

上游

这里的话,只要填写描述,然后,服务器条目选择刚创建的上游服务器即可。值得注意的是,如果被反代的服务器是使用https的,则需要勾选上“启用TLS(HTTPS)”

位置

位置的话,刚才在创建一个默认的服务器的时候已经讲过了,这次稍有不同的地方,就是有一个额外的选项需要选择,就是“上游服务器”,这里选择刚才创建的“上游”即可。

HTTP服务器

可以参考上面的创建http服务器,和之前的主要差别,只有1个,那就是需要指定一个你自己才知道的属于*.example.com的子域名。由于证书是泛域名证书,所以所有子域名都能够使用。

应用配置

一切搞定之后,点击应用,保存并生效。

最后,在调整完dns之后,你就能用https://private.example.com:8443/来访问你需要暴露的服务了。有多个应用的情况下,重复创建上游服务器、上游、位置、http服务器,即可。

Mikrotik RB750Gr3优化配置,跑(差点)满千兆

开篇

故事背景是这样,出租屋那里有一只RB750G r3做出口路由器,之前由于互联网线路是300M的,所以在配置方面,是比较随意,就真把这小东西当成一个能5个口都跑满线速度的路由器来规划接口的链接方式了。

可是,最近由于电信将宽带免费(是的,只要满足月消费多少多少,就免费)提升到1000M下行还有50M的上行,这时候,之前那随心所以的配置方法,就会让这只路由器的转发能力下降。于是我废了相当大的功夫(这文档写的十分隐晦,非常难读懂),进行了一番优化,终于还是能发挥出其全部性能,跑到900M也不是什么大问题。(包含一定的防火墙策略,不是简单的裸奔)

首先,还是上相关资料:

这个路由器非常的奇怪,Mikrotik提供了2个block-diagram,具体怎么翻译这个不好说,但从结果来看的话,我觉得可以翻译成“硬件拓扑图”

根据说明,这是禁用了“交换”时候的分布
这个是启用了“交换”时候的硬件分布

根据分布图,明显是启用“交换”的时候,能够发挥最大的性能,1个上行口,其余4个交换,那么对于CPU来说就是1Gb/s入,1Gb/s出,非常合理。

但是要怎么打开这个“交换”呢?产品页面里面没有任何说明……

于是经过一番苦苦搜索,我找到了第二个链接,里面介绍了一位前辈的操作过程,里面提到了一个很重要步骤:

Make sure the bridge is created without spanning tree enabled (ie, no STP/RSTP/MSTP) as the switch chip cannot handle that, and so using those features will force slow software switching. The default mode is RSTP, which will turn off hardware switching on several chipsets, including the RB750Gr3/hEX one.

你的bridge需要关掉STP。哈啊?这玩意不是默认打开的吗?于是我自己看来一下:

我丢,这玩意用的MT7621,由于不支持这些那些功能,所以呢,必须要关掉,否则的话,就会变成内核转发。我想我大概找到问题所在了。

规划

首先,重新规划好端口,按照1上行,4下行的方式划分端口,下行的4个接口都划分到同一个bridge,多子网的情况下,可以用vlan接口或者是做静态路由。

规划过程中有这几点需要注意(仅对于Ros v6有效,Ros v7有改进,可能有更多功能,但是由于是生产环境我暂时还不敢升级):

  • 建议只使用一个bridge,因为只有1个bridge能off-load到硬件
  • 不支持给没vlan标签的包加上vlan标签,即所有access口都只能在同一个vlan,和bridge(无vlan标签)处于同一个子网
  • 不能使用链路聚合
  • 不能使用QinQ

打开“交换”

调整交换机的配置,检查一下多余的功能是否都已经关闭,必要的功能都打开:

  • bridge的protocol-mode必须是none
  • bridge的igmp-snooping必须是no
  • bridge的dhcp-snooping必须是no
  • bridge的vlan-filtering必须是no
  • /interface bridge settings里面allow-fast-path必须是yes
  • /ip settings里面allow-fast-path必须是yes

配置示例

下面是一个示例的命令行:

/interface bridge
add name=local protocol-mode=none vlan-filtering=no
/interface bridge port
add bridge=local interface=ether2
add bridge=local interface=ether3
add bridge=local interface=ether4
add bridge=local interface=ether5
/interface bridge vlan
add bridge=local untagged=local,ether2,ether3,ether4 vlan-ids=1
add bridge=local tagged=local,ether4,ether5 vlan-ids=2
add bridge=local tagged=local,ether4,ether5 vlan-ids=3
/interface vlan
add interface=local name=guest vlan-id=2
add interface=local name=server vlan-id=3
/ip address
add address=192.168.1.1/24 interface=local
add address=192.168.2.1/24 interface=guest
add address=192.168.3.1/24 interface=server

以上是一个简单的示例,创建了一个bridge,2口和3口都是Access模式,划分到一个子网里面。4口是hybrid模式,没有vlan标签的包,会和2、3口处于同一个子网,同时,能够接受带vlan-id=2的包。5口也是Trunk模式,分别接受vlan2和vlan3的包。然后创建了2个vlan接口,“guest”、“server”。然后local、guest、server3个接口都配置了ip地址。

顺利的话,就能在/interface bridge port print里面看到行的开头有个H的标识,代表已经使用了硬件卸载。同时,系统日志里面也会有相关提示。

测速结果

J4125的小主机上分了1核心+1G内存的XP,跑了以上的测速结果,期间基本上没其他人同时用网。也基本上差不多了吧。

Ros V7更新

自从RouterOS v7.1rc5之后,MT7621(就是RB750Gr3所使用的CPU/交换芯片),更新了驱动,支持了vlan表,所以,可以给access口的包打标签了。另外的话,也提供了STP的硬件支持。

对比v6的设置,有这么一些不同:

  • bridge的protocol-mode可以是STP/RSTP/MSTP
  • bridge的igmp-snooping必须是no
  • bridge的dhcp-snooping必须是no
  • bridge的vlan-filtering可以是yes
  • /interface bridge settings里面allow-fast-path必须是yes
  • /ip settings里面allow-fast-path必须是yes

重点注意

根据观察和mikrotik的论坛报告,系统更新到了Ros V7之后,转发性能有所下降,根据我观察所得,基本上从之前的约800+Mbit/s下降到了600~700Mbit/s,感觉有点难受。

不过偶然间,我发现了一个油管视频:https://www.youtube.com/watch?v=bllvDWEKgNA,还有论坛里面的一些帖子:https://forum.mikrotik.com/viewtopic.php?p=959710#p959710,里面提到,这机器刷了OpenWRT之后,可以打开硬件转发,可以在跑满950+Mbit/s转发的情况下,99% CPU idle。就是说,如果Mikrotik继续开发,是可以将l3hw下放到这个小机器上的。不过……鬼知道要等到什么时候。

配置示例.v7

/interface bridge
add name=local protocol-mode=RSTP vlan-filtering=yes
/interface bridge port
add bridge=local interface=ether2
add bridge=local interface=ether3
add bridge=local interface=ether4
add bridge=local interface=ether5
/interface bridge vlan
add bridge=local tagged=local,ether5 untagged=ether2 vlan-ids=1
add bridge=local tagged=local,ether5 untagged=ether3 vlan-ids=2
add bridge=local tagged=local,ether5 untagged=ether4 vlan-ids=3
/interface vlan
add interface=local name=lan vlan-id=1
add interface=local name=guest vlan-id=2
add interface=local name=server vlan-id=3
/ip address
add address=192.168.1.1/24 interface=lan
add address=192.168.2.1/24 interface=guest
add address=192.168.3.1/24 interface=server

例子中,ether2、ether3、ether4均为access口,ether5为trunk口。划分了3个vlan,分别名字为lan、guest、server。

用smartdns来防治DNS污染

一直以来,我对dns查询受到污染的情况一直都比较苦恼。国内的DNS服务器基本上都是受污染的,而通过VPN直接去从国外的DNS服务器查询,则会获得为国外优化的结果,时常莫名奇妙就访问国外的网站,特别是一些有中国版和国际版区别的站点,诸如京东淘宝之流。

今天和在和朋友讨论dns查询的问题的使用,对方提到用tcp来进行dns查询,这就让我感到一些神奇。在拿8.8.8.8来进行过测试之后,我有了一个重大的发现。

使用tcp向8.8.8.8进行dns查询

8.8.8.8的tcp/53端口是开放的!而且有个很重要的特征!对于受屏蔽的域名,dns查询的会话会收到tcp rst导致中断,而未受屏蔽的域名,则可以正常查询。

那好说!只要找到一个DNS转发器,能支持用TCP来进行上行查询的软件就行了(当然,还有一个能用的梯子)。

最开始,我是打算用dnsmasq的按顺序查询,不过dnsmasq似乎不支持tcp查询,不得不放弃。然后又想起另外一个东西叫做smartdns的,能够使用tcp进行dns查询。那就好办。

思路是这样,现调整好vpn的路由。8.8.8.8不走vpn,8.8.4.4走vpn,然后smartdns配置server-tcp 8.8.8.8和server-tcp 8.8.4.4。这种情况下可以同时获得国内优化版和国际优化查询结果,这两者都是未经污染的,无需额外过滤。再由smartdns进行探测,得到访问速度最快的服务器(一般都是国内的)。搞定。

通过DHCP指定mtu

起因

家里的Proxmox母机开了VXLAN的SDN,但是由于vxlan隧道需要吃掉几十个字节作为包的头,导致vxlan的子网里面必须将mtu缩小至1450(母机之间互联用的是1500),但是每次开虚拟机就要手动改mtu这个非常的不友好。

在网上搜索手动指定mtu,文章全部都是使用静态的ip地址,在进一步搜索的时候,发现需要修改Linux的dhcpclient配置,在配置文件里面看到,在客户端发送dhcp请求的时候,是包含接口mtu信息的。

这样就有趣了。

那是不是DHCP服务器可以指定客户端的接口mtu呢?那就不需要我一个一个手动修改了。

进行一番搜索之后,果然发现DHCP里面指定了一个option 26,可以定义接口mtu。而RouterOS也支持自定义dhcp options,官方的wiki里面有关于option的写法。

开搞

配置过程中充满了曲折,我尝试在winbox里面添加option,根据教程,我尝试在value里面填入1400,报错,然后尝试填入0x5aa(1450的十六进制值),也不行。然后我发现,填值据然要加上单引号,于是填入‘1450’,过了。

然而事情并不顺利,我在客户端通过DHCP拿到一个奇怪的mtu,43525。当时我就蒙圈了,这啥情况?

于是我胡乱填了更多的值,得到了更多奇奇怪怪大的一批的mtu值。着实搞不明白,然后仔细看了一下winbox中给的rawvalue,看着怎么这么眼熟,好家伙,这不是把字节的顺序给反过来了吗!

本来应该是05 aa,结果变成了 aa 05

我再确认一下整个活

90000转成十六进制实际上是 01 5f 90,结果变成了 90 5f 01

确认之后,就可以根据需要的raw value反推需要填的值。我们需要 05 aa ,就将 aa 05转换成十进制,得出43525,填入之后得到正确的raw value。

得到正确的raw value。

经测试,能够正常获取到1450的mtu。

报告Bug

这明显是有问题啊,我就去给mikrotik提了个请求,得到回复说马上就修。

mikrotik确认了这个故障,说准备修复。

继续阅读官方wiki

后来仔细阅读了一下官方的wiki,里面提到确实可以用0x来输入十六进制的值,也不用用单引号括住。那为啥我输入0x5aa报错?再来一次的时候发现……0x05aa是完全没问题的,但是0x5aa就不行。

开头的0不能省略

看着顺眼多了。后续等官方修复这个Bug之后或许可以换回去’1450’,这样就更直观了。

openwrt 国内镜像源

原文:https://mirrors.tuna.tsinghua.edu.cn/help/openwrt/

由于某些众所周知的原因,openwrt直接从国外源下载的时候通常都会出现缓慢,短线之类的情况。清华大学的同学十分友好地建立了软件源,如此一来,软件的安装就变得友好了很多~

原文可能是由于字符之类的原因导致命令明显的不对,稍作修正,就得到下方的命令:

cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.backup
sed -i 's/downloads.openwrt.org/mirrors.tuna.tsinghua.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf

完了之后就可以十分愉快地安装软件包了~

在openwrt路由上运行shairplay作为远程音箱

参考:

  1. https://blog.csdn.net/luotong86/article/details/53207387
  2. https://zhuanlan.zhihu.com/p/103121214

因为手里空闲着一条漫步者的M16,现在我又用着iPhone,就想尝试一下airplay,没想道意外的简单,这里做个简单的记录。

首先,使用opkg更新软件包缓存

opkg update

然后,安装kmod-usb-audio:

opkg install kmod-usb-audio

这将安装usb声卡的驱动,如无意外,就可以看到/dev/audio的出现,这意味着系统能够正常识别到声卡。如果没认出来,那可能是系统尚不支持声卡,推荐换一只,毕竟重新移植驱动这种事情还是比较麻烦的,如果官方没有Linux驱动那就更没希望了。

下一步就是安装shairplay:同样非常简单,因为有对应的luci管理界面,顺便装上。

opkg install luci-app-shairplay

接着就可以去网页进行管理了:

这里只要简单的修改一下Airport Name,AO Driver选择alsa,然后勾选上enabled,保存并应用即可。

下一步就能在播放器上选择Airport后,点击播放就能听到音箱响起来啦~

RouterOS上抵挡扫描的防火墙策略

背景

因为家里的宽带是找电信要了公网IP地址的,所以互联网可以直接访问到我作为出口的RouterOS,而众所周知,互联网上扫描机不知何几,被盯上了的话也是一件相当麻烦的事。

起因

之前在玩RouterOS上的防火墙的时候,发现有一个动作,叫做“add src to address list”,能够将包的源地址添加到某个列表中。俺寻思了一下,发现这能够很好的抵挡扫描机,思路是这样的:

防火墙策略

建立防火墙策略,指定一些经常被扫描的目的端口,然后,防火墙的动作是将包的源地址添加到一个叫做sniffer的地址列表中,设定有效时间为30天,然后,让防火墙直接丢弃来自这些地址的包,这样如果某个机器尝试扫描我的出口,触发了这个机制,那这个机器就会直接被ban掉30天。

命令行的话,添加起来是这样的:

/ip firewall filter add action=drop chain=input comment="drop sniffer" in-interface=China-Telecom src-address-list=sniffer
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=22,23,876,3306,3389,137,139,445,5001,6379,27017 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=tcp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=22,23,876,3306,3389,137,139,445,5001,6379,27017 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=udp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=2323,5555,80,81,37215,8000,8080,8081,8291,8443,53 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=tcp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=2323,5555,80,81,37215,8000,8080,8081,8291,8443 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=udp
/ip firewall filter add action=drop chain=input comment="drop sniffer" in-interface=China-Telecom src-address-list=sniffer

然后放着一阵子,就会在address list里面看到大量的IP地址。

继续改进

如果想要更加全面的保护,可以选择在防火墙上添加允许一些正常的策略,比如说,允许每秒不超过20个echo-request的icmp包啊之类的,然后在防火墙的末尾,加一条策略,将其他未知的包,都当作扫描机处理,一律有杀错无放过。

但是有时候,ban了对方的ip,也就意味着无法访问对方的IP地址,因为回包会被防火墙丢弃。这时候就要额外的添加一条策略,插在丢弃sniffer的策略的前面:

action是accept就可以了。这样如果是主动对外访问的话,回的包要么是related,要么是established,这样就可以正常访问被ban掉的ip。至于说udp访问可能没有这个状态标记……先暂时忽略吧,出现问题再继续改进。