You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派Tor路由器环境下,通过iptables排除特定域名走Tor路由时遇到无响应问题的技术求助

树莓派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丢弃,从而出现浏览器一直加载的情况。以下是完整的修复步骤:

  1. 首先在Filter表的FORWARD链添加允许已建立连接返回流量的规则
    这条规则要放在FORWARD链的最前面,确保返回的数据包能被正常转发:

    sudo iptables -I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
    
  2. 添加目标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
    
  3. 添加允许目标IP的出站转发规则(Filter表)
    确保客户端发往该IP的流量能被转发到外网:

    sudo iptables -I FORWARD 2 -i wlan0 -d 185.220.100.242/32 -j ACCEPT
    

额外优化建议

因为域名对应的IP可能会变化,手动添加IP规则不够灵活,你可以用ipset来管理需要排除的IP列表:

  1. 创建一个ipset集合:
    sudo ipset create no-tor hash:ip
    
  2. 将目标IP加入集合:
    sudo ipset add no-tor 185.220.100.242
    
  3. 把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:27:45