我的 Ubuntu 12.04(精确)笔记本电脑具有三个网络接口:
eth0
:有线接口有时连接到互联网wlan0
:无线接口有时连接到互联网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
如果我从有线切换到无线,这显然会停止工作。
我试过:
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
但它不起作用。我可以尝试执行一些网络管理器脚本来在接口启动或关闭时更改规则iptables
,但我认为无需跳过这些障碍也是可能的。
有什么建议么?
答案1
简单的
这是一个非常简单的iptables
规则集,它掩盖了一切。这适用于许多更简单的设置。如果该盒子作为一个成熟的路由器工作,它就无法工作——它有一个潜在的令人讨厌的 NAT 习惯全部离开您计算机的流量。
iptables -A POSTROUTING -o eth+ -t nat -j MASQUERADE
iptables -A POSTROUTING -o wlan+ -t nat -j MASQUERADE
满的
如果简单的解决方案不起作用,或者您的配置更复杂,则此规则集可能会有所帮助:
NATIF='vboxnet+'
MARK=1
iptables -A PREROUTING -t mangle -i $NATIF -j MARK --set-mark $MARK
iptables -A POSTROUTING -o eth+ -t nat -m mark --mark $MARK -j MASQUERADE
iptables -A POSTROUTING -o wlan+ -t nat -m mark --mark $MARK -j MASQUERADE
它标记通过任何接口进入的数据包vboxnet*
,然后伪装(SNAT)任何出去的eth*
或wlan*
带有标记的数据包。
还…
除了iptables
规则之外,您还需要通过启用数据包转发将主机变成路由器。放:
net.ipv4.ip_forward=1
中/etc/sysctl.conf
,然后说
sudo sysctl -p /etc/sysctl.conf.
或者:
echo 1 | sudo tee /proc/sys/net/ipv4_ip_forward
来宾还必须有一个默认路由,通过主机的外部接口网关数据包(为此,仅主机模式可能无法工作)。检查其路由表(这取决于来宾操作系统)。
另外,安装wireshark
或tshark
并使用它们来检查数据包。没有更好的方法来解决像这样的一般网络问题。
就我个人而言,我建议更改来宾使用桥接模式网络并使其可以使用主机的两个接口。然后它可以自行连接,使用路由器上的 DHCP 服务自行获取本地地址。无需 NAT。