正常的客户端上网流程:
客户端 => 路由器 => 互联网
加上旁路由后,流程变成:
客户端 => 旁路由(透明) => 路由器 => 互联网
客户端的 DNS 和网关的 IP 都指向旁路由,流量由旁路由转发。
使用树莓派做旁路由,Clash 安装在树莓派上,树莓派运行的系统是 Debian。
Clash 开启透明代理:
redir-port: 7892
bind-address: '*'
allow-lan: true
tun:
enable: true
stack: system
dns-hijack:
- any:53
auto-redir: true
auto-route: true
auto-detect-interface: true
如果使用 eBPF
,需要关闭 auto-route
,手动指定接口为 eth0
:
tun:
enable: true
stack: system
dns-hijack:
- any:53
auto-redir: true
auto-route: false
auto-detect-interface: false
ebpf:
redirect-to-tun:
- eth0
interface-name: eth0
routing-mark: 0x233
国内网络对于 UDP 流量并不友好,建议禁用 QUIC
协议,使其自动回退到 HTTP/2
,配置如下:
script:
shortcuts:
quic: network == 'udp' and dst_port == 443
rules:
- SCRIPT,quic,REJECT
配置 Dashboard 界面,方便查看日志:
cd /usr/local/etc/clash
git clone -b gh-pages --depth 1 https://github.com/Dreamacro/clash-dashboard dashboard
修改 Clash 的配置文件 config.yaml
:
external-controller: 0.0.0.0:9090
external-ui: dashboard
Dashbaord 的访问地址: http://172.30.30.254:9090/ui
修改配置后需要重启 Clash 使配置生效:
sudo systemctl restart clash
Debian 开启 IPv4 的数据包转发 /etc/sysctl.conf
:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
使用 nftables 配置转发规则,先安装:
sudo apt install nftables
配置转发规则 /etc/nftables.d/clash.nft
:
#!/usr/sbin/nft -f
flush ruleset
define lan = {
10.0.0.0/8,
172.16.0.0/12,
192.168.0.0/16
}
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
}
}
/etc/nftables.conf
的内容如下:
#!/usr/sbin/nft -f
flush ruleset
include "/etc/nftables.d/*.nft"
把 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 的。
树莓派网卡不支持硬件分流(offloading):
sudo apt install ethtool
查看网卡信息:
$ sudo ethtool -k eth0
tcp-segmentation-offload: off
tx-tcp-segmentation: off [fixed]
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp-mangleid-segmentation: off [fixed]
tx-tcp6-segmentation: off [fixed]