
Das hier hat mich verwirrt:
Ich habe eine pfSense-Firewall (nennen wir sie pfs
) und dahinter mehrere Server. Ich verbinde mehrere Dienste von meiner öffentlichen IP per NAT mit verschiedenen Servern im LAN, ohne dass es zu Problemen kommt.
Auf einem der Server (nennen wir ihn s1
) betreibe ich eine vagrant
(mit libvirt
) VM (nennen wir sie v1
) mit einemöffentlichNetzwerk konfiguriert, welches die IP 192.168.1.159
über pfs
einen DHCP-Server bezieht.
Jetzt konfiguriere ich ein einfaches NAT auf , um auf das SSH von pfs
zuzugreifen , und greife beispielsweise auf darauf zu . Kein Problem.s1
<wan>:6622 -> s1:22
mydomain.com:6622
Ich kann auch mit einem gültigen SSH-Benutzer auf v1:22
(oder das Äquivalent ) zugreifen192.168.1.159:22
aus dem LANohne Problem.
Jetzt füge ich ein einfaches NAT hinzu pfs
, sagen wir <wan>:6722 -> v1:22
. Jetzt versuche ich aufmydomain.com:6722
nichtarbeiten?!
Das Ziel besteht darin, noch „eine weitere Ebene“ hinzuzufügen: Container mit öffentlichen Ports auszuführen, zB --publish 9980:80
auf v1
und auf sie zuzugreifen, zB v1:9980
und von mydomain.com:9980
mit dem entsprechenden NAT auf pfs
wie <wan>:9980 -> v1:9980
.Aus dem LANdies funktioniert auch wie erwartet (dh ich kann v1:9980
vom LAN aus zugreifen), über NAT jedoch pfs
nicht.
Ich habe ähnliche Setups, die innerhalb desselben Netzwerks auf verschiedenen Maschinen ohne Probleme funktionieren. Ich habe sogar eine andere (nicht vagrante, aber auch libvirt
) VM, auf s1
die ich über NAT über meine öffentliche IP problemlos SSH herstellen kann. Aber irgendwie funktioniert das oben genannte mit der vagrant
Maschine nicht, und ich bin wirklich ratlos, was dieses Problem verursachen könnte. (FWIW: Ich habe net.ipv4.forward
es auf aktiviert v1
).
BEARBEITEN:
Ich bin einen Schritt näher gekommen: Wenn ich die erste vorhandene Netzwerkkarte der vagrant
VM mit lösche virt-manager
und die zweite VM auf rtl8139
anstelle von einstelle virtio
(und dann neu starte), verliere ich vagrant ssh
die Funktionalität, aber NAT funktioniert dann. Die Frage ist also: Wie konfiguriere ich über vagrant
Provisioning so, dass wir eine ähnliche Konfiguration haben? Ich nehme an, das bedeutet dann, dass das öffentliche Netzwerk auf der Standardschnittstelle sein muss?
Antwort1
Lösung:
Der Grund dafür ist, dass vagrant
die lokale Schnittstelle (privates Netzwerk) als primäre Schnittstelle benötigt wird (und daher konfiguriert wird), ohne dass es eine Standardmethode gibt, um dies zu überschreiben. (Einige Informationen sindHier, aber die vagrant
Leute geben zu, dass sie selbst von dem Thema verwirrt sind …)
Eine (robustere) Variante des Konzepts zur Optimierung der Standardrouten brachte die Lösung. Ich verwende einen ansible
Provisioner, in dem ich Folgendes ausführe (auf dem Gast über das Provisioning-Playbook):
- name: remove wrong default route on eth0 (again)
shell: |
eval $(route -n | awk '$0~/[.0]{4}/ && $3~/[.0]{4}/ && $8~/eth0/ { printf "ip route del default via %s dev %s; ",$3,$8 }')
(Interessanterweise muss es zweimal ausgeführt werden (oder nach einer Weile?), möglicherweise, weil das Netzwerk noch nicht vollständig hochgefahren war, als das Bereitstellungsskript gestartet wurde?)
Dadurch wird die Standardroute auf entfernt eth0
(die nur automatisch von public_network
konfiguriert wird ) und externe Verbindungen funktionieren wie erwartet. Dies liegt vermutlich (hier wird spekuliert) daran, dass Antworten auf eingehende NAT-Anfragen standardmäßig über die Standardroute auf an die Firewall weitergeleitet werden (die standardmäßig Priorität hat), was die NAT-FW verwirrt, da sie über die VM eingegangen ist . Daher werden standardmäßig Antworten auf externe Anfragen auf derselben Schnittstelle entfernt , über die sie eingegangen sind.eth1
vagrant
eth0
vagrant
eth1
eth0