树莓派Tor路由器环境下,通过iptables排除特定域名走Tor路由时遇到无响应问题的技术求助
问题背景
我在树莓派上搭建了Tor路由器,网卡配置为:wlan0是内网客户端接入接口,wlan1是外网出口。当前的iptables规则如下,Tor服务工作正常,客户端通过wlan0访问check.torproject.org能正常显示已使用Tor网络:
Filter表规则
:INPUT DROP [12:3771] :FORWARD DROP [0:0] :OUTPUT ACCEPT [544:242321] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -m state --state INVALID -j DROP -A INPUT ! -s 192.0.0.0/8 -i wlan0 -j LOG --log-prefix "SPOOFED PKT " -A INPUT ! -s 192.0.0.0/8 -i wlan0 -j DROP -A INPUT -i lo -j ACCEPT -A INPUT -i wlan0 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -A FORWARD -m state --state INVALID -j DROP -A FORWARD -p icmp -m icmp --icmp-type 8 -j ACCEPT -A FORWARD -p icmp -m icmp --icmp-type 0 -j ACCEPT -A OUTPUT -m conntrack --ctstate INVALID -j DROP -A OUTPUT -m state --state INVALID -j DROP -A OUTPUT ! -s 127.0.0.1/32 ! -d 127.0.0.1/32 ! -o lo -p tcp -m tcp --tcp-flags RST,ACK RST,ACK -j DROP COMMIT # Completed on Sat Mar 18 22:30:17 2023 # Generated by iptables-save v1.8.7 on Sat Mar 18 22:30:17 2023
NAT表规则
*nat :PREROUTING ACCEPT [609109:124689904] :INPUT ACCEPT [272613:29686827] :OUTPUT ACCEPT [2131:306630] :POSTROUTING ACCEPT [1583:253278] -A PREROUTING -d 192.168.42.1/32 -i wlan0 -p tcp -j REDIRECT -A PREROUTING -i wlan0 -p tcp -j REDIRECT --to-ports 9040 -A PREROUTING -i wlan0 -p udp -m udp --dport 53 -j REDIRECT --to-ports 9053 -A PREROUTING -i wlan0 -p udp -j REDIRECT --to-ports 9040 -A POSTROUTING -o wlan1 -j MASQUERADE COMMIT
需求
我希望添加iptables规则,让特定域名(比如check.torproject.org)不走Tor路由,直接通过普通NAT转发访问目标地址,客户端访问该域名时能显示未使用Tor。
尝试过的操作
我尝试了以下命令,但均未成功:
- 在nat表PREROUTING链最前面添加规则跳过Tor重定向:
sudo iptables -t nat -I PREROUTING 1 -i wlan0 -d `dig check.torproject.org +short`/32 -j ACCEPT - 或者在PREROUTING链第3位添加规则:
sudo iptables -t nat -I PREROUTING 3 -i wlan0 -d <IPADRESS>/32 -j ACCEPT - 同时搭配FORWARD链的允许规则:
sudo iptables -I FORWARD 1 -i wlan0 -d <IPADRESS>/32 -j ACCEPT
遇到的问题
执行上述规则后,客户端浏览器访问check.torproject.org时一直处于加载状态,无法获取响应。请问是缺少了什么规则,还是我的思路完全错误?
解决方案分析与正确配置
你的问题核心在于FORWARD链没有允许已建立/相关联的返回流量,导致客户端发出的请求能到达目标服务器,但服务器返回的数据包被iptables丢弃,从而出现浏览器一直加载的情况。以下是完整的修复步骤:
首先在Filter表的FORWARD链添加允许已建立连接返回流量的规则
这条规则要放在FORWARD链的最前面,确保返回的数据包能被正常转发:sudo iptables -I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT添加目标IP的跳过Tor重定向规则(NAT表)
针对check.torproject.org的IP(假设解析后的IP是185.220.100.242,你可以用dig check.torproject.org +short获取最新IP),在PREROUTING链最前面添加ACCEPT规则,让这些流量不被重定向到Tor端口:sudo iptables -t nat -I PREROUTING 1 -i wlan0 -d 185.220.100.242/32 -j ACCEPT添加允许目标IP的出站转发规则(Filter表)
确保客户端发往该IP的流量能被转发到外网:sudo iptables -I FORWARD 2 -i wlan0 -d 185.220.100.242/32 -j ACCEPT
额外优化建议
因为域名对应的IP可能会变化,手动添加IP规则不够灵活,你可以用ipset来管理需要排除的IP列表:
- 创建一个ipset集合:
sudo ipset create no-tor hash:ip - 将目标IP加入集合:
sudo ipset add no-tor 185.220.100.242 - 把iptables规则改为引用这个集合:
sudo iptables -t nat -I PREROUTING 1 -i wlan0 -m set --match-set no-tor dst -j ACCEPT sudo iptables -I FORWARD 2 -i wlan0 -m set --match-set no-tor dst -j ACCEPT
这样后续需要添加/移除排除IP时,直接操作ipset集合即可,无需修改iptables规则。
备注:内容来源于stack exchange,提问作者radio_24

