Ubuntu 配置为旁路由实现透明代理(Clash)
下面几乎所有操作都需要sudo

开启IP转发
vim /etc/sysctl.conf
去掉net.ipv4.ip_forward=1 这一行的注释,然后执行下面命令启用当前配置

sysctl -p
配置iptables
iptables -t nat -N clash
iptables -t nat -N clash_dns

这个是fake-ip对应的dns地址,一般不用动

iptables -t nat -A PREROUTING -p tcp --dport 53 -d 198.19.0.0/24 -j clash_dns
iptables -t nat -A PREROUTING -p udp --dport 53 -d 198.19.0.0/24 -j clash_dns
iptables -t nat -A PREROUTING -p tcp -j clash

让当前机器成为一个网关服务器

iptables -t filter -A FORWARD -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j MASQUERADE

这里需要注意的是,下面两行最后的 192.168.2.101 是当前旁路由的 IP 地址,请根据你自己的实际情况修改

目的DNS端口是后面clash配置里面的5354

iptables -t nat -A clash_dns -p udp --dport 53 -d 198.19.0.0/24 -j DNAT --to-destination 192.168.2.101:5354
iptables -t nat -A clash_dns -p tcp --dport 53 -d 198.19.0.0/24 -j DNAT --to-destination 192.168.2.101:5354

绕过一些内网地址,(RETURN 表示退出当前Chain,返回到上一级的Chain继续匹配)

iptables -t nat -A clash -d 0.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 169.254.0.0/16 -j RETURN
iptables -t nat -A clash -d 172.16.0.0/12 -j RETURN
iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
iptables -t nat -A clash -d 224.0.0.0/4 -j RETURN
iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN

注意, 这边的7892对应后续clash配置里的redir-port

iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7892
执行以上命令之后iptables就配置好了,但是重启机器上面的配置又会失效,这时需要安装iptables-persistent来实现iptables配置的持久化。

手动保存配置 iptables-save > /etc/iptables/rules.v4
手动从文件加载配置 iptables-restore /etc/iptables/rules.v4
安装Clash
wget https://github.com/Dreamacro/clash/releases/download/v1.3.0/clash-linux-amd64-v1.3.0.gz

解压并且把二进制文件放到 /usr/bin ,并且加上可执行权限

gzip -d clash-linux-amd64-v1.3.0.gz
sudo mv clash-linux-amd64-v1.3.0 /usr/bin/clash
sudo chmod +x /usr/bin/clash
创建clash配置

创建文件夹

mkdir -p ~/.config/clash
cd ~/.config/clash
vim config.yaml
输入下面基本配置

一般情况只需要往Proxy后面加节点就可以

port: 7890
socks-port: 7891
redir-port: 7892
allow-lan: true
mode: Rule
log-level: info
dns:
enable: true
ipv6: false
# 其中 53, 5353端口经常是被占用的
listen: 0.0.0.0:5354
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:

- '192.168.2.1'

下面部分则是代理的设置跟规则的设置,这里忽略不写。

Proxy:

...

如果需要校验配置文件是否合规,可以运行clash -t, 成功的话程序会输出”successful”字样。

配置clash服务
vim /etc/systemd/system/clash.service
添加内容

[Unit]
Description=clash daemon

[Service]
Type=simple
User=YOUR USER NAME
ExecStart=/usr/bin/clash -d /home/{{YOUR_USER_NAME}}/.config/clash/
Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl start clash.service
systemctl enable clash.service
设置客户端默认网关
在路由器上设置默认网关为旁路由的IP
修改自己电脑的网络配置,设置静态IP,默认网关为旁路由的IP
DNS设置为198.19.0.1(上面已经配置了假IP的转发)
255.255.255.0
常见问题

  1. 运行clash的机器上不了网
    刚配置好之后,旁路由的网关还是采用默认的网关,例如路由器的IP为192.168.2.1,旁路由的IP为192.168.2.101,原本默认的网关是192.168.2.1,后来在路由器的管理界面把默认网关改为192.168.2.101(即旁路由IP),设置完不会马上同步到所有设备,过一会儿旁路由更新了,从主路由器里获取到网关为192.168.2.101,由于这个IP是自己,导致发送网络请求的时候发给了自己,一直死循环了。

ssh远程过去旁路由,ip route看看当前的路由配置

default via 192.168.2.101 dev eth0 src 192.168.2.101 metric 202
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.101 metric 202
查看当前设备IP

ip address
得到IP信息:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
   valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
   valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

link/ether b8:27:eb:41:4b:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.2.101/24 brd 192.168.2.255 scope global eth0
   valid_lft forever preferred_lft forever
inet6 fe80::50e0:43d3:b9f4:c7d6/64 scope link
   valid_lft forever preferred_lft forever

3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000

link/ether b8:27:eb:14:1e:d9 brd ff:ff:ff:ff:ff:ff

4: ip_vti0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1000

link/ipip 0.0.0.0 brd 0.0.0.0

5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default

link/ether 02:42:52:a5:42:48 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
   valid_lft forever preferred_lft forever

由此可见,旁路由的网关为192.168.2.101,其实是自己。这时只要修改一下旁路由的网关就好了,也是用ip route命令

ip route add default via 192.168.2.1

  1. 通过 ip route 设置网关过一会儿失效
    不同的设置不同系统都有各自的持久化保存的方法,这里简单列举几个

1) 树莓派 raspberrypi os

echo 'ip route add default via 192.168.2.1' > /etc/dhcpcd.exit-hook
2) Ubntu 20.04 Server

修改 /etc/netplan/ 里面的yaml配置,

eth0:

dhcp4: true
dhcp4-overrides:
    use-routes: false
gateway4: 192.168.2.1

标签: none

评论已关闭