某些 IP 使用 OpenVPN,其余 IP 使用 eth0

某些 IP 使用 OpenVPN,其余 IP 使用 eth0

摘要:我想连接到我的 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

ip a运行并traceroute连接到 VPN 的结果:

$ 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"请记住,我的服务器中有server.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

相关内容