前言
大部分旁路由方案都是基于 OpenWRT 搭建 —— 这是一个单独的 Linux 发行版,拥有自己的软件包系统。再其中大部分方案又是基于 LuCI —— 专用于 OpenWRT 的 Web GUI,教程中使用的软件也是 luci-app-xxx,专为 LuCI 打造。这些方案很好,但不够好:
- 过于依赖 GUI 配置: LuCI 的软件包通常在 web 端只能进行有限的配置
- LuCI 不够稳定: 不是 OpenWRT 不稳定,而是 LuCI 不稳定。我的 LuCI 曾因为 OpenClash 崩溃过三次(也可能是我的问题)
- 尽管我们可以自编译 OpenWRT,但是大部分教程都直接使用了一些预编译好的固件,有些可能会过时
- 无法完全掌控系统(被 LuCI 架空啦
我也曾经折腾过一两年的 OpenWRT 透明代理方案,主路由方案旁路由方案,最终都因为其不够稳定而放弃。很长一段时间都直接使用各种客户端(Surge、loon、clash verge rev 等)勉强用着。大概一周前,绝区零上线。由于国服版号问题,PS5 仅上线了国际服。即使选择亚服,勉强可以直连,网速和延迟也让人绝望。本着不给网易 UU 送钱的态度,我又想起了透明代理。正好,我手头有一台闲置的零刻小主机。预先装好了 Debian,本来打算用来做开发机来着,结果因为我太懒,也一直吃灰。于是折腾了一个周末,最终完成了使用 Debian 作为旁路由进行透明代理的方案。
最终形态的网络拓扑如下:
可以看到,整个内网被划分成了两个网段:192.168.6.0/24,192.168.7.0/24。其中 6.0/24 为默认网段,用于无需越墙的设备,而 7.0/24 为需要越墙的设备,其流量都会经过旁路由小主机转发。
主要方案为 AdguardHome + Clash,其中 AdguardHome 用于广告过滤等功能,Clash 用于 DNS 分流和流量代理。
主路由配置
在配置之前,内网 IP 段为 192.168.6.0/24,我们需要新开一个网段 192.168.7.0/24
我的主路由是 iKuai,下面是 iKuai 新开网段的方法,OpenWRT 或者其他路由系统可以自行 Google
iKuai 下网络设置 - 内外网设置 - lan1,高级设置中添加一个扩展 IP,IP 为 192.168.7.1,子网掩码 255.255.255.0
DHCP 设置中添加一个 192.168.7.0/24 网段的 DHCP 配置
网关设置为 192.168.7.2,即后面要配置的旁路由的地址,首选 DNS 和备选 DNS 也都设置为 192.168.7.2,因为该网段下的 DNS 都由旁路由处理。
Debian 配置
以下操作如果不做说明,都是在旁路由机器上进行。
配置 IP
编辑 Debian 的网络配置:输入 代码登录后可见,编辑为以下内容,并保存退出:
代码登录后可见
该配置中:
保存配置后可以通过如下命令重启网络
代码登录后可见
注意这个时候 SSH 连接可能会断开,因为设备 IP 已经改变了。应当通过新的 IP 代码登录后可见 重新 SSH 登陆。
代码登录后可见 查看配置结果:
代码登录后可见
可以看到本机的内网 IP 已经变成了 192.168.7.2/24
配置转发
只有拥有流量转发功能的机器才可以作为路由和网关:
代码登录后可见
AdguardHome 配置
以下说明下 DNS 思路
当客户端需要解析 DNS 时,监听在 53 端口上的 AdguardHome 会转发给其上游 Clash,然后 Clash 根据设置来进行分流,中国大陆部分使用国内的公共 DNS 服务器进行解析,非中国大陆部分通过代理向国外公共 DNS 服务器进行解析
而当 Clash 出现异常时,AdguardHome 则直接向国内公共 DNS 服务器请求解析(实际上意义不大,即使解析出来的 IP,流量还是要通过 Clash)
安装 AdguardHome
以下命令以 root 身份运行
代码登录后可见
创建服务
创建工作目录 代码登录后可见
代码登录后可见
创建 代码登录后可见 如下,这时配置文件为 代码登录后可见
代码登录后可见
保存后通过 代码登录后可见 设置开机启动并立刻启动。后续如想查看日志,我们直接使用 Debian 自带的工具来查看:
代码登录后可见
如果想要重启:
代码登录后可见
初始化配置
打开 代码登录后可见 进行初始化配置,网络管理界面端口可以保持 3000,DNS 服务器端口设置为 53
设置 - DNS 设置中,上游 DNS 设置为我们暂未配置的 Clash DNS 代码登录后可见,后备 DNS 服务器可以填写几个国内的 DNS,如
代码登录后可见
记得点击应用
随后 DNS 服务配置-速度限制 设置为 0 即可。
如果需要去广告的话,可以在 过滤器 - DNS 黑名单 中添加,这里推荐两个大陆使用效果较好的规则集:
代码登录后可见
Clash 配置
Clash 在整个方案中负责国内外 DNS 解析分流,另外就是老本行穿墙了。由于 Clash 原仓库已删库跑路,衣钵由 mihomo 集成(米哈游你坏事做尽)
安装 Clash
以下命令以 root 身份运行:
代码登录后可见
创建服务
创建工作目录 代码登录后可见
代码登录后可见
创建用户 clash
代码登录后可见
创建文件 代码登录后可见,内容如下。这时 clash 的配置文件为 代码登录后可见。
代码登录后可见
可以从这个文件中看到,clash 二进制文件是以 clash:clash 用户身份运行的,这是为了方便区分 clash 自身程序发出来的流量,和 clash 转发的流量。
注意到 ExecStartPost 和 ExecStopPost 阶段我们执行了两个文件 iptables.sh 和 clean.sh,用来设置和清空路由表。
iptables.sh 内容如下:
代码登录后可见
每行都有详细的注释,再细节可以去问 ChatGPT
clean.sh 内容如下
代码登录后可见
clash 配置文件
clash 配置文件可以从各订阅商处获得,格式应当是 yaml。将其保存到 代码登录后可见,并将其按照如下模块更改:
代码登录后可见
这里着重说一下 dns 部分,dns 分成了两个 dns server 组:
- nameserver 部分为国内的公共 DNS
- fallback 部分为国外的公共 DNS
fallback-filter 控制了当域名满足什么条件时,使用 fallback 组的 DNS 解析结果
- geoip-code 为反向条件,即通过 nameserver 解析出的 IP 未命中 geoip-code 则会使用 fallback 的解析结果
- geosite 为正向条件,匹配 geosite 中的域名会使用 fallback
- ipcidr 为正向条件,nameserver 解析出这些结果时(即污染 IP)则会使用 fallback 的解析结果
- domain 为正向条件,匹配到这些域名则会直接使用 fallback
由此即完成了 DNS 解析的分流。
clash 的其他相关文件
clash 还需要一些配套文件,在启动前需要先下载下来
代码登录后可见
最终 代码登录后可见 目录下应当是这样的
代码登录后可见
由于 clash 程序以 clash 用户身份启动,所以需要更改下所有权:
代码登录后可见
并设置 iptables.sh 和 clean.sh 可执行
代码登录后可见
服务启动
完全配置好以后,我们可以设置 代码登录后可见 为开启自动启动,并立即启动起来。
代码登录后可见
后续如想查看日志,我们直接使用 Debian 自带的工具来查看:
代码登录后可见
访问 webui:代码登录后可见
webui 的配置大家就很熟悉了。如果配置完成没啥问题,就可以将本机的 dns 改为 127.0.0.1 了(上文提到),并将内网设备的网关和 DNS 都指向 192.168.7.2