我正在运行一个 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
(这些规则可能需要更严格的匹配标准)。