Openvpn

OpenVPN Tap介面未通過隧道連接到伺服器公共IP

  • October 16, 2019

我有一個連接到 1 個介面的伺服器tap0。還有一個具有 2 個介面的客戶端,這些介面具有公共 Internet 連接(eth1eth2)以及介面 2 的隧道,因此我可以通過 發送流量,tap0並且實際上將通過 發送數據eth2

如果我做

curl ifconfig.co

我得到了eth1. 如果我做

curl ifconfig.co --interface eth2

我得到了 的公共 IP eth2,如果我得到了

curl ifconfig.co --interface tap0

我得到了伺服器的公共 IP(它通過了隧道,所以一切都很好)。

tap0192.168.0.0/24子網中(其他的是192.168.1.0/24and 192.168.3.0/24,所以這裡沒有衝突),我可以正確連接到192.168.0.1, 192.168.0.22(這是伺服器本地 IP)等。

我已經在伺服器路由器 ( 192.168.0.1) 中為我需要的機器埠192.168.0.22(iperf3、80、OpenVPN 等)設置了重定向。

簡而言之,我認為到目前為止我的一切工作正常。

當我想連接到伺服器公共 IP 時,問題就來了。假設公共 IP1.2.3.4通過 VPN。如果我做

curl 1.2.3.4

當連接通過伺服器路由器時,我得到了我需要的所有資訊,eth1伺服器路由器將其重定向到伺服器所在的本地電腦。但如果我這樣做

curl 1.2.3.4 --interface tap0

沒發生什麼事!

使用 tcpdump檢查客戶端tap0我可以看到創建了一個請求

但是該請求永遠不會到達伺服器上(檢查了伺服器上的 eth0 是否有傳入的 OpenVPN UDP 數據包,並且在客戶端中創建此數據包時沒有新數據包到達)。當從客戶端連接到其他任何東西時,這在伺服器上:

這變成了一個解密的數據包,不用說當那裡沒有出現 UDP 數據包時,沒有解密的數據包出現。在此處輸入圖像描述
tap0``tap0``eth0在此處輸入圖像描述
tap0``tap0

我不知道這裡發生了什麼。我以為tap0在客戶端通過的所有數據包都會毫無限制地發送到伺服器,但事實並非如此。

另外,如果我去伺服器機器192.168.0.22對公共 IP 進行 curl,我將連接回 Web 伺服器,並且 curl 接收結果,因此伺服器連接到自身不會有問題。

圖(別殺我): 在此處輸入圖像描述

我該怎麼做才能使與我的伺服器公共 IP 的連接在發送時有效tap0

知道了!我認為這比其他方法更像是一種解決方法,但它按預期工作。

只需創建一個iptables規則,如果源和目標對應於公共伺服器 IP 和隧道 IP,將修改數據包的目標:

iptables -t nat -A OUTPUT -s [client tap0 IP] -d [server public IP] -j DNAT --to-destination [server local IP]

並做了!像 MP-TCP 的魅力一樣工作。

首先,您必須接受 VPN 要保持連接,從 VPN 客戶端到 VPN 伺服器的連接必鬚髮生在 VPN 之外。

其次,您必須了解這curl 1.2.3.4 --interface tap0不會改變您客戶端上的路由。它所做的只是控制數據包的源 IP。如果你連接到 VPN 伺服器的外部 IP,它仍然會直接出去,而不是神奇地被吸入隧道。

無論如何**,請仔細查看您的路由表**,它會告訴您數據包將如何流動。

當通過 tap0 發送時,我該怎麼做才能連接到我的伺服器公共 IP?

標準答案:你沒有。使用拆分 DNS 或其他方式,以便在您的 VPN 啟動時使用內部地址。

複雜/棘手的答案:如果您的所有客戶端都是基於 Linux 的,您可能會通過策略路由和設置來做一些事情,這樣 OpenVPN 流量仍然穿過公共網路,而非 OpenVPN 流量使用隧道。但幾乎​​可以肯定,設置起來會非常複雜,並且需要一些奇怪的腳本。我沒做過,也不知道有什麼教程。

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