OpenVPN 適用於某些 IP,eth0 適用於其他所有 IP

OpenVPN 適用於某些 IP,eth0 適用於其他所有 IP

摘要:我想連接到我的 VPN 並有權訪問某些伺服器,但對於所有其他流量,我想使用常規網路。

我已經在我的 VPS 上設定了 OpenVPN 伺服器,我的server.conf檔案如下所示:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log         /var/log/openvpn.log
verb 4
push "route 10.132.0.0 255.255.0.0"

我使用以下.ovpn文件來設定 VPN 連線:

client
dev tun
proto udp
remote <my.vpn.server.com> 1194
nobind
user nobody
group nogroup
persist-key
persist-tun
remote-cert-tls server
comp-lzo
verb 3
<ca>....</ca>
<cert>...</cert>
<key>...</key>

最後,在 VPN 連接的網路管理員中,在 IPv4 設定下,我確保將「方法」設定為「僅自動(VPN)位址」。

VPN 連線正常,我可以存取我需要的所有內部伺服器 (10.132.xx),但是我無法存取其他任何伺服器(例如 google.com)。我希望我的 eth0 設定可用於除 10.132.xx IP 之外的所有內容,我希望透過 VPN 路由該 IP。

PS 是基於我嘗試no-pull在 .ovpn 檔案中使用並在route其中添加我的設定但無濟於事的其他文章。

編輯1

連接 VPN 時的ip a執行結果:traceroute

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:dc:a6:ef brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 86320sec preferred_lft 86320sec
    inet6 fe80::f3d1:6eb3:e13e:d61b/64 scope link 
       valid_lft forever preferred_lft forever
15: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.6 peer 10.8.0.5/32 brd 10.8.0.6 scope global tun0
       valid_lft forever preferred_lft forever

$ traceroute google.com
google.com: Temporary failure in name resolution
Cannot handle "host" cmdline arg `google.com' on position 1 (argc 1)

編輯2: 結果ip r

$ ip r
default via 10.8.0.5 dev tun0  proto static  metric 50 
default via 10.0.2.2 dev eth0  proto static  metric 100 
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15  metric 100 
10.8.0.1 via 10.8.0.5 dev tun0  proto static  metric 50 
10.8.0.5 dev tun0  proto kernel  scope link  src 10.8.0.6  metric 50 
10.132.0.0/16 via 10.8.0.5 dev tun0  proto static  metric 50 
104.236.239.153 via 10.0.2.2 dev eth0  proto static  metric 100 
169.254.0.0/16 dev eth0  scope link  metric 1000 

答案1

這 ”僅將此連接用於其網路上的資源nm-connection-editor 中的複選框控制NetworkManager 是否應添加通過VPN 的預設路由。 如果您選取此選項,就像您所做的那樣,只有定向到VPN 子網路的封包才會通過VPN 網關,並且系統將使用現有的預設路由前往其他目的地的路線。

您可以使用 nmcli 從命令列更改相同的設定:

nmcli connection modify <VPN connection> ipv4.never-default yes

答案2

我透過使用客戶端 GUI(Ubuntu NetworkManager)設法獲得了所需的效果。我必須IPv4 Settings -> Routes確保選中“僅將此連接用於其網路上的資源”下的複選框:

「僅將此連接用於其網路上的資源

我不完全確定需要在 .ovpn 檔案中執行什麼操作才能複製此內容。

我的路由表現在看起來像這樣:

$ sudo netstat -r -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
10.8.0.1        10.8.0.5        255.255.255.255 UGH       0 0          0 tun0
10.8.0.5        0.0.0.0         255.255.255.255 UH        0 0          0 tun0
10.132.0.0      10.8.0.5        255.255.0.0     UG        0 0          0 tun0
104.236.239.153 10.0.2.2        255.255.255.255 UGH       0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0

請記住,我的push "route 10.132.0.0 255.255.0.0"soserver.conf解釋了該條目,10.132.0.0以及為什麼我現在可以訪問我的伺服器,而其他所有內容都路由到 VPN 外部(即條目0.0.0.0

如果沒有在 GUI 中檢查此設置,我的路由表將如下所示:

$ sudo netstat -r -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.8.0.5        0.0.0.0         UG        0 0          0 tun0
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
10.8.0.1        10.8.0.5        255.255.255.255 UGH       0 0          0 tun0
10.8.0.5        0.0.0.0         255.255.255.255 UH        0 0          0 tun0
10.132.0.0      10.8.0.5        255.255.0.0     UG        0 0          0 tun0
104.236.239.153 10.0.2.2        255.255.255.255 UGH       0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0

我的猜測是第一個0.0.0.0條目(預設路由)把一切搞亂了。

答案3

為了闡述 jdmorei 的答案,您需要所謂的「分割隧道」VPN - 當您說:時,您實際上幾乎已經有了解決方案P.S. based on other articles I've tried using no-pull in the .ovpn file and adding in my route settings there but to no avail.

您將需要在 ovpn 檔案中包含以下內容:

route-nopull # Make sure not to pull the default routes
route 10.8.0.0 255.255.255.0 # Route the /24 of 10.8.0.0 across the VPN
route 192.168.2.2 255.255.255.255 # Route the /32 (single IP) across the VPN

現在的關鍵是,既然你運行的是 Windows,你必須以管理員身分執行 openvpn 應用程式。如果不這樣做,您將在日誌中看到以下條目:

Sat Nov 13 11:31:05 2010 ROUTE: route addition failed using CreateIpForwardEntry
: Access denied.   [status=5 if_index=11]
The requested operation requires elevation. 
Sat Nov 13 11:31:05 2010 ERROR: Windows route add command failed [adaptive]: ret
urned error code 1
Sat Nov 13 11:31:05 2010 Initialization Sequence Completed

答案4

我這裡用的是FreshTomato。我設法只將 3 個目標 IP 重定向到 VPN。

以下是 OpenVPN 自訂設定:

allow-pull-fqdn
route-nopull
script-security 2
up /opt/openvpn-routes.sh

然後就是上面提到的腳本:

root@router:/tmp/home/root# cat /opt/openvpn-routes.sh 
#!/bin/sh
ip route add 204.11.51.251/32  dev tun11 # www.linksysinfo.org
ip route add 201.54.48.99/32   dev tun11 # www12.senado.leg.br
ip route add 34.160.111.145/32 dev tun11 # ifconfig.me

/opt 安裝點是按照以下說明設定的https://github.com/Entware/Entware/wiki/Install-on-TomatoUSB-and-FreshTomato

相關內容