我有基于 CentOS Linux 6 的软件路由器。我有 2 个本地网络,比如Local1
和Local2
。我有一个 Internet 连接,还有一个通过这个 Internet 连接运行的 VPN 连接。
我使用iptables
DHCP 服务器共享 Internet 连接。当我启用 VPN 时,Local1
流量Local2
都会通过 VPN,如果没有 VPN,两个本地网络都会直接连接到 Internet。
我的问题如下:如何设置基于 CentOS 的软件路由器以通过 VPN 转发一个本地网络并直接转发另一个本地网络?
答案1
我无法告诉你如何……但我可以从理论上告诉你。
最有可能的是,您的 VPN 仅由一个特定网络(或一组网络)组成。您可能希望设置拆分隧道,以伪造的方式说:“任何发往‘VPN 网络’的流量都将通过 VPN 连接。”然后您的 0.0.0.0 默认路由将全部设置为通过互联网连接出去。
我也相信优先级很重要。确保 VPN 网络的路由比默认路由具有更高的优先级。
答案2
首先,您必须更改 VPN 配置,不要将其自身设置为默认网关。这是什么 VPN?其次,您必须添加 iptables 规则,将流量从 Local2(eth0) 转发到 VPN(tun0) 例如:命令:iptables -I FORWARD -i eth0 -o tun0 -s 192.168.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
其次
iptables -t nat -I POSTROUTING -o tun0 -s 192.168.0.0/24 -j MASQUERADE
答案3
最后我找到了一种方法。需要使用iproute2
,但存在一些不明显的东西。
- 用于
ip rule
创建基于源的路由策略。 - 用于
ip route .... table
向基于源的路由策略添加 3 条路由:一条设置 Internet 默认网关,两条设置两个本地网络的网关。如果没有设置本地网络网关,则无法工作,可能是因为 OpenVPN 在路由表中进行了大量更改。 - 重要提示:
ip rule
和ip route
不会持续存在,因此规则在重启时会消失。通常使用rule-interface
和route-interface
文件来设置静态路由。但是,当您将这些文件与 DHCP 和/或 Wi-Fi 热点一起使用时,这些文件会出现问题。原因是这些文件与 DHCP 和初始化同时应用(因此有时在 DHCP 和hostapd
初始化之前)。这就是为什么这两个文件经常导致路由表不正确的原因。我rc.local
习惯在系统启动时使用命令行添加路由和规则,使用这种方法,我能够通过 VPN 路由一个本地 NIC,并直接路由另一个本地 NIC。
答案4
您需要使用未定义默认网关的 VPN,因此您的所有流量都将通过旧的默认网关。
然后,您可以添加将流量转发到 local1 子网的静态路由到 VPN 网关。