Linux

通過 VPN 提供對本地 Web 伺服器的公共訪問

  • April 27, 2013

我在兩台伺服器之間建立了一條 VPN 隧道:VPS-A 和 VPS-B 具有(虛構的)公共 IP 地址:66.55.44.33 和 77.88.55.66,VPN 端點分別為 10.0.1.1 和 10.0.2.1。

在 VPS-A 上執行著一個 Web 伺服器。我可以毫無問題地通過 SSH 連接到 VPS-B 並在通過 curl 向 10.0.1.1 發出 HTTP 請求時收到響應,例如:

curl http://10.0.1.1/

我還可以在連接到 Internet 的任何給定電腦上打開瀏覽器並成功打開

http://66.55.44.33/

…但我也希望能夠通過向 VPS-B 發送請求來訪問 VPS-A 的 Web 伺服器,即

http://77.88.55.66/

現在,我在 VPS-B 上添加了以下規則(已編輯以顯示正確的規則

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.1.1:80

…並且當我tcpdump在埠 80 上執行操作時,我可以清楚地看到請求如何http://77.88.55.66/正確轉發到http://10.0.1.1. 但是,VPS-A 的 Web 伺服器似乎沒有確認 TCP 請求。這是 tcpdump 準確顯示的內容:

2013-04-27 03:45:15.001564 IP 45.248.82.171.51377 > 10.0.1.1.80: S 791893048:791
2013-04-27 03:45:15.252571 IP 45.248.82.171.51378 > 10.0.1.1.80: S 670490211:670
2013-04-27 03:45:18.001526 IP 45.248.82.171.51377 > 10.0.1.1.80: S 791893048:791
2013-04-27 03:45:18.258666 IP 45.248.82.171.51378 > 10.0.1.1.80: S 670490211:670

..對於通過 VPN 發出的請求:

2013-04-27 04:26:57.464859 IP 10.0.2.1.33258 > 10.0.1.1.80: S 2369100373:2369100373(0) win 5744 <mss 1436,sackOK,timestamp 121795122 0,nop,wscale 7>
2013-04-27 04:26:57.464913 IP 10.0.1.1.80 > 10.0.2.1.33258: S 3524730589:3524730589(0) ack 2369100374 win 5744 <mss 1436,nop,nop,sackOK,nop,wscale 7>
2013-04-27 04:26:57.532428 IP 10.0.2.1.33258 > 10.0.1.1.80: . ack 1 win 45

我對 Linux 很陌生,所以我確定我做的不對,但我不知道到底是什麼。我嘗試搜尋類似的問題,但沒有找到任何東西。如果有人能指出我有用的資源或給我一個實際的例子——那就太好了。

感謝您花時間閱讀我的文章!

您的描述必須不完整。INPUT 和 FORWARD 中的規則不會使 77.88.55.66 的數據包轉到 10.0.1.1。只有錶鍊中的DNAT目標才有可能。顯然有這樣的規定。PREROUTING``nat

對於成功的重定向,無論如何都不需要 INPUT 中的規則,因為重定向系統不會接收這些數據包。

沒有 SNAT 的 DNAT 的問題(就像您的情況一樣)是系統通常不關心它在路由答案時通過哪個介面到達。您的 VPS-A 看到一個從 45.248.82.171 開始的連接,如果它願意與該客戶端通信,那麼它會向 45.248.82.171 發送響應。客戶端已經向 77.88.55.66 發送了一個 SYN 數據包並從 66.55.44.33 接收到一個 SYN ACK 並且顯然只是認為 WTF?為什麼來自 66.55.44.33?因為回復不是通過隧道發送的,因為 VPS-A 的路由配置告訴它不要通過隧道將數據包發送到此目的地。如果他們通過隧道返回,那麼 VPS-B 會將源地址改寫為自己的,一切都會好起來的。

因此,您要麼必須使用 iptables 標記通過隧道的連接(為什麼還要通過隧道?),將連接標記重寫為數據包標記,並使用帶有此數據包標記的高級路由來讓這些數據包通過隧道發送。或者你做NAT的兩邊,在通過隧道從VPS-B發送它們之前進行SNAT,然後用簡單的方法從VPS-A取回它們。缺點:網路伺服器日誌顯示“錯誤”的 IP 地址(始終為 10.0.2.1)。

順便說一句:10.0.2.1 和 10.0.1.1 是同一個 VPN 的奇怪端點地址,不是嗎?

引用自:https://serverfault.com/questions/503137