出于好奇,我正在阅读一些关于透明 TOR 代理的教程,因为从网络的角度来看,这是一个非常有趣的话题。与只使用tun
/tap
接口并且我完全清楚的 VPN 网关相反,TOR 代理使用单个端口。所有教程都重复魔术线:
iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040
eth0
输入 (LAN) 接口在哪里,并且9040
是一些 TOR 端口。问题是,从网络的角度来看,我完全不明白为什么这样的事情是有意义的。
根据我对redirect
/ dst-nat
chains 的理解以及它在物理路由器中的工作方式,dst-nat
chain takedst-port
和dst-addr
BEFORE路由决定被采取并将它们更改为其他东西。例如:
- 之前
dst-nat
:192.168.1.2:46364 -> 88.88.88.88:80
- 之后
dst-nat
:192.168.1.2:46364 -> 99.99.99.99:8080
并且99.99.99.99:8080
是 IP 数据包流通道中的其他链所看到的(例如filter
表),这就是数据包从现在开始在离开设备后的样子。
现在互联网上的许多人(包括在这个stackexchange上)声称这与设置为接口的本地地址redirect
基本相同。鉴于此,这条规则:dst-nat
dst-addr
iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040
显然没有意义。如果这就是它的工作方式,那么 TOR 将获取所有带有 destination 的数据包127.0.0.1:9040
。对于应用程序获取数据包并以某种方式响应它的典型应用程序(例如 Web 服务器),这是完全有意义的,因为毕竟,这样的服务器进程是数据包的最终目的地,所以目的地地址是 localhost 是可以的。但是TOR路由器很好......一个路由器,所以它必须知道数据包的原始目的地。我错过了什么吗?不DNAT
影响本地应用程序接收什么?还是REDIRECT
指令的特定行为?
看看这个答案:透明 SOCKS 代理如何知道使用哪个目标 IP?
引述:
iptables 会覆盖原始目标地址,但它会记住旧地址。然后应用程序代码可以通过请求一个特殊的套接字选项来获取它,
SO_ORIGINAL_DST
.实际上,您对 TOR 是正确的,收到的每个 tcp 数据包都重定向到 localhost:9040。
目标 REDIRECT 是 DNAT 目标的特殊类型,它将 ip 地址更改为本地接口并映射到您指定的端口。
假设有一个路由器的 lan 接口是
eth0
(带有网络192.168.1.0/24
和 ip 地址192.168.1.1
:),并且该路由器的 iptables 规则是:iptables -t nat -A PREROUTING -i eth0 -p tcp --syn -j REDIRECT --to-ports 9040
然后来自局域网内客户端的所有 tcp 数据包将重定向到
192.168.1.1:9040
.假设局域网内有从客户端(带有 ip 地址
192.168.1.2
)到 google.com(假设 ip:)的 tcp 连接,8.8.1.1
那么,原始请求:
192.168.1.2:12345 -> 8.8.1.1:80
在路由器的预路由链之后:
192.168.1.2:12345->192.168.1.1:9040