![iptables REDIRECT 结合接口与 IP 地址匹配](https://linux22.com/image/3953/iptables%20REDIRECT%20%E7%BB%93%E5%90%88%E6%8E%A5%E5%8F%A3%E4%B8%8E%20IP%20%E5%9C%B0%E5%9D%80%E5%8C%B9%E9%85%8D.png)
我已成功设置 Tor透明代理使用 iptables(即,所有传出流量均在应用程序不知情的情况下通过 Tor 发送)。在这样做的过程中,我发现了一个奇怪的问题和一个同样奇怪的修复(解决方法?)。
我的规则如下。不存在用户定义的链或其他规则,所有策略均接受。
-t nat -A OUTPUT -o lo -j RETURN
-t nat -A OUTPUT -p tcp -m owner --uid-owner tor -j RETURN
-t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports 54
-t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 55
-A INPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT # Rule A
-A OUTPUT -d 127.0.0.1 -j ACCEPT # Rule B
-A OUTPUT -p tcp -m owner --uid-owner tor -j ACCEPT
-A OUTPUT -j REJECT # Rule C
换句话说:
- 所有来自/到本地主机的流量都保持不变。
- Tor 生成的所有流量均未受影响。
- 所有传出 TCP 连接均通过 Tor 发送(透明代理端口为 54)。
- 所有传出 DNS 查询均由 Tor(端口 55 上的 DNS)解析。
- 为了防止泄漏,所有其他传出的流量都用砖头击中头部并扔进沟里。
(虽然此设置存在一些问题,例如无法响应 LAN 的连接,但这些与当前的问题无关。)
如果规则 B 不存在,则所有传出连接都会立即被规则 C 拒绝。我知道它们被规则 C 拒绝,因为更改拒绝类型(例如--reject-with icmp-proto-unreachable
)会导致不同的错误。没有规则 B 的错误消息示例:
# With Rule C --reject-with icmp-port-unreachable, the default:
$ curl 213.155.151.153 # (google.com; DNS also doesn't work)
curl: (7) Failed connect to 213.155.151.153:80; Connection refused
# With Rule C --reject-with icmp-proto-unreachable:
$ curl 213.155.151.153
curl: (7) Failed connect to 213.155.151.153:80; Protocol not available
使用规则 B,连接可以正常工作。
根据我对 iptables 的理解,当建立传出 TCP 连接时,OUTPUT 链中的第三条规则nat
会将数据包的目的地重写为 127.0.0.1:54。然后数据包将进入 的 OUTPUT 链filter
,并且它应该被规则A匹配,因为它的出接口现在是环回接口。然而,它是不是规则 A 匹配,如果规则 B(与其匹配)不存在,则数据包将被拖入小巷并被规则 C 抢劫。
为什么规则 A 和规则 B 不等效?在这种情况下,匹配环回接口与匹配环回地址有何不同?