iptables -j REDIRECT actually 對數據標頭做了什麼?
出於好奇,我正在閱讀一些關於透明 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