我正在使用 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