
我對以下場景的 ip 資料包流有疑問。
場景是:
- 客戶端有一個tun0(10.0.0.2/8)介面和一個實體無線網卡wlan0(ip位址不固定),wlan0可以連接到互聯網,
- 伺服器端(Ubuntu 12.04 amd64)上有另一個 tun0 (10.0.0.1/8) 介面和實體乙太網路卡 eth0 (192.168.1.38/24),eth0 位於 NAT 防火牆後面的專用網路上,可以透過以下方式連接到網際網路防火牆(防火牆作為網關),
echo 1 > /proc/sys/net/ipv4/ip_forward
在伺服器端運行“ ”,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。我的問題是:
- 反向 NAT 會將 http 回覆的目標 IP 位址還原為 10.0.0.2,
- 伺服器 eth0 如何知道要將反向 NAT 的 http 回覆轉送到哪裡?
- eth0 會將 http 回覆轉送至伺服器 tun0 (10.0.0.1),因為回覆的目標 IP 位址被反向 NAT 為 10.0.0.2 嗎?
- 我是否需要在伺服器端新增一條路由,以便正確路由/轉送反向 NAT 的 http 回覆?如果是,怎麼辦?
- 我是否需要在伺服器端添加一些 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
完成此步驟後,當您從客戶端瀏覽網頁時,資料包流程如下:
- 客戶端將資料包傳送到 10.0.0.1。
- 在伺服器端,tun0 上收到的資料包將從 10.0.0.2 轉換為 192.168.1.38。
- 將在 NAT 表中建立映射條目。
- 資料包將透過 192.168.1.1(網關)傳送到網際網路。
- 響應將在 192.168.1.38 收到。
- 將根據步驟 3 中建立的映射條目進行反向 NAT。
- 回應資料包將被路由回 10.0.0.2。
完全希望我沒有錯過一些重要的步驟:)