Linux tun介面封包路由

Linux tun介面封包路由

我對以下場景的 ip 資料包流有疑問。

場景是:

  1. 客戶端有一個tun0(10.0.0.2/8)介面和一個實體無線網卡wlan0(ip位址不固定),wlan0可以連接到互聯網,
  2. 伺服器端(Ubuntu 12.04 amd64)上有另一個 tun0 (10.0.0.1/8) 介面和實體乙太網路卡 eth0 (192.168.1.38/24),eth0 位於 NAT 防火牆後面的專用網路上,可以透過以下方式連接到網際網路防火牆(防火牆作為網關),
  3. echo 1 > /proc/sys/net/ipv4/ip_forward在伺服器端運行“ ”,
  4. iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE在伺服器端運行“ ”,

這是場景圖:

---------------          ----------------
|             |          |              |
| client tun0 |----------| client wlan0 |
|  10.0.0.2   |          |  ip not fix  |
|             |          |              |
---------------          ----------------
                                |
                                |

                             internet

                                |
                                |
                         ----------------
                         |              |
                         |   firewall   |
                         |   (gateway)  |
                         | 192.168.1.1  |
                         |              |
                         ----------------
                                |
                                | private network
                                | 192.168.1.0/24
                                |
---------------          ----------------
|             |          |              |
| server tun0 |----------| server eth0  |
|  10.0.0.2   |          | 192.168.1.38 |
|             |          |              |
---------------          ----------------

我使用了兩個非常簡單的類似VPN的客戶端/伺服器程式來讀取/寫入兩個tun0介面的ip資料包,並在wlan0和eth0之間建立一條隧道,以便來自10.0.0.2的ip數據包可以到達10.0.0.1,反之亦然(例如可以從 10.0.0.1 運行 ftp 到 10.0.0.2)。

但是,如果我想使用客戶端 tun0 (10.0.0.2) 瀏覽網頁,則 http 請求將從 10.0.0.2 發出並到達互聯網 IP 位址(肯定不是 10.0.0.1)。 http請求(我認為)到達伺服器tun0(10.0.0.1)後,將被轉發到伺服器eth0(因為ip_forward處於開啟狀態,並且我認為這個轉送的http請求仍然會有一個來源ip位址10.0.0.2,如果我錯了,請糾正我),然後進行NAT 將來自eth0 的http 請求重新打包(即來源IP 位址更改為192.168.1.38,因為我運行了iptables 命令),然後重新打包的http 請求穿過防火牆(然後是互聯網)到達目的地。

當 http 回覆(來自網站)到達伺服器 eth0 時,應該在那裡進行反向 NAT。我的問題是:

  1. 反向 NAT 會將 http 回覆的目標 IP 位址還原為 10.0.0.2,
  2. 伺服器 eth0 如何知道要將反向 NAT 的 http 回覆轉送到哪裡?
  3. eth0 會將 http 回覆轉送至伺服器 tun0 (10.0.0.1),因為回覆的目標 IP 位址被反向 NAT 為 10.0.0.2 嗎?
  4. 我是否需要在伺服器端新增一條路由,以便正確路由/轉送反向 NAT 的 http 回覆?如果是,怎麼辦?
  5. 我是否需要在伺服器端添加一些 iptables 規則才能正確路由/轉送反向 NAT 的 http 回應?如果是,怎麼辦?

答案1

假設您的客戶端透過 tun0 發送所有流量,您需要在伺服器端新增以下內容(啟用 /proc/sys/net/ipv4/ip_forward 後):

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT

完成此步驟後,當您從客戶端瀏覽網頁時,資料包流程如下:

  1. 客戶端將資料包傳送到 10.0.0.1。
  2. 在伺服器端,tun0 上收到的資料包將從 10.0.0.2 轉換為 192.168.1.38。
  3. 將在 NAT 表中建立映射條目。
  4. 資料包將透過 192.168.1.1(網關)傳送到網際網路。
  5. 響應將在 192.168.1.38 收到。
  6. 將根據步驟 3 中建立的映射條目進行反向 NAT。
  7. 回應資料包將被路由回 10.0.0.2。

完全希望我沒有錯過一些重要的步驟:)

相關內容