如何通过第二个网络适配器路由 openvpn 流量以访问互联网

如何通过第二个网络适配器路由 openvpn 流量以访问互联网

我正在运行一个 ubuntu 服务器,它有两个网络适配器 eth0 和 usb0,它们都有单独的互联网连接。openvpn 服务器正在监听 eth0,客户端可以使用 eth0 的公共 IP 连接到 vpn,并通过 VPN 访问互联网。由于我在 openvpn 服务器配置文件中推送了默认网关路由,

     push "redirect-gateway def1 bypass-dhcp"

并在之前添加了 UFW.rules

    # START OPENVPN RULES
    # NAT table rules
    *nat
    :POSTROUTING ACCEPT [0:0]
    -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
    COMMIT
    # END OPENVPN RULE

我能够通过 eth0 网关路由所有客户端互联网流量。

现在,我尝试通过 eth0 外部 IP 地址转发连接到 VPN 的 vpn 客户端流量,以使用 usb0 网关而不是默认的 eth0 网关访问互联网。因此,我尝试将 UFW POSTROUTING 规则更改为

    -A POSTROUTING -s 10.8.0.0/8 -o usb0 -j MASQUERADE

但这似乎不起作用,流量没有从 tun0(VPN)接口路由到 usb0 接口。

这就是我想要的连接的样子。客户端将使用 eth0 适配器的静态公共 IP 访问 openvpn 服务器。并且该流量应转发到 usb0 网关以访问互联网。

    Client(10.8.0.2) --> tun0(VPN adapter, accepting connections on eth0) --> usb0 --> Internet

我确信我遗漏了路由规则。任何帮助我都感激不尽。谢谢。

答案1

一旦您配置了 OpenVPN,并且您的客户端能够访问服务器,请忘记它是一个 VPN。将其视为另一个 NIC。

因此,您有一台具有三个 NIC、一个 LAN(tun0)、两个 WAN 的服务器。您需要路线一些客户端(本身,本地进程)通过一个 WAN(eth0),而其他客户端(tun0 后面的客户端)通过另一个 WAN(usb0)。

为此,您需要一个(不太)复杂的路由设置,其中包括设置两个不同的默认路由,两个路由同时处于活动状态。您将使用路由策略数据库(RPDB)就是这样的。

关键是配置技术,称为分割访问,具体描述在Linux 高级路由和流量控制 HOWTO(又名 LARTC)。以下内容只是该页面的略微改编的副本。

您将使用两个额外的路由表。最好为它们分配符号别名,这在文件中完成/etc/iproute2/rt_tables

echo "101 eth0_wan" >> /etc/iproute2/rt_tables
echo "102 usb0_wan" >> /etc/iproute2/rt_tables

现在,您的 NIC 上肯定有一些地址,WAN NIC 上也有一些默认路由,即每个链路的网关。您将每个默认路由设置到各自的表中。同时将默认路由添加到主表中:

ip route add default via ${GW_ETH0} table eth0_wan
ip route add default via ${GW_USB0} table usb0_wan
ip route add default via ${GW_ETH0}

ifupdown如果您gateway在 中指定了/etc/network/interfaces,则可以假设最后一行已经由 执行。

现在制定路由规则(策略),指示带有某些 NIC 源地址的数据包通过该 NIC 出去,并将 OpenVPN 用户引导至usb0

ip rule add from ${ADDR_ETH0} lookup eth0_wan
ip rule add from ${ADDR_USB0} lookup usb0_wan
ip rule add from ${NETWORK_OPENVPN} lookup usb0_wan

这些命令都可以添加到/etc/network/interfaces文件post-up钩子中。通常,您不需要在pre-down钩子中删除相应的默认路由,但如果您在那里删除路由规则,它会更干净。

当然,您已经设置了 NAT,但为了完整性,我将在这里详细说明:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE

(这些规则可能需要更严格的匹配标准)。

相关内容