📅  最后修改于: 2023-12-03 14:44:54.972000             🧑  作者: Mango
OpenVPN 是一种基于 SSL/TLS 协议的开源 VPN 解决方案,它可以帮助我们在互联网上安全地连接两个或多个计算机。
有时候,我们想要通过 OpenVPN 通道路由除了 OpenVPN 连接以外的所有流量。这种设置方法在 Linux 和 macOS 上类似,而在 Windows 上有些不同。本文将介绍在这几个系统上如何实现此目标。
我们可以使用 Linux 的 route
命令为 OpenVPN 通道添加默认路由。默认情况下,OpenVPN 是不会将所有流量路由到 VPN 通道上的,只有目标地址是 VPN 服务器或可 routable 的子网时才会路由到 VPN 通道上。
要为 VPN 通道添加默认路由,可以运行以下命令:
sudo ip route add default via <VPN gateway IP address dev tun0>
其中,<VPN gateway IP address>
是 VPN 网关的 IP 地址,tun0
是 VPN 接口名称(可以在打开 VPN 连接后通过运行 ifconfig
命令查看)。这条命令将默认路由指向 VPN 网关,并在 tun0
接口上发送所有流量。
如果我们仅需要让部分流量通过 VPN 通道,而其他流量则应该直接从本地路由表中路由,我们可以通过 iptables
命令设置这类规则。
以下命令将主机 192.168.0.0/16 的流量(除了本地流量和 VPN 流量)跳过 VPN 连接并使用本地路由表路由:
sudo iptables -t mangle -A PREROUTING -s 192.168.0.0/16 ! -d 192.168.0.0/16 \
! -o tun0 -j MARK --set-mark 1
sudo ip rule add fwmark 1 table 100
sudo ip route add default via <default gateway IP address> dev eth0 table 100
这些命令将创建一个新的路由表,并将规则和路由添加到该表中。MARK
规则将符合条件的数据包标记为 1,而后续的 ip rule
和 ip route
命令将这些包路由到 table 100 中,并将所有数据包发送到其默认网关。
我们可以使用 macOS 的 route
命令为 VPN 通道添加默认路由,方法如下:
sudo route -nv add -net default -interface utun0
其中,utun0
是 VPN 接口名称,你可以在打开 VPN 连接后通过运行 ifconfig
命令查看。
如果我们希望将某些流量路由到本地路由表中,并跳过 OpenVPN 连接,我们也可以使用 macOS 上的 pfctl
命令来实现。以下脚本将符合条件的流量路由到本地路由表上:
scrub in all
nat on en0 from en0:network to any -> (en0)
rdr pass
route-change {
from !192.168.0.0/16 to any \
divert-to 192.168.0.10
}
这个脚本会将网关设置为指定 IP 地址 192.168.0.10
,从而绕过 VPN 连接并路由到本地路由表中。
在 Windows 上,可以通过将 VPN 连接配置为默认路由来将流量路由到 VPN 通道中。
要将 VPN 连接设置为默认路由,请按照以下步骤操作:
在 Windows 上,可以使用 route
命令来实现,方法如下:
route -p ADD <destination_network> MASK <destination_mask> <next_hop_address> METRIC 1
其中:
<destination_network>
是目标网络 IP 地址;<destination_mask>
是目标网络掩码;<next_hop_address>
是下一跳网关 IP 地址。以下是一个示例:
route -p ADD 192.168.0.0 MASK 255.255.0.0 192.168.1.1 METRIC 1
这会将主机上 IP 地址为 192.168.0.0 开头的流量(除了本机 IP 和 VPN 网络)指向默认网关为 192.168.1.1 的网卡。Internet 流量将不会经过 VPN 连接。
本文介绍了如何在 OpenVPN 上路由本地流量。不同操作系统上的实现方式略有不同,但总的来说,我们可以使用路由表、标记和规则等技术来实现这种需求。这些技术可以帮助我们更好地控制网络流量,并确保我们的数据安全。