Networking

多個公共介面之間的 NAT(Internet 連接共享)切換

  • May 23, 2012

我的 Ubuntu 12.04(精確)筆記型電腦具有三個網路介面:

  1. eth0:有線介面有時連接到網際網路
  2. wlan0:無線介面有時連接到網際網路
  3. 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

來賓還必須有一個預設路由,該路由通過主機的外部介面對數據包進行網關處理(為此,主機模式可能無法正常工作)。檢查其路由表(這取決於客戶作業系統)。

此外,安裝wiresharktshark使用它們來檢查數據包。沒有更好的方法來解決像這樣的通用網路問題。

就個人而言,我建議將訪客更改為使用橋接模式網路,並使其兩個主機介面都可用。然後它可以自行連接,使用路由器上的 DHCP 服務自行獲取本地地址。不需要 NAT。

引用自:https://unix.stackexchange.com/questions/38822