前言
我宿舍原先的网络环境是这样的,一台最新原厂固件的红米 ac2100 作主路由,一台 n1 刷入了 flippy 的 openwrt(版本很旧,大约是 54+o)作为透明代理(又称旁路网关、旁路由),本来本着能用就不动的原则,虽然一直有小毛病,但只是偶尔折腾一下,没解决又放弃了。
问题描述
但是这两天,碰到了一个非常难以忍受的问题,即一些国内网站,例如京东、淘宝、知乎、百度(这个无所谓)无法访问,一些国内网站例如 b 站以及外网则是可以访问的,初步判断应该是分流出了问题,例如本来访问京东、淘宝应该是直连而而非走代理,但实际上走了代理,因此无法访问。
还有一个可能是和使用 n1 作为透明代理有关,恩山上有许多相关的讨论帖,即使用 n1 作为旁路网关之后,国内网站加载缓慢或者干脆无法访问,一般的解决方法分为两步:
- LAN 口取消桥接;
- 防火墙自定义规则处添加
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
其中第一步是没有问题(但似乎没有必要),但注意取消桥接时勾选 eth0
,不能选择 wifi
;而第二步其实有一定问题的,这行代码的功能是对转发的数据包进行 NAT 处理,将经过旁路由的数据包的源 ip 修改为旁路由自身,从而解决某些主路由的对数据来源和去向的校验问题(例如小米的路由器),但这样一来所有数据包都会经过旁路网关。具体分析见 关于旁路由设置后,主路由WIFI无法上网的问题
理想情况应该是:
对于普通流量,由于旁路由不修改任何内容,我们期望旁路由只转发上行数据,而下行数据由主路由直接发送给主机。对于需要代理的流量,则下行数据也得交给旁路由处理,然后才能转发给主机。
旁路网关的防火墙添加
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
会导致普通流量也进行 NAT 处理,并且上行,下行流量都会经过旁路由,还多了两次 NAT。
解决办法
对于主路由为小米官方固件的情况,其实只需要在 DHCP 的参数页,设置一个或两个 DNS 为非 192.168.31.1
(小米路由器默认 ip)即可,例如设置为 119.29.29.29
,然而红米 ac2100 不支持设置,无奈,只好刷成 padavan 了。
ac2100 刷入 padavan
首先参照该 恩山帖子 通过 url 注入方式刷入 breed。
成功后拔掉电源,按住 reset 同时接上电源等 $10$ 秒即可进入 breed,电脑通过网线连接路由器,浏览器中输入 192.168.1.1
即可进入 breed 的网页端,下载 hiboy 的最新的适配红米 ac2100 的 pandavan 固件,通过 breed 网页端上传并刷入固件,即可将 ac2100 刷成 padavan。
刷为 padavan 之后,进入 n1 的 openwrt 界面删除防火墙自定义规则中的 iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
也不会影响访问网络(pandavan 的 DHCP 设置并没有添加自定义的 DNS),看起来 padavan 可以自动识别出旁路网关模式。
但是,京东、知乎等国内网站还是无法访问,并且,当我关闭 n1 的 openclash 之后,就可以访问了,因此,可以确定问题出在了 openclash 上。
升级 n1 的 openwrt
我的 openclash 一开始是使用的 clash 默认内核,fakeip 模式,于是我切换成了 meta 内核,但依旧使用 fakeip 模式,考虑到这个 openwrt 很旧了,于是我利用晶晨宝盒,升级了 openwrt 为 83+o。
利用 openwrt 的文件传输功能上传固件压缩包到 n1 的
/tmp/upload
目录,然后晶晨宝盒处点击升级即可。
关闭浏览器安全 DNS 功能
更新了之后,还是不行,然后我注意到 openclash 提醒关闭浏览器的安全 DNS 功能,否则会影响 openclash 的分流功能,于是,我关闭了 firefox 的安全 dns 功能,果然 ok 了。
更新 openclash 的 GEOIP 等规则
虽然京东等国内网站能访问了,但还有一个问题,qq 的图片、表情加载不出来,之前我在 tg 的 n1&openwrt 交流群里,询问了这个问题,就有群友让我更新 openclash 的 GEOIP 数据库,以及大陆白名单,更新了之后就好了。
旁路网关设置方法
最后,这里再添加一下旁路网关的设置方法,以 n1 的 openwrt 为例,我这里是指定设备才使用旁路网关
- 在
网络 -> 接口
的常规设置
中,给 openwrt 的 LAN 网络接口一个与现有局域网段同网段的静态 ip 地址,例如(192.168.123.68
,注意不要与现有设备的 ip 冲突),然后应用设置; - 将 LAN 网络接口的
默认网关
设为主路由的 IP 地址; - 在
高级设置
中找到使用自定义的 DNS 服务器
,将 DNS 设为主路由的 ip 地址; - 在
DHCP 服务器
中勾选忽略此接口
; - 在
DHCP 服务器 -> IPv6 设置
中禁用所有 IPv6 服务; - 点击
保存
以及保存并应用
; - 在
防火墙
中,关闭SYN-flood
防御,点击保存并应用
;
可以看到,不需要取消桥接,更不需要添加那一条指令(指令是否需要添加取决于主路由)。