Iptables

iptables -j REDIRECT actually 對數據標頭做了什麼?

  • July 18, 2019

出於好奇,我正在閱讀一些關於透明 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-natchains 的理解以及它在物理路由器中的工作方式,dst-natchain takedst-portdst-addr BEFORE路由決定被採取並將它們更改為其他東西。例如:

  • 之前dst-nat192.168.1.2:46364 -> 88.88.88.88:80
  • 之後dst-nat192.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

引用自:https://unix.stackexchange.com/questions/413545