路由器运行Clash实现全屋科学上网:OpenWrt+Clash方案详解
目录
前言:透明代理与全屋网络架构
在家庭网络环境中,为每台设备单独配置代理软件不仅繁琐,而且无法覆盖电视、智能家居等无法安装客户端的设备。通过在OpenWrt路由器上运行Clash,我们可以实现网络层的透明代理(Transparent Proxy)。所有接入路由器的设备,其流量都会在底层被自动接管并转发至Clash核心进行处理,真正实现“一次配置,全屋生效”。
本文将摒弃市面上常见的插件封装方案,直接采用原生Clash Meta(mihomo)核心配合iptables/nftables进行底层配置。这种方案资源占用极低,且具备最高的灵活性与可控性。
硬件与固件准备:确认系统架构
在开始之前,必须确认你的路由器CPU架构,以便下载正确的Clash核心。通过SSH登录OpenWrt后台,执行以下命令:
uname -m
常见的路由器架构包括:arm64(如R2S/R4S、MT7986)、mipsel(如老款斐讯K2P、WDR7660)、x86_64(软路由如J4125)。请务必根据输出结果选择对应的mihomo编译版本。
此外,确保你的OpenWrt固件已经安装了 iptables-mod-tproxy 和 kmod-ipt-tproxy 模块,这是实现透明转发的核心依赖。可通过以下命令安装:
opkg update
opkg install iptables-mod-tproxy kmod-ipt-tproxy
安装Clash Meta (mihomo) 核心
进入 /usr/bin/ 目录,使用 wget 下载最新版的mihomo核心。以下以arm64架构为例:
cd /usr/bin/
wget https://github.com/MetaCubeX/mihomo/releases/download/v1.18.0/mihomo-linux-arm64-v1.18.0.gz
gunzip mihomo-linux-arm64-v1.18.0.gz
mv mihomo-linux-arm64-v1.18.0 clash
chmod +x clash执行 ./clash -v,若成功输出版本号及内核信息,则说明核心安装完毕。
编写基础配置与DNS优化
在 /etc/clash/ 目录下创建 config.yaml 文件。对于透明代理,我们需要开启 tproxy-port 并配置 dns 模块以防止DNS污染。
mixed-port: 7890
redir-port: 7891
tproxy-port: 7892
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- '*.lan'
- localhost.ptlogin2.qq.com
nameserver:
- 223.5.5.5
- 119.29.29.29
fallback:
- tls://8.8.8.8
- tls://1.1.1.1
fallback-filter:
geoip: true
geoip-code: CN
proxies: []
proxy-groups: []
rules: []
上述配置中的 proxies、proxy-groups 和 rules 为空,你需要将其替换为你实际的订阅节点信息,或者使用 proxy-providers 引入远程订阅链接。
配置iptables实现TPROXY透明转发
这是clash路由器配置中最核心的一步。我们需要通过iptables将局域网流量透明地劫持到Clash的 tproxy-port。
在 /etc/clash/ 下创建 clash.sh 脚本,填入以下iptables规则:
#!/bin/sh
# 创建新的路由表
ip route add local 0.0.0.0/0 dev lo table 100
# 将TUN标记的流量路由到新建的表100
ip rule add fwmark 1 table 100
# 配置iptables的mangle链,标记TCP和UDP流量
iptables -t mangle -N clash
iptables -t mangle -A clash -p tcp -j TPROXY --on-port 7892 --tproxy-mark 0x1/0x1
iptables -t mangle -A clash -p udp -j TPROXY --on-port 7892 --tproxy-mark 0x1/0x1
# 绕过局域网和保留地址
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.0.0/16 -j RETURN
# 将PREROUTING链中发往clash的流量跳转到clash链
iptables -t mangle -A PREROUTING -j clash如果你希望了解在Linux桌面端如何实现类似的全局接管,可以参考我们的Clash TUN模式全局代理指南,其底层网络接管逻辑有异曲同工之妙,但路由器端更依赖iptables的TPROXY模块而非TUN虚拟网卡。
分流规则设计:国内外流量精准分离
在 config.yaml 中完善 rules 部分,确保国内流量直连,国外流量走代理。以下是一个基于GeoIP和域名的高效分流示例:
rules:
# 私有网络直连
- DOMAIN-SUFFIX,local,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT
- IP-CIDR,172.16.0.0/12,DIRECT
- IP-CIDR,127.0.0.0/8,DIRECT
# 国内常见域名直连
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-SUFFIX,baidu.com,DIRECT
- DOMAIN-SUFFIX,alibaba.com,DIRECT
- DOMAIN-SUFFIX,tencent.com,DIRECT
# 国内IP直连
- GEOIP,CN,DIRECT
# 兜底规则走代理
- MATCH,Proxy
关于如何编写更精细的国内外流量分离规则,以及如何利用Rule Provider动态更新规则集,请参阅Clash分流路由规则深度解析。
配置Init脚本实现开机自启
为了让Clash在路由器重启后自动运行并应用防火墙规则,我们需要编写OpenWrt的init.d服务脚本。
创建 /etc/init.d/clash 文件,赋予执行权限,并填入以下内容:
#!/bin/sh /etc/rc.common
START=99
STOP=01
start() {
/etc/clash/clash.sh
/usr/bin/clash -d /etc/clash/ >/dev/null 2>&1 &
}
stop() {
iptables -t mangle -D PREROUTING -j clash 2>/dev/null
iptables -t mangle -F clash 2>/dev/null
iptables -t mangle -X clash 2>/dev/null
ip rule del fwmark 1 table 100 2>/dev/null
ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null
killall clash 2>/dev/null
}chmod +x /etc/init.d/clash
/etc/init.d/clash enable
/etc/init.d/clash start如果你更习惯使用Systemd来管理守护进程,或者需要在标准Linux发行版上配置,可以查阅Linux系统使用Clash命令行版完整配置指南,其中详细讲解了Systemd Unit文件的编写规范。
常见问题排查与性能优化
1. 无法解析域名:检查 dns 配置中的 listen 是否为 0.0.0.0:53,并确保OpenWrt自带的 dnsmasq 没有占用53端口。如有冲突,需修改 dnsmasq 配置或将其停用。
2. 局域网设备无法上网:使用 iptables -t mangle -L PREROUTING -v 检查流量是否被正确匹配到 clash 链。如果数据包为0,说明流量未经过路由器转发,请检查客户端的网关和DNS是否指向了OpenWrt的IP。
3. 内存占用过高:在 config.yaml 中调低 log-level 为 warning,并确保没有开启不必要的 find-process-mode。对于路由器设备,建议关闭 profile 和 geodata-mode 以降低内存开销。
通过以上步骤,你的OpenWrt路由器已经蜕变为一台强大的透明代理网关。定期更新mihomo核心与GeoIP数据库,将确保你的全屋网络始终保持高效与畅通。