OpenVPN Tap介面未通過隧道連接到伺服器公共IP
我有一個連接到 1 個介面的伺服器
tap0
。還有一個具有 2 個介面的客戶端,這些介面具有公共 Internet 連接(eth1
和eth2
)以及介面 2 的隧道,因此我可以通過 發送流量,tap0
並且實際上將通過 發送數據eth2
。如果我做
curl ifconfig.co
我得到了
eth1
. 如果我做curl ifconfig.co --interface eth2
我得到了 的公共 IP
eth2
,如果我得到了curl ifconfig.co --interface tap0
我得到了伺服器的公共 IP(它通過了隧道,所以一切都很好)。
tap0
在192.168.0.0/24
子網中(其他的是192.168.1.0/24
and192.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 時,問題就來了。假設公共 IP
1.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 流量使用隧道。但幾乎可以肯定,設置起來會非常複雜,並且需要一些奇怪的腳本。我沒做過,也不知道有什麼教程。