iptables REDIRECT 结合接口与 IP 地址匹配

iptables REDIRECT 结合接口与 IP 地址匹配

我已成功设置 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 不等效?在这种情况下,匹配环回接口与匹配环回地址有何不同?

相关内容