当tun0不是系统默认路由时,如何将流量从br0路由到tun0

当tun0不是系统默认路由时,如何将流量从br0路由到tun0

我有一个桥接网络br0有IP的10.0.0.1/24,我有一个客户端与该IP连接10.0.0.2到它。我也有 VPN 连接(屯0)具有由 DHCP 分配的 IP,因此其 IP 可能会有所不同。 VPN连接不是系统的默认路由,因此设备上的所有流量都经过常规路由以太网0路由(不是 VPN 路由)。 (主机上启用IPv4转发)

我想要实现的是任何连接到的客户端br0(在我的例子中是 LXC 容器),网关设置为10.0.0.1应通过 VPN 连接对其流量进行 NAT 和路由。

由于无法直接粘贴屯0设备到br0,我尝试使用以下方式转发流量iptables

所以我认为我必须采取的步骤是强制流量br0伪装然后转发到屯0通过使用这些命令:

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i br0 -o tun0 -j ACCEPT

我还添加了状态跟踪,但它不起作用:

iptables -A INPUT -i br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

为了添加辅助默认路由,我在文件“/etc/iproute2/rt_tables”中添加了“1 vpnout”条目,并添加了默认路由:

ip route add default dev vpn-out table vpnout

这不起作用,并且与下一个命令的结果相同

ip route add default via dev vpn-out table vpnout
ip rule add from 10.0.0.0/24 table vpnout
ip rule add to 10.0.0.0/24 table vpnout

但在那之后我仍然无法 ping 通8.8.8.8从连接到的客户端br0。我错过了什么吗?

答案1

所以最后在@Fiisch的建议下我终于找到了丢失的设置。

这是使其工作的最终命令:

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i br0 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o br0 -j ACCEPT

iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

ip route add default dev tun0 table vpnout
ip route add 10.0.0.0/24 dev br0 table vpnout

ip rule add from 10.0.0.0/24 table vpnout
ip rule add to 10.0.0.0/24 table vpnout

相关内容