树莓派使用clash内核配置Tproxy透明代理 作者: 毕世平 时间: 2026-09-27 分类: 默认分类 前言:之前写过 [使用clash-premium的tun模式自动配置透明代理](https://shiping.date/117.html "使用clash-premium的tun模式自动配置透明代理") 的文章。配置相对简单,但是使用下来,发现国外速度还行,但是当通过树莓派访问**国内网站**时,测速下降明显,说明`tun`模式下性能不是很好。 本文主要参考网上的教程,介绍在树莓派上使用`clash tproxy`配置透明代理,让树莓派充当局域网下的网关。 参考文章地址: 1. [树莓派 Clash 透明代理(TProxy)](https://mritd.com/2022/02/06/clash-tproxy/ "树莓派 Clash 透明代理(TProxy)") 2. [iptables + clash 透明网关实践与总结](https://blog.zonowry.com/posts/clash_iptables_tproxy/ "iptables + clash 透明网关实践与总结") ## 1. 树莓派开启IP转发 以`pi`用户执行下面命令,修改`/etc/sysctl.conf`文件,开启`ipv4流量`转发: # 修改 /etc/sysctl.conf 文件 sudo echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf sudo sysctl -p // 其实这样修改完成以后,树莓派已经可以当网关用了; 但是dns需要另外配置,比如配置为上级路由器IP:192.168.1.1或者公共dns:114.114.114.114 ## 2. 新建clash用户 执行下面命令新建`clash`用户,不创建家目录: # 新建 clash 用户,-M 选项代表创建用户的时候不创建家目录 sudo useradd -s /usr/sbin/nologin -M clash ## 3. 配置启动clash服务 ### 3.1 下载必要文件 本文默认 `clash` 配置目录为 `/etc/clash` ,执行下面命令下载运行必要文件: # 查看机器架构,我树莓派3代是armv7l,32系统 arch # 创建clash目录,下载文件并解压,重命名为clash,添加可执行权限 sudo mkdir /etc/clash && cd /etc/clash sudo wget https://dl.shiping.date/clash-premium/clash-linux-armv7-n2023-09-05-gdcc8d87.gz sudo gzip -d clash-linux-armv7-n2023-09-05-gdcc8d87.gz && sudo mv clash-linux-armv7-n2023-09-05-gdcc8d87 clash sudo chmod +x clash && ./clash -v # 下载运行需要的Country.mmdb文件 sudo wget https://gh-proxy.com/https://github.com/Dreamacro/maxmind-geoip/releases/download/20260912/Country.mmdb # 下载dashboard压缩包,解压,并重命名 sudo wget https://dl.shiping.date/clash-premium/gh-pages.zip sudo unzip gh-pages.zip && sudo mv clash-dashboard-gh-pages dashboard **说明**:大佬`Country.mmdb`项目地址:https://github.com/Dreamacro/maxmind-geoip ### 3.2 配置文件 config.yaml 示例 在 `/etc/clash` 目录下创建 `config.yaml` 配置文件,作为 `clash-core` 的配置文件,示例如下: # 创建 config.yaml cd /etc/clash && sudo vim config.yaml // 配置文件示例 # 注释掉 port 端口配置, 使用 mixed-port #port: 7890 # 注释掉 socks-port 端口配置, 使用 mixed-port #socks-port: 7891 # 注释掉 redir-port 端口配置, 因为全部采用 TProxy 模式 #redir-port: 7892 # TProxy 的透明代理端口 tproxy-port: 7893 # mixed-port 端口将同时支持 SOCKS5/HTTP mixed-port: 7890 # 允许来自局域网的连接 allow-lan: true # 绑定到所有接口 bind-address: '*' mode: rule ipv6: false # 默认情况下, Clash 将日志打印到 STDOUT # 日志级别: info / warning / error / debug / silent log-level: silent external-controller: 0.0.0.0:9090 external-ui: /etc/clash/dashboard dns: enable: true listen: 0.0.0.0:1053 ipv6: false enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 fake-ip-filter: - '*.lan' nameserver: - 114.114.114.114 - 8.8.8.8 - tcp://8.8.8.8:53 - https://1.1.1.1/dns-query nameserver-policy: '+.lan': 192.168.1.1 # 指定硬路由IP做dns服务器解析 proxies: - name: "us-ss" type: ss server: 1.2.3.4 port: 1234 cipher: aes-256-gcm password: "password0" udp: false plugin: obfs plugin-opts: mode: tls host: cn.bing.com proxy-groups: - name: proxy type: select proxies: - us-ss rules: - DOMAIN-SUFFIX, google.com, proxy - DOMAIN-KEYWORD, google, proxy - DOMAIN-SUFFIX, youtube.com, proxy - DOMAIN-SUFFIX, android.com, proxy - DOMAIN-SUFFIX, github.com, proxy - DOMAIN-SUFFIX, teddysun.com, proxy - DOMAIN-SUFFIX, maxmind.com, proxy - DOMAIN-SUFFIX, edu.cn, DIRECT - IP-CIDR, 127.0.0.0/8, DIRECT - IP-CIDR, 192.168.0.0/16, DIRECT - GEOIP, LAN, DIRECT - GEOIP, CN, DIRECT - MATCH, proxy **说明**:创建好 `config.yaml` 配置文件以后,执行如下命令,递归修改 `/etc/clash` 目录的所有者和所属组。 # 修改所有者,和所属组,这一步就用到第2步创建的 clash 用户了 sudo chown -R clash:clash /etc/clash ### 3.3 创建 clash.service 服务文件 使用 `clash.service` 服务文件管理 `clash` 服务的启动,停止以及开机自启动,执行如下命令创建服务文件: # 创建 clash.service cd /etc/systemd/system && sudo vim clash.service # 以下是服务内容示例 [Unit] Description=Clash daemon, A rule-based proxy written in go After=network.target [Service] Type=simple User=clash CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW ExecStart=/etc/clash/clash -d /etc/clash Restart=on-failure [Install] WantedBy=multi-user.target # 以上是服务内容示例 # 执行如下命令管理 clash 服务 // 重载 sudo systemctl daemon-reload // 加入开机自启动,并立即启动 clash 服务 sudo systemctl enable --now clash // 查看运行状态 sudo systemctl status clash // 关闭开机自启动,并立即停止 clash 服务 sudo systemctl disable --now clash ## 4. 配置iptables规则 ### 4.1 新建 clash 链 执行如下命令,新建 `clash` 链,并添加相关规则: # 在 mangle 表下新建 clash 链(代理同局域网下设备流量) sudo iptables -t mangle -N clash # 给 clash 链添加规则 // 目标地址为局域网或保留地址的流量跳过处理 sudo iptables -t mangle -A clash -d 0.0.0.0/8 -j RETURN sudo iptables -t mangle -A clash -d 127.0.0.0/8 -j RETURN sudo iptables -t mangle -A clash -d 10.0.0.0/8 -j RETURN sudo iptables -t mangle -A clash -d 172.16.0.0/12 -j RETURN sudo iptables -t mangle -A clash -d 192.168.0.0/16 -j RETURN sudo iptables -t mangle -A clash -d 169.254.0.0/16 -j RETURN sudo iptables -t mangle -A clash -d 224.0.0.0/4 -j RETURN sudo iptables -t mangle -A clash -d 240.0.0.0/4 -j RETURN // tproxy 7893(clash tproxy) 端口,并打上 mark 666 sudo iptables -t mangle -A clash -p tcp -j TPROXY --on-port 7893 --tproxy-mark 666 sudo iptables -t mangle -A clash -p udp -j TPROXY --on-port 7893 --tproxy-mark 666 // 给 mangle 表的 PREROUTING 链应用 clash策略 sudo iptables -t mangle -I PREROUTING -j clash # 转发所有 DNS 查询到 1053 端口(劫持局域网设备发往树莓派的DNS流量) # 此操作会导致所有 DNS 请求全部返回虚假 IP(fake ip 198.18.0.1/16) sudo iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to 1053 ## 4.2 添加策略路由 上面一步的防火墙规则,给同局域网下别的设备发往树莓派(目标地址是局域网或者保留地址除外)的流量打了`tproxy-mark 666`标记,还需要做进一步的策略路由,执行相关命令如下: # 指示打了标记 666 的流量使用名为 666 的路由规则处理 // 添加策略 sudo ip rule add fwmark 666 lookup 666 // 创建路由,取名666 sudo ip route add local 0.0.0.0/0 dev lo table 666 由于这些策略路由规则在树莓派重启之后就失效了,因此可以在 `/etc/rc.local` 文件下添加上面两条规则。通过询问AI,加上实测,下面这种方法也可行: # 创建 /etc/dhcpcd.enter-hook 文件(此方法仅在树莓派上测试通过,未充分测试) sudo vim /etc/dhcpcd.enter-hook // 文件内容示例如下 # 1. 先尝试删除可能存在的旧规则,防止无限叠加(2>/dev/null 是为了让规则不存在时不报错) ip rule del fwmark 666 lookup 666 2>/dev/null ip route del local 0.0.0.0/0 dev lo table 666 2>/dev/null # 2. 重新干净地添加规则 ip rule add fwmark 666 lookup 666 ip route add local 0.0.0.0/0 dev lo table 666 //文件内容示例如上 ** 说明**:执行到这一步,跟树莓派同局域网下的设备便可以将`网关`和`DNS`修改为树莓派在局域网下的IP地址了 ## 4.3 配置树莓派本身使用透明代理 上面几步只能让跟树莓派同一个局域网下别的设备通过树莓派上网,但是树莓派本身流量不会走透明代理,执行下面命令添加规则,让树莓派本身也能用上透明代理: # 创建 clash_local 链 sudo iptables -t mangle -N clash_local # 给 mangle 表的 clash_local 链添加规则 // 目标地址是局域网地址或者保留地址的流量,跳过处理 sudo iptables -t mangle -A clash_local -d 0.0.0.0/8 -j RETURN sudo iptables -t mangle -A clash_local -d 127.0.0.0/8 -j RETURN sudo iptables -t mangle -A clash_local -d 10.0.0.0/8 -j RETURN sudo iptables -t mangle -A clash_local -d 172.16.0.0/12 -j RETURN sudo iptables -t mangle -A clash_local -d 192.168.0.0/16 -j RETURN sudo iptables -t mangle -A clash_local -d 169.254.0.0/16 -j RETURN sudo iptables -t mangle -A clash_local -d 224.0.0.0/4 -j RETURN sudo iptables -t mangle -A clash_local -d 240.0.0.0/4 -j RETURN // 为树莓派本机发出的流量打 mark sudo iptables -t mangle -A clash_local -p tcp -j MARK --set-mark 666 sudo iptables -t mangle -A clash_local -p udp -j MARK --set-mark 666 # 跳过 clash 程序本身发出的流量, 防止流量陷入回环( clash 程序需要使用 "clash" 用户启动) sudo iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner clash -j RETURN sudo iptables -t mangle -A OUTPUT -p udp -m owner --uid-owner clash -j RETURN # 让本机发出的流量跳转到 clash_local sudo iptables -t mangle -A OUTPUT -j clash_local 对于树莓派本机发出的 DNS 查询流量,跟其他设备通过 `PREROUTING` 链访问树莓派的流量一样,也需要把它重定向到 `clash` 监听的 `1053` 端口,下面新建 `clash_dns` 链来处理: # 新建 clash_dns 链 sudo iptables -t nat -N clash_dns # 给 nat 表的 clash_dns 链添加规则 // clash 程序本身发出的 dns 查询流量,防止回环 sudo iptables -t nat -A clash_dns -p udp --dport 53 -m owner --uid-owner clash -j RETURN sudo iptables -t nat -A clash_dns -p tcp --dport 53 -m owner --uid-owner clash -j RETURN // 树莓派本身发起的 53/udp 端口流量,重定向到 1053 端口 sudo iptables -t nat -A clash_dns -p udp --dport 53 -j REDIRECT --to-port 1053 # 给 nat 表的 OUTPUT 链应用 clash_dns sudo iptables -t nat -A OUTPUT -p udp --dport 53 -j clash_dns **说明**:上面创建的这些 `iptables` 规则,树莓派一断电就失效清空了,因此可以安装 `iptables-persistent` 服务来解决这个问题。 # 更新源 sudo apt update # 安装 iptables-persistent 服务(安装过程中提示保存规则,全部选YES即可) sudo apt install iptables-persistent -y # 手动保存当前的 iptables 规则( /etc/iptables/rules.v4 和 /etc/iptables/rules.v6 ) sudo netfilter-persistent save # 5. 结语 本文参考了网上不少教程,对具体原理解释的很少,这里对文章原文表示感谢。如有错误,欢迎留言反馈。 ## 参考链接: - [树莓派 Clash 透明代理(TProxy)](https://mritd.com/2022/02/06/clash-tproxy/ "树莓派 Clash 透明代理(TProxy)") - [iptables + clash 透明网关实践与总结](https://blog.zonowry.com/posts/clash_iptables_tproxy/ "iptables + clash 透明网关实践与总结") - [D大maxmind-geoip项目地址](https://github.com/Dreamacro/maxmind-geoip/ "D大maxmind-geoip项目地址") 标签: none