
Ich habe ein KVM-Setup mit mehreren Gast-VMs, auf denen Ubuntu läuft.
Aus irgendeinem Grund kann ich über Port 80 keinen Datenverkehr mehr von den Gästen nach außen leiten. Umgekehrt funktioniert es einwandfrei, der Apache liefert die gehosteten Webseiten wie vorgesehen. Andere Ports wie SSH funktionieren ebenfalls einwandfrei.
Hier ist ein Beispiel:
me@guest:~$ curl heise.de
curl: (7) Failed to connect to 2a02:2e0:3fe:100::8: Network is unreachable
Curl schlägt nach einem längeren Timeout mit „Netzwerk nicht erreichbar“ fehl und versucht scheinbar, die IPv6-Adresse zu verwenden, was es nicht tun soll. Curl funktioniert mit lokal gehosteten Domänen.
Ping funktioniert:
me@guest:~$ ping heise.de
PING heise.de (193.99.144.80) 56(84) bytes of data.
64 bytes from redirector.heise.de (193.99.144.80): icmp_req=1 ttl=245 time=6.92 ms
64 bytes from redirector.heise.de (193.99.144.80): icmp_req=2 ttl=245 time=7.05 ms
Da es bei allen meinen Gästen gleichzeitig passiert ist, denke ich, dass es etwas sein muss, was ich auf dem Host gemacht habe. Aber selbst wenn ich alle meine Homebrew-IPTables-Regeln deaktiviere, funktioniert es immer noch nicht.
Irgendwo im KVM/Libvirt-Netzwerk landen meine HTTP-Anfragen also dort, wo sie nicht hin sollten. Hier ist meine Netzwerkkonfiguration für KVM
<network>
<name>network_nat</name>
<uuid>....</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0' />
<mac address='52:54:00:30:9B:D6'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.128' end='192.168.100.254' />
<host mac='52:54:00:e4:71:f5' name='web' ip='192.168.100.210' />
</dhcp>
</ip>
</network>
Meine Gäste sind so konfiguriert, dass sie dieses Netzwerk verwenden. DHCP scheint zu funktionieren: Zumindest hat der Gast die von mir konfigurierte IP-Adresse.
Warum kann ich als Gast auf keine Websites zugreifen?
Antwort1
Ein Teil des Problems wurde nach einem Neustart behoben. Vielleicht liegt es daran, dass ich den folgenden Rat befolgt habe:http://wiki.libvirt.org/page/Networkinghat geholfen, die Netzwerkschnittstelle zu reparieren.
Ich habe diese Zeilen hinzugefügt zu/etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
Ich habe außerdem meine Schnittstellendefinition so geändert, dass /etc/network/interfaces
sie wie folgt aussieht:
auto br0
iface br0 inet static
address 176.9.xxx.xxx
broadcast 176.9.xxx.xxx
netmask 255.255.255.224
gateway 176.9.xxx.xxx
bridge_ports eth0
bridge_fd 0
bridge_maxage 0
bridge_stp off
Nach diesen beiden Änderungen (die vielleicht geholfen haben oder auch nicht) und einem Neustart trat bei curl kein Timeout und kein „Netzwerk nicht erreichbar“-Fehler mehr auf, sondern ein Ergebnis von meinem lokalen Apache. Es stellte sich heraus, dass meine eigene Portweiterleitung in iptables schuld war. Ich hatte keine eingehende Schnittstelle für die Portweiterleitung der Ports 80 und 443 angegeben. Ich fügte br0 hinzu und dann funktionierte alles einwandfrei.
Hier sind meine iptables-Regeln für die Portweiterleitung. Ich verwende dies in Kombination mit ufw als Firewall, daher habe ich diese Zeilen am Ende von/etc/ufw/before.rules
Dieses wird der Filtertabelle hinzugefügt:
-I FORWARD -m state -d 192.168.100.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
--in-interface
Und das ist meine Nat-Tabelle. Der Fehler bestand darin, den Parameter wegzulassen :
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 12345 -j DNAT --to 192.168.100.210:22
-A PREROUTING -p tcp --in-interface br0 --dport 80 -j DNAT --to 192.168.100.210:80
-A PREROUTING -p tcp --in-interface br0 --dport 443 -j DNAT --to 192.168.100.210:443
-A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
COMMIT
(Hinweis: Aus irgendeinem Grund führt das manuelle Eingeben dieser Regeln bei deaktiviertem UFW nicht zu einer funktionierenden Portweiterleitungskonfiguration.)