Strongswan

無法在 Strongswan 中使用拆分隧道

  • February 23, 2022

我正在嘗試為 VPN 拆分隧道設置 Strongswan。

我想要的只是子網10.88.0.0/1610.0.200.0/24可以通過 VPN 隧道訪問。其他一切都default gateway通過網路處理。

所有客戶端都分配了一個屬於該10.0.201.0/24子網的 IP 地址。

在我的配置文件中,我有以下內容:

# Default login method
eap-defaults {
 remote {
  auth = eap-radius
  id = %any
  eap_id = %any
 }
}

connections
{
 conn-unix : conn-defaults, eap-defaults {
   children {
     net {
       local_ts = 10.0.200.0/24, 10.88.0.0/16
     }

     esp_proposals = aes128gcm128-x25519
   }

   pools = IkeVPN-ipv4
   proposals = aes128-sha256-x25519
 }

 conn-windows : conn-defaults, eap-defaults {
   children {
     net {
       local_ts = 10.0.200.0/24, 10.88.0.0/16
     }

     esp_proposals = aes256-sha256-prfsha256-modp1024
   }

   proposals = aes256-sha256-prfsha256-modp1024
   pools = IkeVPN-ipv4
 }
}

pools
{
 IkeVPN-ipv4 {
   addrs = 10.0.201.0/24
   dns = 10.0.88.2
 }
}

當我通過 VPN 登錄時,可以 ping 屬於10.88.0.0/16and的主機10.0.200.0/24,所以我知道我可以使用 VPN 隧道。

然而:

如果我在仍然連接到 VPN 的同時嘗試訪問 Internet 上的任何其他資源,那麼我什至無法 ping 屬於該資源的 IP 地址。

在我的 Windows 電腦上的路由表中,我可以找到以下條目:

連接到 VPN 伺服器的 Windows 客戶端的部分路由表

我知道,當您有兩條路由到給定子網(如0.0.0.0/0路由表中)時,任何具有最低度量的規則都會獲勝,並使用該規則轉發流量。

但是我不希望 VPN 伺服器通過 VPN 安裝預設路由,而只是告訴子網10.88.0.0/16並且10.0.200.0/24必須通過 VPN 路由。

我想要的是我看到一個更接近於此的路由表,而不必在每個 VPN 客戶端上手動編輯路由表:

所需的路由表

那麼我該怎麼做呢?

原來我的拆分隧道問題被放在了一個完全不同的區域,因為我家裡有 2 個路由器,所以我的家庭網路類似於:ISP <-> R1 <-> R2 <-> Me。

…並且 R1 被配置為 10.0.0.0/24 範圍內的 IP 地址。

當您在 Windows VPN 客戶端中禁用預設路由時,它將添加一個基於類的路由,因此在我的情況下,它將添加一個通過 VPN 發送 10.0.0.0/8 的所有內容的路由,這當然會與設置衝突在路由器 R1 上。

這就是為什麼要完全刪除路由 10.0.0.0/8 並為子網10.88.0.0/1610.0.200.0/16VPN 推送路由。

事實證明這是可行的。

當您在 VPN 客戶端中disable class based routing禁用時,啟用會刪除基於類的路由。default routing

在 Strongswan 中,您必須將來自客戶端的 dhcp 請求轉發到已實施 RFC3442 的 DHCP 伺服器。

因此,在我上面的配置中,我必須替換所有出現的pools = IkeVPN-ipv4withpools = dhcp並且strongswan.conf我必須將以下內容添加到 charon plugins 小節:

charon {
 plugins {
   ...
   dhcp {
     server = ip.address.of.dhcp.server
   }
 }
}

然後我可以刪除pools配置底部的整個部分。

還有一些可用的選項可以在這裡閱讀

來自 @ecdsa 提示的 Strongswan 指南提供了一些資訊,但該指南是特定於 Windows 的,因此它不會告訴您如何處理 Linux、MacOS 或 Android 設備。然而,RFC3442 將處理一般情況。

簡而言之,RFC3442 說的是您必鬚髮送以下兩個 dhcp 選項:

  • 選項 121(與 Linux、Android 和 Windows Vista 或更早版本相關)
  • 選項 249(與 Windows 7 或更新版本和 MacOS 相關)

基本上,您必須使用以下語法將每個路由編碼為 int 數組:

x,y1,y2,y3,y4,z1,z2,z3,z4

在哪裡:

  • x:CIDR 網路遮罩
  • y1 - y4:是您要路由的網路,但是當序列 y1,y2,y3,y4 的尾部全為零時,它們會被省略。
  • z1 - z4:是子網的下一跳網關。

如果有多個路由要通過 DHCP 發送,那麼您將不得不在第一個路由器的尾部添加與上述類似的另一個序列。

根據 Strongswan 文件,我可以將標準網關替換為0.0.0.0.

這意味著我的路線10.0.200.0/24被編碼為24,10,0,200,0,0,0,0並被10.88.0.0/16編碼為16,10,88,0,0,0,0.

將兩者結合起來給了我24,10,0,200,0,0,0,0,16,10,88,0,0,0,0,這使我得到以下配置ISC DHCP server

option rfc-routes code 121 = array of integer 8;
option ms-routes code 249 = array of integer 8;

default-lease-time 21600;
max-lease-time 86000;

subnet 10.0.201.0 netmask 255.255.255.0 {
   range 10.0.201.1 10.0.201.254;

   option domain-name "example.com";
   option domain-name-servers ip.address.of.dns.server;

   option rfc-routes 24,10,0,200,0,0,0,0,16,10,88,0,0,0,0;
   option ms-routes 24,10,0,200,0,0,0,0,16,10,88,0,0,0,0;
}

我希望這可以幫助任何對拆分隧道感到困惑的人。

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