Networking
多個公共介面之間的 NAT(Internet 連接共享)切換
我的 Ubuntu 12.04(精確)筆記型電腦具有三個網路介面:
eth0
:有線介面有時連接到網際網路wlan0
:無線介面有時連接到網際網路vboxnet0
:有線介面(實際上是VirtualBox虛擬介面)連接到另一台電腦(實際上是VirtualBox虛擬機,在host-only模式下聯網)我想
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
介面啟動或關閉時更改規則,但我認為無需跳過這樣的障礙是可能的。有什麼建議?
簡單的
這是一個非常簡單的
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。