通过 VPN 连接办公室,无需路由所有互联网流量

通过 VPN 连接办公室,无需路由所有互联网流量

我正在使用 Gnome 网络管理器连接到我的办公室 VPN。它使用 StrongSwan IPSec。

连接正常,但我的所有互联网流量都通过办公室路由。我不想这样,我只想查看我办公室的 IP 地址没有我所有的网络流量都经过办公室。另外,如果可能的话,使用办公室 DNS 来解析办公室服务器名称(但这一点不太重要)。

进行了以下设置:

  • 网关地址:办公室的 IP 地址
  • 证书:全部正常,我正在使用“证书/私钥”。
  • 选项:所有选项均已启用。
  • IPv4:我尝试在此处查看设置,但当前仅选择了“自动(DHCP)”。
  • IPv6:已禁用。

更新:我的ip -r输出是:

default via 192.168.188.1 dev enp3s0 proto dhcp metric 100 
169.254.0.0/16 dev enp3s0 scope link metric 1000 
192.168.2.103 dev enp3s0 proto kernel scope link src 192.168.2.103 metric 50 
192.168.2.103 dev enp3s0 proto kernel scope link src 192.168.2.103 metric 100 
192.168.188.0/24 dev enp3s0 proto kernel scope link src 192.168.188.21 metric 100 

答案1

总体思路是修改路由表,以便只有已知的办公室子网(地址块)通过您的 VPN 接口(例如 ppp0)进行路由,而所有其他子网通过您的正常网络接口(例如 en0)进行路由。当您连接到 VPN 时,Gnome 网络管理器会将所谓的默认路由添加到 VPN 接口(ppp0)。您需要删除此路由,但为已知的办公室子网添加新的路由条目。

首先,您需要找到您的办公室网络使用的私有子网。最简单的方法就是询问您的办公室网络管理员。如果这不可行,您可以在连接到 VPN 后通过解析办公室主机名来自己找出答案。例如:

$ nslookup service.company.office
Server:     127.0.0.53
Address:    127.0.0.53#53

Non-authoritative answer:
Name:   service.company.office
Address: 192.168.1.22

在这种情况下,您需要通过 VPN 路由的子网是 192.168.1.0/24,这意味着从 192.168.1.0 到 192.168.1.255 的所有地址。您的办公室可能有多个需要路由的子网。

其次,您需要使用ip命令修改路由表。通过键入以下内容打印出表格ip r并查找指向 VPN 设备的条目:

$ ip r
default dev ppp0 proto static scope link metric 50 
default via 192.168.20.1 dev eno1 proto dhcp metric 100 
...
192.168.20.0/24 dev eno1 proto kernel scope link src 192.168.20.126 metric 100
192.168.100.1 dev ppp0 proto kernel scope link src 192.168.100.89 metric 50 

现在您知道这ppp0是您的 VPN 设备。在我的示例中,有两个默认路由,但ppp0度量值较小,因此所有流量都流向那里。现在,向您的办公室网络添加一条单独的路由:

$ ip route add 192.168.1.0/24 dev ppp0 proto static scope link

现在您只需删除默认路由ppp0就可以了:

$ ip route delete default dev ppp0

您可以使用以下脚本自动执行此操作:

#!/bin/bash

# List your office networks
networks=(
                192.168.1.0/24 
                192.168.2.0/24 
)

# Execute it with sudo
if [ $(id -u) != "0" ]; then
        echo "You must be root to execute this script. Use sudo?"
        exit -1
fi

# Check if VPN is active. You can use ipsec status command 
# if your VPN is not L2TP
tunnel=$(ip l2tp show tunnel 2>&1)
if [ -z "$tunnel" ]; then
        echo "VPN is not active."
        exit -2
fi

# Add office private network routes
for net in ${networks[*]}; do
        ret=$(ip route add $net dev ppp0 proto static scope link 2>&1)
        if [[ $ret =~ "File exists" ]]; then
                echo "routes have been already added."
                exit -3
        fi
done

# Delete default routes so Internet is routed via local ISP
ip route delete default dev ppp0

相关内容