路由器运行Clash实现全屋科学上网:OpenWrt+Clash方案详解

2026-08-11 阅读约 8 分钟

前言:透明代理与全屋网络架构

在家庭网络环境中,为每台设备单独配置代理软件不仅繁琐,而且无法覆盖电视、智能家居等无法安装客户端的设备。通过在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-tproxykmod-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: []
注意

上述配置中的 proxiesproxy-groupsrules 为空,你需要将其替换为你实际的订阅节点信息,或者使用 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-levelwarning,并确保没有开启不必要的 find-process-mode。对于路由器设备,建议关闭 profilegeodata-mode 以降低内存开销。

通过以上步骤,你的OpenWrt路由器已经蜕变为一台强大的透明代理网关。定期更新mihomo核心与GeoIP数据库,将确保你的全屋网络始终保持高效与畅通。