Vpn

networkmanager-strongswan vpn - 通過 VPN 路由特定 IP

  • April 1, 2020

我正在嘗試在 Linux Mint 19.2 上設置 VPN。

我正在使用network-manager-strongswan所以我在下面添加了這個名為VPN的文件/etc/NetworkManager/system-connections/

[connection]
id=VPN
uuid=be1d4fd1-bbaa-4aa9-9fdc-e293bf16fe67
type=vpn
autoconnect=false
permissions=
timestamp=1582680217

[vpn]
address=vpn********.it
certificate=
encap=yes
ipcomp=no
method=eap
password-flags=0
proposal=no
user=user
virtual=yes
service-type=org.freedesktop.NetworkManager.strongswan

[vpn-secrets]
password=password

[ipv4]
dns-search=
ignore-auto-dns=true
ignore-auto-routes=true
method=auto

[ipv6]
addr-gen-mode=stable-privacy
dns-search=
ip6-privacy=0
method=ignore

連接很好,我可以在專用網路上使用 ssh 訪問。最大的問題是連接後我無法上網,連接到 vpn 鎖定所有其他地址。

我在配置中添加了ignore-auto-routes標誌,為什麼我的連接被鎖定?


ip輸出*

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host 
      valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
   link/ether 00:0c:29:3c:de:1b brd ff:ff:ff:ff:ff:ff
   inet yy.16.209.132/24 brd yy.16.209.255 scope global dynamic noprefixroute ens33
      valid_lft 1656sec preferred_lft 1656sec
   inet yy.26.199.18/32 scope global ens33
      valid_lft forever preferred_lft forever
   inet6 fe80::216e:bcc0:3b4f:44b2/64 scope link noprefixroute 
      valid_lft forever preferred_lft forever

路由 -n輸出

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         yy.16.209.2    0.0.0.0         UG    20100  0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens33
yy.16.209.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
yy.26.199.18   0.0.0.0         255.255.255.255 UH    50     0        0 ens33
yy.26.199.18   0.0.0.0         255.255.255.255 UH    100    0        0 ens33

ip xfrm 策略輸出NO VPN

src yy.16.209.0/24 dst yy.16.209.0/24 
   dir fwd priority 175423 
src yy.16.209.0/24 dst yy.16.209.0/24 
   dir in priority 175423 
src yy.16.209.0/24 dst yy.16.209.0/24 
   dir out priority 175423 
src 169.254.0.0/16 dst 169.254.0.0/16 
   dir fwd priority 183615 
src 169.254.0.0/16 dst 169.254.0.0/16 
   dir in priority 183615 
src 169.254.0.0/16 dst 169.254.0.0/16 
   dir out priority 183615 
src fe80::/64 dst fe80::/64 
   dir fwd priority 134463 
src fe80::/64 dst fe80::/64 
   dir in priority 134463 
src fe80::/64 dst fe80::/64 
   dir out priority 134463 
src yy.26.199.18/32 dst 0.0.0.0/0 
   dir out priority 383615 
   tmpl src yy.16.209.132 dst xx.xx.124.58
       proto esp spi 0xc57cfb3f reqid 7 mode tunnel
src 0.0.0.0/0 dst yy.26.199.18/32 
   dir fwd priority 383615 
   tmpl src xx.xx.124.58 dst yy.16.209.132
       proto esp reqid 7 mode tunnel
src 0.0.0.0/0 dst yy.26.199.18/32 
   dir in priority 383615 
   tmpl src xx.xx.124.58 dst yy.16.209.132
       proto esp reqid 7 mode tunnel
src ::1/128 dst ::1/128 
   dir fwd priority 68927 
src ::1/128 dst ::1/128 
   dir in priority 68927 
src ::1/128 dst ::1/128 
   dir out priority 68927 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket out priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket out priority 0 
src ::/0 dst ::/0 
   socket in priority 0 
src ::/0 dst ::/0 
   socket out priority 0 
src ::/0 dst ::/0 
   socket in priority 0 
src ::/0 dst ::/0 
   socket out priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket out priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket out priority 0 
src ::/0 dst ::/0 
   socket in priority 0 
src ::/0 dst ::/0 
   socket out priority 0 
src ::/0 dst ::/0 
   socket in priority 0 
src ::/0 dst ::/0 
   socket out priority 0

ip xfrm 策略輸出UNDER VPN

src yy.26.199.18/32 dst 0.0.0.0/0 
   dir out priority 383615 
   tmpl src yy.16.209.132 dst xx.xx.124.58
       proto esp spi 0xc787ea42 reqid 2 mode tunnel
src 0.0.0.0/0 dst yy.26.199.18/32 
   dir fwd priority 383615 
   tmpl src xx.xx.124.58 dst yy.16.209.132
       proto esp reqid 2 mode tunnel
src 0.0.0.0/0 dst yy.26.199.18/32 
   dir in priority 383615 
   tmpl src xx.xx.124.58 dst yy.16.209.132
       proto esp reqid 2 mode tunnel
src fe80::/64 dst fe80::/64 
   dir fwd priority 134463 
src fe80::/64 dst fe80::/64 
   dir in priority 134463 
src fe80::/64 dst fe80::/64 
   dir out priority 134463 
src ::1/128 dst ::1/128 
   dir fwd priority 68927 
src ::1/128 dst ::1/128 
   dir in priority 68927 
src ::1/128 dst ::1/128 
   dir out priority 68927 
src yy.16.209.0/24 dst yy.16.209.0/24 
   dir fwd priority 175423 
