正常的客户端上网流程:
客户端 => 路由器 => 互联网
加上旁路由后,流程变成:
客户端 => 旁路由(透明) => 路由器 => 互联网
客户端的 DNS 和网关的 IP 都指向旁路由,流量由旁路由转发。
使用树莓派做旁路由,Clash 安装在树莓派上,树莓派运行的系统是 Debian。
Clash 开启透明代理:
redir-port: 7892
修改配置后需要重启 Clash 使配置生效:
sudo systemctl restart clash
Debian 开启 IPv4 的数据包转发 /etc/sysctl.conf
:
net.ipv4.ip_forward = 1
使用 nftables 配置转发规则,先安装:
sudo apt install nftables
配置转发规则 /etc/nftables.conf
:
#!/usr/sbin/nft -f
flush ruleset
define lan = {
0.0.0.0/8,
10.0.0.0/8,
127.0.0.0/8,
169.254.0.0/16,
172.16.0.0/12,
192.168.0.0/16,
224.0.0.0/4,
240.0.0.0/4
}
table ip nat {
chain proxy {
ip daddr $lan return
ip protocol tcp redirect to :7892
}
chain prerouting {
type nat hook prerouting priority 0; policy accept;
jump proxy
}
}
把 tcp 转发给 Clash 代理,这样所有流量都可以被 Clash 的规则所控制。
开启 nftables 服务(如果需要):
sudo systemctl enable nftables
启动 nftables 服务:
sudo systemctl start nftables
树莓派上的旁路由配置已经完成了,还需要修改路由器的 DHCP 配置,使分发给客户端的 DNS 和网关的 IP 是树莓派的地址。
我的路由器是 OpenWRT 系统,配置 DHCP 下发的网关和 DNS 为旁路由的地址(10.2.2.254):
Interfaces » LAN » DHCP Server » Advanced Settings » DHCP-Options
3,10.2.2.254
6,10.2.2.254
另外,还需要禁用 IPv6,因为 Clash 和树莓派的配置都是 IPv4 的。