距离上一篇介绍该主题的文章已经过去了接近三年,[Clash 作为网关的透明代理]({% post_url 2020-11-27-clash-transparent-proxy %})
中间使用到的方案其实多次变更,例如使用了很长一段时间
的 shellclash,这个方案胜在省心,可以直接在支持的
路由器上部署,但是内核更新缓慢,作者对配置加了很多自定义设置,虽然出发点是为了方便大部分小白用户,但是
严重降低了自定义的能力。而且默认的一些设定大概率会导致 DNS 泄漏问题,关于这个话题可以参考
不良林的相关视频。这是不可接受的,因此前段时间又回归到使用
PVE 上虚拟机的方案。
简单摸索了一下最新方案发现 redir-host
模式已经被 Clash 官方放弃,不建议再使用。 TProxy
模式当然
没啥问题,但是毕竟得自己处理 iptables 规则。在没有性能瓶颈的情况下,更推荐使用 tun
模式,可以自动
处理路由等问题。下面简单介绍一下相关配置。
首先,在网关机器上打开 ipv4 转发, echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p
其次 Clash 配置文件头部添加如下
tun:
enable: true
stack: system # or gvisor
#dns-hijack:
# - any:53
# - tcp://any:53
auto-route: true
auto-detect-interface: true
dns:
enable: true
ipv6: false
listen: 0.0.0.0:53
enhanced-mode: fake-ip # redir-host or fake-ip
fake-ip-range: 198.18.0.1/16 # Fake IP addresses pool CIDR
use-hosts: true # lookup hosts and return IP record
nameserver:
- 114.114.114.114
最后在局域网的 DHCP 服务器设置网关为该机器 IP 即可,也可以手动在希望走代理机器的网关设置未该机器 IP。
注意:作者目前使用的方案已经更新,请参考[最新文章]({% post_url 2023-07-14-clash-gateway %}),使用 TUN 方案,不需要自己维护 iptables 规则
一直以来的方式是在各个终端进行代理,因为没有一定网关/路由层面处理的理由。之前也在路由器上折腾过几次,成功大抵算是成功,但是偶尔的稳定性问题,以及不方便更改代理状态和调试,最终还是放弃。
前段时间折腾了 DIYNAS,安装了 PVE 系统,折腾了虚拟机好久。想着既然没什么后顾之忧,不如在虚拟机上试试软路由?使用 OpenWRT 原生系统 + openclash 使用了一周左右,稳定性尚可,就是更新频繁(强迫症无法不点更新啊),配置文件看得人眼花缭乱。
在翻 Clash 的 GitHub 仓库时,发现最近 TProxy 支持了转发 TCP,遂想起来在 Ubuntu 上折腾一下透明代理作为网关,成功后发现这种方式相对于 OpenWRT + openclash 简单省心,维护一份配置文件,不用频繁更新。记录方案于此。
提前声明本人网络知识欠缺,配置大多参考他人,尽力给出原始链接供参考。
普通 linux 主机设置🔗
首先,在网关机器上打开 ipv4 转发, echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p
Clash 配置文件添加如下
# Transparent proxy server port for Linux (TProxy TCP and TProxy UDP)
tproxy-port: 7893
设置路由和 iptables 的脚本
# ROUTE RULES
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
# CREATE TABLE
iptables -t mangle -N clash
# RETURN LOCAL AND LANS
iptables -t mangle -A clash -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A clash -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A clash -d 192.168.50.0/16 -j RETURN
iptables -t mangle -A clash -d 192.168.9.0/16 -j RETURN
iptables -t mangle -A clash -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A clash -d 240.0.0.0/4 -j RETURN
# FORWARD ALL
iptables -t mangle -A clash -p udp -j TPROXY --on-port 7893 --tproxy-mark 1
iptables -t mangle -A clash -p tcp -j TPROXY --on-port 7893 --tproxy-mark 1
# REDIRECT
iptables -t mangle -A PREROUTING -j clash
最后在局域网的 DHCP 服务器设置网关为该机器 IP 即可,也可以手动在希望走代理机器的网关设置未该机器 IP。
OpenWrt 设置🔗
下载好对应版本的 clash
执行文件,移动或软链接至系统路径。
编写自动启动文件 # /etc/init.d/clash
#!/bin/sh /etc/rc.common
START=99
STOP=15
start() {
echo start
clash &
/root/.config/clash/iptables.sh
}
stop() {
echo stop
killall clash
}
配置文件中的 iptables.sh
即为上文中的 iptales 设置命令。
参考链接: