Openwrt 软硬路由踩坑补遗

很久没有折腾Openwrt系统了,最近有专用设备需要使用透明代理,又想到把垃圾堆里的塑料玩具如Netgear、TPlink拿出来刷机。试了一批设备,出现了一些新问题,在踩了大量的坑以后,写下这一篇内容:

由于当前主流隧道协议已经进行了升级,而数年前的设备难以支持aes-256-gcm的计算。对于大部分便宜的家用路由设备,基本上就是塑料玩具的水平。刷了openwrt后,普遍存在这些问题:

  • 加解密性能差,没有AES指令集支持
  • 高并发连接性能差
  • 无线网环境速度更慢

经实测百兆专线上跑的aes-256-gcm 在塑料路由上表现差,经常卡顿,断流,速度缓慢,负载飙到1.0以上。

当前的分流策略也多采用Ipset等,但是一旦出现高并发连接(比如大量载入小型图片),又会出现卡顿断流的问题。

另外IPV6可能存在一些问题。我这边已经解决了DNS的问题,能提供一路干净的DNS,但是开启了IPV6后仍然有被污染的DNS流入。按照网上的教程关闭IPV6后问题消失。

解决问题的办法一个是扔进垃圾堆,或者挂在X86软路由上当AP,另一个是用unsafe的算法来减轻计算负担。在没有AES支持的芯片条件下,可以选用rc4-md5或者chacha20,当然还得走专线。(没有AEAD的情况下直接使用非常危险)

实测换了算法后速度提升了一些,聊有安慰。但没解决问题。下面就是重点:

软路由跑X86 Openwrt 的实践和各种问题

看了网上各种乱七八糟的教程,可以说错误百出,而且我觉得既然都用了软路由X86了,就不要过于吝啬服务器资源,不要一个虚拟机(VPS)做很多事。

下面说下我的实验架构:

X86服务器配双网卡,其中一个接入WAN,一个作为接入AP的LAN端口。

虚拟化Hyper-V虚拟化(其他虚拟化也可以,这里为了简单用Hyper-V代替),Openwrt版本选择最新版22.03.20。

开两个虚拟机,一个openwrt,一个用来清洗DNS,跑Ubuntu+smartdns或adg,这样DNS问题就解决了,不需要这个依赖那个,那个又依赖这个…

第一个坑:虚拟交换机

虚拟交换机问题多。在双网卡模式下,不少人直接开了两个虚拟交换机,都设为外部(External),一个接WAN,一个接LAN,这样也不是不行,就是第二个物理网卡(插LAN端口)但是这样“网桥”就显得无意义了,会造成一些额外的麻烦(有时op要求一定要把eth-lan注册成bridge)。而且这样的话,从服务器面板上看容易混淆,在以后操作中出现误操作等情况。

最简单的办法是设置三个虚拟交换机:

第一个是原先的默认的外部网络(服务器自身上网用的WAN口),桥接所有虚拟机,包括提供DNS服务的ubuntu。

再建一个Switch2,类型为内部网络(虚拟机专用),一会在OP内部作为网桥使用。

Switch3,外部网络,绑定第二张网卡,作为虚拟机的LAN口使用。记得取消“允许管理操作系统共享此连接”的选项,把这个网口作为专用给该op虚拟机使用的LAN口。

开机启动后直接按照原来的办法配置(可以先配置两个卡),直到你进LUCI后,到LAN口设置,把“eth2(虚拟交换机-内部专用)和 eth3(虚拟交换机-外部-准备用作LAN口的那个网卡)桥接,作为br-lan使用即可。注意IP地址不要冲突。

这样从服务器的面板上就看不到网卡2的虚拟网卡了,只能看到网卡2的物理接口,这个LAN口插上线或者AP就应该可以用了。

第二个坑:网卡bug

但是还没完! Broadcom的坑还等着呢。

Broadcom NetXtreme Gigabit Eth 这款网卡(可能还有其他博通的产品)存在固件bug,如果网卡开启了“虚拟机队列”服务,会出现bug导致网络很慢,卡顿和掉线…

开始搞了半天,以为是其他问题,拆了装装了拆,后来发现是bug… 禁用“虚拟机队列”后,立即正常了…

禁用虚拟机队列

这样一个软路由就做好了,速度飞快,接下来当然是要折腾ss… 嗯,软路由有AES了,速度会快很多,查找IPSET也不在话下。

现在ss也容易极了,直接在luci的software里搜索就能安装了,装好了自己玩吧。这里说几个新情况:

China IP LIST的问题

openwrt没有带sftp,但22版的固件已经允许直接从网页上传.txt格式的IP列表了。

默认位置是在 /etc/shadowsocks-libev ,如果要用wget命令直接从apnic上fetch,也就直接fetch到这里好了。

wget -O /tmp/delegated-apnic-latest 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' && awk -F| '/CN|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' /tmp/delegated-apnic-latest > /etc/shadowsocks-libev/chinaip.txt

然鹅,不管叫啥名字,存到目录下都还必须在这个页面上点选一下,选中了才能生效…

我的策略是默认代理,exclude china IPs,反正性能无所谓了…

DNS的问题

我看了很多文章,在openwrt里又是装smartdns,又是装adg的,就不嫌累吗… 虽然是X86的性能用不完,隔壁开个虚拟机跑这些不香么… 都开在op里面互相依赖(比如ss-redir要求ss如果用域名形式必须能解析到才能运行,不然直接失败),还有这几个程序本身怎么与代理的关系都成问题…

所以隔壁起一个Ubuntu虚鸡,OP从这个机器里取DNS,这个机器里可以安排smartdns有较大的缓存时间。现在OP还支持向客户端推送custom DNS server,也就是DNS不一定非要推送OP自己的地址,直接给客户端推smartdns服务器的地址吧,这样还省了缓存频繁过期。

发表回复

您的电子邮箱地址不会被公开。