So richten Sie die Portweiterleitung zur Gast-VM mit iptables ein

So richten Sie die Portweiterleitung zur Gast-VM mit iptables ein

Ich versuche, einen Proof of Concept für die Portweiterleitung zu einem Libvirt-Gastserver durchzuführen.

Die folgenden Variablen verwende ich zur Verallgemeinerung:

port=500                    # Arbitrary port, for proof of concept
public_if=wlp0s20f3         # My public interface, connected to the internet.
private_if=virbr0           # My private interface, through which the guest OS communicates
public_ip=192.168.0.11      # public interface's IP
private_ip=192.168.122.1    # private interface's IP
guest_ip=192.168.122.175    # Guest's IP

Der Gast ist einfach eine Ubuntu-Live-CD mit dem Befehl, der sudo nc -l 500 -kin einem Terminal ausgeführt wird. Ich teste mein Setup, indem ich ausführe nmap $public_ip -p $port. Wenn ich ausführe nmap $guest_ip -p $port, wird der Port als „offen“ angezeigt.

Natürlich scheint dies eine relativ einfache und gut dokumentierte Aufgabe zu sein, allerdings scheint keines der Tutorials, die ich ausprobiert habe, zu funktionieren.

Zunächst führe ich in allen Fällen Folgendes aus:echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Dann habe ich die folgenden Befehle ausprobiert, vondieses Tutorial:

sudo iptables -A FORWARD -i $public_if -o $private_if -p tcp --syn --dport $port -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i $public_if -o $private_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i $private_if -o $public_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -t nat -A PREROUTING -i $public_if -p tcp --dport $port -j DNAT --to-destination $guest_ip
sudo iptables -t nat -A POSTROUTING -o $private_if -p tcp --dport $port -d $guest_ip -j SNAT --to-source $private_ip

Dies funktioniert nicht. Danach sudo iptables -Fhabe ich auch die folgenden Befehle ausprobiert, vondiese Antwort:

sudo iptables -t nat -I PREROUTING -p tcp -d $public_ip --dport $port -j DNAT --to-destination $guest_ip:$port
sudo iptables -I FORWARD -m state -d $private_ip/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

Und es hat auch nicht funktioniert. Der Port bleibt am geschlossen $public_ip.

Zur Verdeutlichung: Ich führe diese Regeln aus, nachdem ich meinen Gast und den Mock-Server darauf gestartet habe.

Was mache ich möglicherweise falsch? Irgendwelche Vorschläge, wie ich das beheben kann?

Aktualisieren:

Ich habe versucht, die Paketerfassung sowohl auf dem Host als auch auf dem Gast auszuführen.

Auf dem Host:

sudo tcpdump -i $private_if

Absolut keine Ausgabe bei nmap $public_ip -p $port, aber es gibt eine Ausgabe, wenn nmap $guest_ip -p $port.

Zum Gast:

sudo tcpdump

Genau das Gleiche wie oben. Scheint darauf hinzudeuten, dass der Host schuld ist.

Antwort1

Das Problem ist, wie es getestet wird.

Die Ausführung nmap $public_ip -p $portauf dem Host ist nicht dasselbe wie die Ausführung auf einem anderen Rechner im Netzwerk. Am wichtigsten hierbei ist, dass das SYN-Paket nicht durch den PREROUTING-Hook geht, der das Paket an den Gast weiterleitet. Es geht nur durch die OUTPUT- und POSTROUTING-Hooks, und zwar in dieser Reihenfolge.

Zur Klarstellung: Der erste Zeilensatz funktioniert nicht. Der zweite Zeilensatz funktioniert.

verwandte Informationen