📜  openvpn 路由本地流量 (1)

📅  最后修改于: 2023-12-03 14:44:54.972000             🧑  作者: Mango

在 OpenVPN 上路由本地流量

OpenVPN 是一种基于 SSL/TLS 协议的开源 VPN 解决方案,它可以帮助我们在互联网上安全地连接两个或多个计算机。

有时候,我们想要通过 OpenVPN 通道路由除了 OpenVPN 连接以外的所有流量。这种设置方法在 Linux 和 macOS 上类似,而在 Windows 上有些不同。本文将介绍在这几个系统上如何实现此目标。

Linux
为 OpenVPN 通道添加默认路由

我们可以使用 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 连接以路由本地流量

如果我们仅需要让部分流量通过 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 ruleip route 命令将这些包路由到 table 100 中,并将所有数据包发送到其默认网关。

macOS
为 VPN 通道添加默认路由

我们可以使用 macOS 的 route 命令为 VPN 通道添加默认路由,方法如下:

sudo route -nv add -net default -interface utun0

其中,utun0 是 VPN 接口名称,你可以在打开 VPN 连接后通过运行 ifconfig 命令查看。

跳过 VPN 连接以路由本地流量

如果我们希望将某些流量路由到本地路由表中,并跳过 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 通道添加默认路由

在 Windows 上,可以通过将 VPN 连接配置为默认路由来将流量路由到 VPN 通道中。

要将 VPN 连接设置为默认路由,请按照以下步骤操作:

  1. 打开“控制面板”,点击“网络和 Internet”下的“网络和共享中心”。
  2. 在左侧面板中,点击“更改适配器设置”。
  3. 找到 OpenVPN 连接,右键单击并选择“属性”。
  4. 点击“Internet 协议版本 4(TCP/IPv4)”,点击“属性”。
  5. 选择“高级”选项卡,并清除“默认网关”复选框。
跳过 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 上路由本地流量。不同操作系统上的实现方式略有不同,但总的来说,我们可以使用路由表、标记和规则等技术来实现这种需求。这些技术可以帮助我们更好地控制网络流量,并确保我们的数据安全。