多个公共接口之间的 NAT(Internet 连接共享)切换

Ric*_*sen 7 networking iptables internet connection-sharing virtualbox

我的 Ubuntu 12.04(精确)笔记本电脑具有三个网络接口:

  1. eth0: 有线接口有时连接到互联网
  2. wlan0: 无线接口有时连接到互联网
  3. vboxnet0:连接到另一台计算机的有线接口(实际上是VirtualBox虚拟接口)(实际上是在host-only模式下联网的VirtualBox虚拟机)

我想iptables用来设置 NAT/IP 伪装以与另一台计算机共享任何已启动的 Internet 连接(如果两者都已启动,则首选有线连接)。

eth0插入时以下工作:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward &&
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE &&
sudo iptables -A FORWARD -i eth0 -o vboxnet0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT &&
sudo iptables -A FORWARD -i vboxnet0 -o eth0 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

如果我从有线切换到无线,这显然会停止工作。

我试过:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward &&
sudo iptables -t nat -A POSTROUTING -o '!vboxnet0' -j MASQUERADE &&
sudo iptables -A FORWARD -i '!vboxnet0' -o vboxnet0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT &&
sudo iptables -A FORWARD -i vboxnet0 -o '!vboxnet0' -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

但它没有用。我可以尝试执行一些网络管理器脚本来iptables在接口启动或关闭时更改规则,但我认为无需跳过此类问题也是可能的。

有什么建议?

Ale*_*ios 4

简单的

\n\n

这是一个非常简单的iptables规则集,它掩盖了一切。这适用于许多更简单的设置。如果该盒子作为一个成熟的路由器 \xe2\x80\x94 工作,它将无法工作,它有一个潜在的讨厌的习惯,即对离开计算机的所有流量进行 NAT。

\n\n
iptables -A POSTROUTING -o eth+ -t nat -j MASQUERADE\niptables -A POSTROUTING -o wlan+ -t nat -j MASQUERADE\n
Run Code Online (Sandbox Code Playgroud)\n\n

满的

\n\n

如果简单的解决方案不起作用,或者您的配置更复杂,则此规则集可能会有所帮助:

\n\n
NATIF=\'vboxnet+\'\nMARK=1\niptables -A PREROUTING -t mangle -i $NATIF -j MARK --set-mark $MARK\niptables -A POSTROUTING -o eth+ -t nat -m mark --mark $MARK -j MASQUERADE\niptables -A POSTROUTING -o wlan+ -t nat -m mark --mark $MARK -j MASQUERADE\n
Run Code Online (Sandbox Code Playgroud)\n\n

它标记通过任何接口传入的数据包vboxnet*,然后伪装 (SNAT) 任何传出eth*wlan*带有标记集的数据包。

\n\n

还有\xe2\x80\xa6

\n\n

除了iptables规则之外,您还需要通过启用数据包转发将主机变成路由器。放:

\n\n
net.ipv4.ip_forward=1\n
Run Code Online (Sandbox Code Playgroud)\n\n

/etc/sysctl.conf,然后说

\n\n
sudo sysctl -p /etc/sysctl.conf.\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者:

\n\n
echo 1 | sudo tee /proc/sys/net/ipv4_ip_forward\n
Run Code Online (Sandbox Code Playgroud)\n\n

来宾还必须有一个默认路由,通过主机的外部接口网关数据包(为此,仅主机模式可能无法工作)。检查其路由表(这取决于来宾操作系统)。

\n\n

另外,安装wiresharktshark并使用它们来检查数据包。没有更好的方法来解决像这样的一般网络问题。

\n\n

就我个人而言,我建议将来宾更改为使用桥接模式网络,并为其提供主机的两个接口。然后它可以自行连接,使用路由器上的 DHCP 服务自行获取本地地址。无需 NAT。

\n