N1 刷入 openwrt 作旁路网关的一些杂事

发布时间 2023-07-27 14:04:44作者: zwyyy456

前言

我宿舍原先的网络环境是这样的,一台最新原厂固件的红米 ac2100 作主路由,一台 n1 刷入了 flippy 的 openwrt(版本很旧,大约是 54+o)作为透明代理(又称旁路网关、旁路由),本来本着能用就不动的原则,虽然一直有小毛病,但只是偶尔折腾一下,没解决又放弃了。

问题描述

但是这两天,碰到了一个非常难以忍受的问题,即一些国内网站,例如京东、淘宝、知乎、百度(这个无所谓)无法访问,一些国内网站例如 b 站以及外网则是可以访问的,初步判断应该是分流出了问题,例如本来访问京东、淘宝应该是直连而而非走代理,但实际上走了代理,因此无法访问。

还有一个可能是和使用 n1 作为透明代理有关,恩山上有许多相关的讨论帖,即使用 n1 作为旁路网关之后,国内网站加载缓慢或者干脆无法访问,一般的解决方法分为两步:

  1. LAN 口取消桥接;
  2. 防火墙自定义规则处添加 iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

其中第一步是没有问题(但似乎没有必要),但注意取消桥接时勾选 eth0,不能选择 wifi;而第二步其实有一定问题的,这行代码的功能是对转发的数据包进行 NAT 处理,将经过旁路由的数据包的源 ip 修改为旁路由自身,从而解决某些主路由的对数据来源和去向的校验问题(例如小米的路由器),但这样一来所有数据包都会经过旁路网关。具体分析见 关于旁路由设置后,主路由WIFI无法上网的问题

R8xwbf9go5Wt7kY

理想情况应该是:

对于普通流量,由于旁路由不修改任何内容,我们期望旁路由只转发上行数据,而下行数据由主路由直接发送给主机。对于需要代理的流量,则下行数据也得交给旁路由处理,然后才能转发给主机。

旁路网关的防火墙添加 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 为例,我这里是指定设备才使用旁路网关

  1. 网络 -> 接口常规设置 中,给 openwrt 的 LAN 网络接口一个与现有局域网段同网段的静态 ip 地址,例如(192.168.123.68,注意不要与现有设备的 ip 冲突),然后应用设置;
  2. 将 LAN 网络接口的 默认网关 设为主路由的 IP 地址;
  3. 高级设置 中找到 使用自定义的 DNS 服务器,将 DNS 设为主路由的 ip 地址;
  4. DHCP 服务器 中勾选 忽略此接口
  5. DHCP 服务器 -> IPv6 设置 中禁用所有 IPv6 服务;
  6. 点击 保存 以及 保存并应用
  7. 防火墙 中,关闭 SYN-flood 防御,点击 保存并应用

可以看到,不需要取消桥接,更不需要添加那一条指令(指令是否需要添加取决于主路由)。

参考

关于旁路由设置后,主路由WIFI无法上网的问题

openwrt旁路由网关模式无法访问国内网站的疑问(实测跟主路由型号有关)

Openwrt 作为旁路网关(不是旁路由、单臂路由)的终极设置方法,破解迷思