Clash防火墙配置完全指南:iptables/nftables规则与安全加固
Clash防火墙配置:为什么需要关注防火墙
Clash作为代理工具,运行时会监听本地端口并修改网络流量路由。如果系统防火墙配置不当,可能出现两种极端情况:要么防火墙太严导致Clash无法正常工作,要么防火墙太松导致代理端口暴露在局域网中存在安全隐患。
合理配置防火墙是Clash稳定运行的安全保障,需要关注以下层面:
- 入站规则:控制外部对Clash监听端口的访问
- 出站规则:控制经过Clash的流量走向
- 透明代理规则:TUN/TPROXY模式下需要配置流量重定向
- DNS规则:防止DNS查询绕过代理
Clash涉及的端口与流量类型
在编写防火墙规则前,先理清Clash运行时涉及的网络端口:
端口一览表
| 端口 | 协议 | 用途 | 是否需要对外暴露 |
|---|---|---|---|
| 7890 | HTTP/SOCKS | 混合代理端口 | 否(仅本地) |
| 7891 | HTTP | 纯HTTP代理 | 否(仅本地) |
| 7892 | SOCKS5 | 纯SOCKS5代理 | 否(仅本地) |
| 9090 | HTTP | RESTful API/面板 | 否(仅本地) |
| 1053 | UDP/TCP | DNS监听 | 否(仅本地) |
| 7893 | TUN | 虚拟网卡接口 | 否(系统内部) |
安全原则:Clash的所有监听端口默认只应绑定
127.0.0.1(本地回环),除非有明确的局域网共享需求,否则不应绑定0.0.0.0。
iptables防火墙配置(传统方案)
基础放行规则
如果系统使用iptables防火墙,以下规则确保Clash正常工作:
# 放行Clash混合代理端口(仅本地)
iptables -A INPUT -p tcp --dport 7890 -s 127.0.0.1 -j ACCEPT
# 放行Clash DNS端口(仅本地)
iptables -A INPUT -p udp --dport 1053 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 1053 -s 127.0.0.1 -j ACCEPT
# 放行API端口(仅本地)
iptables -A INPUT -p tcp --dport 9090 -s 127.0.0.1 -j ACCEPT
# 默认拒绝外部访问Clash端口
iptables -A INPUT -p tcp --dport 7890 -j DROP
iptables -A INPUT -p tcp --dport 9090 -j DROP
透明代理(TPROXY)规则
Clash的TUN模式依赖iptables的NAT/TPROXY规则将流量重定向到Clash。核心规则如下:
# 新建Clash专用链
iptables -t mangle -N CLASH
# 排除本地和保留地址
iptables -t mangle -A CLASH -d 0.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 10.0.0.0/8 -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
iptables -t mangle -A CLASH -d 224.0.0.0/4 -j RETURN
# 将TCP流量标记为Clash处理
iptables -t mangle -A CLASH -p tcp -j TPROXY \
--on-port 7893 --tproxy-mark 0x1/0x1
# 将UDP流量标记
iptables -t mangle -A CLASH -p udp -j TPROXY \
--on-port 7893 --tproxy-mark 0x1/0x1
# 应用到PREROUTING链
iptables -t mangle -A PREROUTING -j CLASH
出站NAT规则
Clash代理出去的流量需要经过MASQUERADE(源地址转换),否则远端服务器看到的源IP是Clash内部地址,数据包无法返回:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
持久化规则
iptables规则重启后丢失,需要持久化保存:
# Debian/Ubuntu
apt install iptables-persistent
netfilter-persistent save
# CentOS/RHEL
service iptables save
nftables防火墙配置(现代方案)
nftables是iptables的继任者,语法更统一,性能更好。主流Linux发行版已默认使用nftables。
基础放行规则
# 放行Clash本地端口
nft add rule inet filter input tcp dport 7890 ip saddr 127.0.0.1 accept
nft add rule inet filter input udp dport 1053 ip saddr 127.0.0.1 accept
nft add rule inet filter input tcp dport 9090 ip saddr 127.0.0.1 accept
# 拒绝外部访问
nft add rule inet filter input tcp dport {7890, 9090} drop
透明代理规则
# 创建Clash表
nft add table inet clash
# 创建TPROXY链
nft 'add chain inet clash prerouting { type filter hook prerouting priority 0; }'
# 排除本地地址
nft add rule inet clash prerouting ip daddr {127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16} return
# TCP重定向
nft add rule inet clash prerouting tcp dport != 7893 tproxy to 127.0.0.1:7893 mark set 0x1
# UDP重定向
nft add rule inet clash prerouting udp dport != 7893 tproxy to 127.0.0.1:7893 mark set 0x1
持久化
# 保存到文件
nft list ruleset > /etc/nftables.conf
# 设置开机自动加载
systemctl enable nftables
Windows防火墙配置
放行Clash程序
在Windows上,最简单的方式是放行Clash程序本身:
- 打开“Windows Defender防火墙” → “允许应用通过防火墙”
- 找到Clash Verge / Clash for Windows程序
- 勾选“专用网络”(不要勾选“公用网络”)
命令行方式
# 放行Clash程序
New-NetFirewallRule -DisplayName "Clash Proxy" -Direction Inbound -Program "C:\path\to\clash.exe" -Action Allow
# 放行特定端口(仅本地)
New-NetFirewallRule -DisplayName "Clash Port 7890" -Direction Inbound -LocalPort 7890 -Protocol TCP -RemoteAddress 127.0.0.1 -Action Allow
禁止外部访问Clash端口
# 拒绝局域网访问Clash API端口
New-NetFirewallRule -DisplayName "Block Clash API External" -Direction Inbound -LocalPort 9090 -Protocol TCP -RemoteAddress 192.168.0.0/16,10.0.0.0/8 -Action Block
安全加固建议
1. API端口加认证
Clash的RESTful API(9090端口)如果暴露,攻击者可以控制你的代理配置。务必设置 secret:
external-controller: 127.0.0.1:9090
secret: "你的强密码"
2. 限制外部控制端口
如果需要从局域网访问Web面板(如从手机管理电脑上的Clash),务必:
- 设置强密码的
secret - 防火墙仅允许特定IP访问
- 不要绑定到
0.0.0.0,用具体局域网IP
3. DNS端口保护
Clash的DNS监听端口如果暴露,可被用作开放DNS解析器,遭受DNS放大攻击。确保:
# iptables
iptables -A INPUT -p udp --dport 1053 ! -s 127.0.0.1 -j DROP
# nftables
nft add rule inet filter input udp dport 1053 ip saddr != 127.0.0.1 drop
4. 日志审计
开启防火墙日志,记录对Clash端口的异常访问尝试:
# iptables
iptables -A INPUT -p tcp --dport 7890 -j LOG --log-prefix "CLASH-BLOCK: "
iptables -A INPUT -p tcp --dport 7890 -j DROP
# nftables
nft add rule inet filter input tcp dport 7890 log prefix "clash-block " drop
常见问题排查
问题1:Clash启动后无法联网
排查步骤:
- 检查iptables/nftables是否放行了Clash出站连接
- 检查
allow-lan设置是否正确 - 检查DNS端口是否被防火墙拦截
- 执行
iptables -L -n或nft list ruleset查看规则
问题2:局域网其他设备无法使用Clash代理
需要确认:
- Clash配置中
bind-address设置为0.0.0.0或具体局域网IP - 防火墙放行局域网网段对7890端口的访问
- 设备代理设置指向Clash所在机器的IP
问题3:TUN模式流量不经过Clash
检查TPROXY规则是否正确加载,以及路由表是否配置:
# 检查路由规则
ip rule list
ip route show table all
# 检查TPROXY标记
iptables -t mangle -L -v
总结
Clash防火墙配置的核心原则是“本地放行、外部拒绝、透明代理重定向”。iptables和nftables两种方案在功能上等价,nftables语法更现代、性能更好。Windows平台通过系统防火墙放行Clash程序即可。安全加固方面,最重要的是给API端口设置密码认证、禁止DNS端口对外暴露,并开启日志审计。配置好防火墙后,Clash既能稳定运行,又能防止代理端口被恶意访问。
这篇教程有帮助吗?立即下载Clash入门试试吧!
全平台支持 · 安全无毒 · 官方最新版