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 -k
in 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 -F
habe 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 $port
auf 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.