使 VPN 客戶端后面的伺服器保持可訪問性
我有一個在 Linux 下用作 Web 和 SSH 伺服器的伺服器。有一個帶有 OpenVPN 的 VPN 客戶端。如果我正確理解的話,VPN 會更改路由表,導致所有流量都通過 VPN 轉發。
然後,當我嘗試請求我在伺服器上託管的網站時,它變得不可用。我對網路有非常基本的了解,但我可以假設(如果我錯了,請隨時糾正我)是伺服器通過通常的介面正確接收到請求,讓我們命名它
eth0
,但鑑於路由變了,現在通過VPN,響應應該在VPN的介面上發送,這顯然是出於安全考慮是不可能的。我查找了以下執行緒:
https://unix.stackexchange.com/questions/4420/reply-on-same-interface-as-incoming
但不幸的是,他們一直沒有幫助。
我們稱之為 VPN 的介面
tun0
。我想做的是eth0
在同一介面上回復請求,即eth0
它本身,而不是tun0
在 VPN 執行時。另一個精度是,我的伺服器位於與其不同的網關後面(兩個不同的 IP 地址)。1)有可能這樣做嗎?
2)有哪些不同的方法可以做到這一點?
預先感謝您的回饋。
最後,對於我的問題,我找到了一個受以下啟發的解決方案:
https://lartc.org/howto/lartc.rpdb.multiple-links.html .
以下是如何進行。
為了配置伺服器的路由,使其可以在 VPN 客戶端后面實現,應該使用單獨的路由表來避免兩個介面的路由配置重疊。
設
<interface>
、<table>
、<ip>
、<gateway>
和<network>
分別為介面名稱、表、IP地址<interface>
、網關IP地址和網路IP地址(由ISP提供)。要遵循的程序是:
- 具體路由表的創建:在中
<interface>
創建新表。<table>``/etc/iproute2/rt_tables
<gateway>
為通過特定表關聯的介面設置不同的路由配置。往來的流量
<network>
與介面相關聯<interface>
並遵循特定的路由表<table>
:
ip route add <network> dev <interface> src <ip> table <table>
通過此網關建構預設路由:
ip route add default via <gateway> table <table>
3. 開<interface>
,強制流量<ip>
通過<network>
,使用介面<interface>
:
ip route add <network> dev <interface> src <ip>
src
指定參數以確保選擇正確的傳出 IP 地址。 4. 將介面關聯到適當的<network>
:
ip rule add from <ip> table
關鍵思想:
關於為什麼在這裡使用這種技術,要理解的關鍵思想是,對於通過 ISP 節點的任何請求,在這裡
<network>
,後者將是響應路由的中間節點。這似乎很明顯,但是忘記它會導致不明白為什麼<network>
通常用於從外部與伺服器通信的介面的路由配置很重要。可選:
- 將所有目的地的路由設置為通過
<gateway>
而不是通過 VPN 的網關。當需要僅根據具體情況使用 VPN 時很有用。令
<vpn>
, 和<vpn's gateway>
分別為 VPN 的介面名稱(一般為tun0
)和 VPN 網關的 IP 地址。然後,通過 VPN 的任何目的地的路由,更準確地說是其網關<vpn's gateway>
,必須由通過的路由替換<gateway>
:ip route del 0.0.0.0/1 via <vpn's gateway> dev <vpn> ip route add 0.0.0.0/1 via <gateway> dev <interface> ip route del 128.0.0.0/1 via <vpn's gateway> dev <vpn> ip route add 128.0.0.0/1 via <gateway> dev <interface>
0.0.0.0/1
代表範圍從0.0.0.1
到127.255.255.255
和128.0.0.0/1
從128.0.0.1
到的 IP 地址255.255.254
。那裡。