NAT (Internet Connection Sharing), das zwischen mehreren öffentlichen Schnittstellen wechselt

7

Mein Ubuntu 12.04 (präziser) Laptop verfügt über drei Netzwerkschnittstellen:

  1. eth0: Kabelschnittstelle manchmal mit dem Internet verbunden
  2. wlan0: Drahtlose Schnittstelle manchmal mit dem Internet verbunden
  3. vboxnet0: Kabelgebundene Schnittstelle (eigentlich eine virtuelle VirtualBox-Schnittstelle), die mit einem anderen Computer verbunden ist (tatsächlich eine virtuelle VirtualBox-Maschine mit Netzwerk im Nur-Host-Modus)

Ich möchte iptablesNAT / IP-Maskerading einrichten, um die Internetverbindung (die verkabelt ist, wenn beide aktiv sind) mit dem anderen Computer zu teilen.

Folgendes funktioniert, wenn es angeschlossen eth0ist:

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

Wenn ich von kabelgebunden zu kabellos wechsle, funktioniert dies offensichtlich nicht mehr.

Ich habe es versucht:

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

aber es hat nicht funktioniert. Ich könnte versuchen, einige Network Manager-Skripte zu iptableserstellen , um die Regeln zu ändern , wenn eine Schnittstelle nach oben oder unten geht, aber ich dachte, es wäre möglich, ohne durch solche Rahmen zu springen.

Irgendwelche Vorschläge?

Richard Hansen
quelle

Antworten:

4

Einfach

Hier ist ein sehr einfacher iptablesRegelsatz, der alles maskiert. Dieser funktioniert für viele einfachere Setups. Es funktioniert nicht, wenn die Box als vollwertiger Router funktioniert - es hat möglicherweise die unangenehme Angewohnheit, den gesamten Datenverkehr, der Ihren Computer verlässt, zu NATen .

iptables -A POSTROUTING -o eth+ -t nat -j MASQUERADE
iptables -A POSTROUTING -o wlan+ -t nat -j MASQUERADE

Voll

Wenn die einfache Lösung nicht funktioniert oder Ihre Konfiguration komplexer ist, kann dieser Regelsatz hilfreich sein:

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

Es markiert Pakete, die über eine beliebige vboxnet*Schnittstelle eingehen, und maskiert dann (SNAT) alle Pakete, die aus eth*oder wlan*mit dem Markierungssatz ausgehen.

Ebenfalls…

Zusätzlich zu den iptablesRegeln müssen Sie Ihren Host-Computer in einen Router verwandeln, indem Sie die Paketweiterleitung aktivieren. Stellen:

net.ipv4.ip_forward=1

in /etc/sysctl.conf, dann sag

sudo sysctl -p /etc/sysctl.conf.

Alternative:

echo 1 | sudo tee /proc/sys/net/ipv4_ip_forward

Der Gast muss außerdem über eine Standardroute verfügen, über die Pakete über die externen Schnittstellen des Hosts gateways werden (und aus diesem Grund funktioniert der Nur-Host-Modus möglicherweise nicht). Überprüfen Sie die Routing-Tabelle (dies hängt vom Gastbetriebssystem ab).

Installieren wiresharkoder tsharkverwenden Sie sie auch, um Pakete zu untersuchen. Es gibt keinen besseren Weg, um allgemeine Netzwerkprobleme wie dieses zu lösen.

Persönlich würde ich vorschlagen, den Gast so zu ändern, dass er ein Bridged-Mode-Netzwerk verwendet, und ihm beide Schnittstellen des Hosts zur Verfügung zu stellen. Anschließend kann es über den DHCP-Dienst Ihres Routers eine eigene Verbindung herstellen, um selbst eine lokale Adresse zu erhalten. Kein NAT erforderlich.

Alexios
quelle
Ich werde es mit der einfacheren Lösung aktualisieren, aber ich würde lieber beide behalten, wenn es Ihnen nichts ausmacht. Die Methode ohne Markierungen (sic) funktioniert für viele einfache Konfigurationen einwandfrei, schlägt jedoch in komplexeren Fällen heimtückisch fehl. So habe ich es schließlich zum ersten Mal benutzt. :)
Alexios
1
sollte nicht $MASKsein $MARK?
Richard Hansen