如何僅將特定子網路路由到 StrongSwan VPN,而不將 Linux 上的全部流量路由到?

如何僅將特定子網路路由到 StrongSwan VPN,而不將 Linux 上的全部流量路由到?

我在網路方面沒有特殊的能力,所以我會盡力解釋我的需求。在我的 Linux 筆記型電腦上,我運行 StrongSwan(帶有 NetworkManager)來透過 IPsec 連接到特定的 VPN。這個 VPN 讓我可以存取這些類型的 IP 10.*.*.*

現在,我的問題是,當我運行 VPN 時,所有流量都經過 VPN,但我更願意只將發送到這些 IP 的封包路由到 VPN ( 10.*.*.*)。

我該怎麼做?有人可以為我提供一個簡單的指南,或者分享必要的配置以及如何應用它們嗎?

答案1

StrongSwan 的 NetworkManager 外掛程式目前不允許更改建議的流量選擇器(決定透過隧道傳輸的流量)。因此,它總是建議對所有內容進行隧道傳輸,除非伺服器縮小流量選擇器(見下文),否則這就是協商的內容。

解決此問題的可能方法:

  1. 如果可以的話,更改伺服器的配置,以便它透過自己的流量選擇器減少集合將客戶端的建議範圍縮小到所需的子網路。有些客戶端或多或少能夠處理這個問題,strongSwan的NM插件應該沒問題(在strongSwan wiki上你可以找到有關分割隧道的更多信息以及不同客戶的潛在問題)。
  2. 如果您只想在連接到 VPN 時存取本機 LAN,您可以載入旁路區域網路插入在裡面卡戎奈米守護程式(strongSwan NM 插件的後端),它會自動為所有本地連接的子網路安裝繞過 IPsec 策略。
  3. 與上一個選項類似,使用常規 IKE 守護程式 (卡戎或者卡戎系統d,透過 swanctl.conf 或 ipsec.conf 設定)為您不想透過 VPN 存取的子網路安裝繞過 IPsec 原則(如果它們不是本機連線的話,這也適用)。
  4. 防止卡戎奈米守護程式在路由表 220 中安裝自己的路由(透過Charon-nm.install_routesStrongswan.conf 中的選項),或在建立連線後清除路由表 220。然後手動或透過 NM 腳本(在 中/etc/NetworkManager/dispatcher.d,請參閱文件在這裡),僅為您想要建立隧道的子網路安裝特定路由,例如:

    ip route add 10.0.0.0/8 dev <outbound interface> src <virtual IP> table 220
    

    其中虛擬 IP 位址必須透過日誌或ip addr(或在腳本中透過環境變數)來確定。如果您不停用自動路由安裝,您也可以從現有路由中取得虛擬IP,然後將其刪除。

  5. 或者,使用常規 IKE 守護程序而不是 NM 插件。在那裡,您有更多選項可以僅透過隧道傳輸您想要的流量(透過設定特定的遠端流量選擇器或透過旁路策略)。但是,您沒有 GUI 來設定/啟動 VPN 連線(但您可以自動啟動連線或在偵測到目標子網路的流量時啟動連線)。

答案2

非常感謝@ecdsa 的完整回答。

我是網路方面的新手,儘管它很微不足道,但我為實現該解決方案付出了很大的努力。

以下方案採用第四種建議,需執行以下步驟:

  1. 透過 NetworkManager 開啟 VPN
  2. 執行以下命令來發現從 NetworkManager 建立的路由

    user@laptop:~$ ip route list table 220
    default via 192.168.1.1 dev enp0s31f6 proto static src 172.26.199.15
    
  3. 記下該介面(enp0s31f6)和虛擬IP(172.26.199.15

  4. 刷新目前路由,因為要使用自訂路由,使用以下命令

    sudo ip route flush table 220
    
  5. 使用以下命令新增自訂路由

    sudo ip route add 10.0.0.0/8 dev enp0s31f6 via 172.26.199.15 table 220
    

現在只有封包發送到10.0.0.0/8將透過 VPN 進行路由。

相關內容