使用 OpenVPN 通過 VPN 網關路由子網
我工作的一家小公司很快就要擺脫辦公室了,我不得不將目前本地託管的 VPN(只是一個 Zyxel Zywall 110 設備)遷移到基於雲的 VM 中。我在網路(後端開發轉向操作)方面沒有那麼豐富的經驗,所以我想驗證以下方法是否可行。
我有一個專用的虛擬機,我在其中設置了 OpenVPN 訪問伺服器,基礎執行良好,人們可以連接,一切都很好。
但是有一個問題,目前的 VPN 通過“隧道”將某個 IP 範圍轉發到合作夥伴公司的內部網路。它看起來像這樣:
if dest_addr in '172.30.239.0/25': route through gw 194.xxx.xxx.xxx else: route through gw 0.0.0.0
例如,當連接到 VPN 時,我的流量將按如下方式路由:
dest 1.2.3.4 => me -> VPN server -> its internet gateway -*-> 1.2.3.4 dest 172.30.239.10 => me -> VPN server -> partner network gateway (194.xxx.xxx.xxx) -(internal network routing)-> 172.30.239.10
從我們的路由器到合作夥伴公司的 VPN GW 的連接是通過帶有預共享密鑰的 IKEv1 完成的(從路由器的 Web UI 判斷,因為這就是我擁有的所有“文件”)。
一些描述以下設置的 ascii 藝術作品。我正在用
Router
虛擬機替換。+-----------------+ [ Partner infra, this has to stay the same ] | Router | 194.xxx.xxx.xxx e.g. 172.30.239.75 | --------------- | IKEv1 +-------------+ +-------------------------+ User -----> | 172.30.239.0/25-| --------> | VPN gateway |-----> | Internal network server | | default | +-------------+ +-------------------------+ | | | +--------+--------+ | | internet
OpenVPN 訪問伺服器本身不支持這樣的東西(或者我無法找到該配置),所以我認為我可以在 VM 級別上做到這一點。如果我使用 Strongswan 之類的東西將作業系統連接到 VPN 網關並配置適當的路由
iptables
,這可以工作嗎?連接到 OpenVPN 伺服器並進入該172.30.239.0/25
範圍的使用者的流量會被路由到 Strongswan 的連接,還是這種方法根本上是錯誤的?我有哪些選擇?謝謝!
現在事情有點清楚了。當然,OpenVPN 有一個選項可以解決您的問題:如果您希望 VPN 客戶端通過您的 VPN 隧道路由網路 1.2.3.0/25 的流量,請使用選項
push
(源):--push option Push a config file option back to the client for remote execution. Note that option must be enclosed in double quotes (""). The client must specify --pull in its config file. The set of options which can be pushed is limited by both feasibility and security. Some options such as those which would execute scripts are banned, since they would effectively allow a compromised server to execute arbitrary code on the client. Other options such as TLS or MTU parameters cannot be pushed because the client needs to know them before the connection to the server can be initiated.
因此,您必須添加您的 openvpn 伺服器配置
push "route 1.2.3.0 255.255.255.128"
這告訴 openvpn 客戶端,它應該通過 vpn 隧道將所有流量路由到該子網。而且,當然,在伺服器本身上,正確的路由也必須到位 - 但我想這條路由可能已經到位。
$$ UPDATE $$
我的回答是缺少一些關於路由的基本資訊。任何網路設備都可以充當網關——這就是家庭路由器的作用。路由不做用
iptables
——那是修改linux內置核心防火牆的工具。路由決策是在路由表的幫助下完成的(為了簡單起見,我在這裡只討論 IPv4)。對於正在發送的每個 IP 數據包,都會考慮路由表,從僅主機路由(/32 子網)開始,採用它可以找到的最“精確”的路由。因此,僅在沒有找到具有更“精確”子網的匹配路由時才採用預設路由( /0 子網)。通過 VPN 隧道路由所有流量很容易。OpenVPN 使用該
redirect-gateway
指令。因此,要麼將該指令放入所有客戶端配置中,要麼放入一個push "redirect-gateway def1"
進入您的伺服器配置。使用選項 def1,將使用兩個具有 128.0.0.0 子網的路由,而不是一個 0.0.0.0 子網路由 - 這樣做是為了避免新的預設路由被 DHCP 客戶端覆蓋。
來到你的伺服器上的路線。由於伺服器是 IPSec 隧道的端點(連接到您的合作夥伴),因此軟體(strongswan?)已經在該伺服器上安裝了必要的路由,以便遠端網路的流量通過 IPSec 隧道進行路由。
讓我用範例網路和路線畫一張圖,以便更好地理解。考慮以下網路:
A ---------- B -------- C --------- D
- A 是一個 IP 為 10.8.0.2 的 OpenVPN 客戶端
- B 是 IP 為 10.8.0.1 和 172.16.0.1 的 OpenVPN 伺服器
- C 是您合作夥伴網路內的遠端 IPSec 端點,IP 為 172.16.0.2 和 192.168.0.1
- D 是合作夥伴網路內的網路設備,IP 為 192.168.0.10
在此範例設置中,您有三個網路:
- OpenVPN 網路
- IPSec 網路
- 合作夥伴網路
設備A有路由:
0.0.0.0/0 gw 10.8.0.1
伺服器B有兩條路由:一條預設網關到ISP,
192.168.0.0/24 gw 172.16.0.2
伺服器C有兩條路由:一條預設網關到夥伴的ISP,和:
10.8.0.0/24 gw 172.16.0.1
對於設備D,只
0.0.0.0/0 gw 192.168.0.1
需要預設路由。