src yy.16.209.0/24 dst yy.16.209.0/24 
   dir in priority 175423 
src yy.16.209.0/24 dst yy.16.209.0/24 
   dir out priority 175423 
src 169.254.0.0/16 dst 169.254.0.0/16 
   dir fwd priority 183615 
src 169.254.0.0/16 dst 169.254.0.0/16 
   dir in priority 183615 
src 169.254.0.0/16 dst 169.254.0.0/16 
   dir out priority 183615 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket out priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket out priority 0 
src ::/0 dst ::/0 
   socket in priority 0 
src ::/0 dst ::/0 
   socket out priority 0 
src ::/0 dst ::/0 
   socket in priority 0 
src ::/0 dst ::/0 
   socket out priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket out priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
   socket out priority 0 
src ::/0 dst ::/0 
   socket in priority 0 
src ::/0 dst ::/0 
   socket out priority 0 
src ::/0 dst ::/0 
   socket in priority 0 
src ::/0 dst ::/0 
   socket out priority 0

比較輸出我可以看到在連接 VPN 時添加了這一部分:

src yy.26.199.18/32 dst 0.0.0.0/0 
   dir out priority 383615 
   tmpl src yy.16.209.132 dst xx.xx.124.58
       proto esp spi 0xc787ea42 reqid 2 mode tunnel
src 0.0.0.0/0 dst yy.26.199.18/32 
   dir fwd priority 383615 
   tmpl src xx.xx.124.58 dst yy.16.209.132
       proto esp reqid 2 mode tunnel
src 0.0.0.0/0 dst yy.26.199.18/32 
   dir in priority 383615 
   tmpl src xx.xx.124.58 dst yy.16.209.132
       proto esp reqid 2 mode tunnel

我嘗試了很多東西,但沒有運氣。

  • 試圖將Metricyy.26.199.18 的值增加到 1050 和 1100。
  • route del default&&ip route add default via yy.26.199.18 dev ens33
  • 試圖刪除路由條目 yy.26.199.18 但沒有任何變化

還有很多其他愚蠢的東西。

所以我想在通過 VPN 路由特定地址時將我的連接用於“普通網際網路”。

有可能的?

在目前的狀態下charon-nm,沒有“設置”來定義隧道另一端的遠端網路。預設情況下,VPN 客戶端建議完整的地址空間,並依賴 VPN 響應器將流量選擇器縮小到更具體的遠端子網或子網。您可以在Charon-nm 程式碼中看到這一點。Strongswan wiki中也提到了 NetworkManager 外掛。

如您所見,隧道沒有子網配置。我們讓伺服器管理員選擇子網;客戶端總是為遠端網路建議 0.0.0.0/0 並且伺服器將其縮小到配置的子網。

因此,如果響應者沒有縮小範圍,那麼所有離開主機的單播流量都將被引導到隧道中。

但是,只要 VPN 響應者分配一個虛擬 IP,就有一種*路由方式。*它通過 charon-nm 連接到外部界面。這是virtual=yes設置要求的。根據給定的數據,它是外部介面上的第二個地址。

Strongswan 預設使用路由表 id 220 和優先級為 220 的路由策略規則呼叫該表。這張表實際上將發往 VPN 的數據包的來源設置為您這邊的虛擬 IP,然後它們會被 xfrm 策略規則擷取。因此,您可以使用較低優先級(如之前執行)的規則繞過這些規則,並避免與 xfrm 策略匹配。

例如,如果您只希望 192.168.0.1/16 的流量進入隧道:

ip rule add from all to 192.168.0.1/16 table 220 priority 218
ip rule add table main priority 219

第一條規則擷取您的“想要的”流量並將其發送到 Strongswan 表,第二條規則將 Strongswan 表跳過到主表(如果您未指定表,則在此處添加路由)。

或者使用單個否定規則:

ip rule add not from all to 192.168.0.1/16 table main priority 128

/etc/NetworkManager/dispatcher.d/您可以使用內部./pre-up.d/的網路掛鉤自動添加和刪除此類規則./pre-down.d/,只需將可執行腳本以“root”擁有的模式 0755 放在那裡。$2將分別包含vpn-pre-upvpn-pre-down$1將包含外部介面的名稱。$CONNECTION_FILENAME將是路徑/etc/NetworkManager/system-connections/yourfilename

例如:

#!/bin/bash
if [[ "$2" == "vpn-pre-up" ]]
then
 ip rule ...
fi

查看到某個地址的路由是否不是來自表 220

ip route get address/32

如果表 220 不通過 VPN,您應該不會看到表 220,否則您會看到。此外,VPN 路由將虛擬 IP 顯示為 src,“主”表將正常的外部 IP 顯示為 src。

在表 220 中顯示規則:

ip route show table 220

當反復更改 VPN 或路由表中的設置時,刷新記憶體的路由會很有用:

ip route flush cache

也許也很高興知道,啟動 VPN 也會切斷已經執行的 IP 層通信,該通信以“純文字”執行,應該通過 VPN。但是,如果在您繞過路由之前打開了具有完整地址空間流量選擇的 VPN 連接,這也意味著您將失去當時所有正在執行的 TCP 連接。即使 NetworkManager 調度程序呼叫它的鉤子 pre-up,當呼叫 pre-up 腳本時,表 220 中的 ip xfrm 規則和路由已經啟動,所以這是您需要考慮的事情,並且可能將表 220 的路由繞過設置為開機時間。

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