Ich kann über 213.xxx.xxx.1
die Zuweisung auf den Host zugreifen br0:1
, aber die VM mit 213.xxx.xxx.2
(Bridge-Schnittstelle ein br0:1
) funktioniert nicht.
Muss ich für das zweite Subnetz noch ein weiteres Bridgeinterface anlegen, bond0
mit dem dann aber schon eine Verbindung hergestellt ist br0
?!
Wie kann ich in diesem Szenario grundsätzlich das zweite Subnetz für VMs verwenden?
Subnetze:
213.xxx.xxx.176/28
213.xxx.xxx.0/27 routed via 213.xxx.xx.180
Aufstellen:
em[1-2]
# cat /etc/sysconfig/network-scripts/ifcfg-em[1-2]
DEVICE="em[1-2]"
NAME="bond0-slave[1-2]"
BOOTPROTO="none"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
USERCTL=no
IPV6INIT=no
PEERDNS=no
MASTER=bond0
SLAVE=yes
Bindung0
# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE="bond0"
NAME="bond0"
BOOTPROTO="none"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Bond"
USERCTL="no"
IPV6INIT="no"
PEERDNS="no"
BONDING_OPTS="mode=active-backup miimon=100"
BRIDGE=br0
br0
# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
NAME="br0"
BOOTPROTO="none"
IPADDR="213.xxx.xxx.180"
GATEWAY="213.xxx.xxx.177"
NETMASK="255.255.255.240"
BROADCAST="213.xxx.xxx.191"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Bridge"
USERCTL="no"
IPV6INIT="no"
PEERDNS="no"
br0:1
# cat /etc/sysconfig/network-scripts/ifcfg-br0:1
DEVICE="br0:1"
NAME="br0:1"
BOOTPROTO="none"
IPADDR="213.xxx.xxx.1"
NETMASK="255.255.255.224"
BROADCAST="213.xxx.xxx.31"
NM_CONTROLLED="yes"
#ONBOOT="yes"
TYPE="Bridge"
USERCTL="no"
IPV6INIT="no"
PEERDNS="no"
ONPARENT="yes"
Update Mi 18 Jan 16:25:17 GMT 2017:
<interface type='bridge'>
<mac address='52:54:00:4c:4f:27'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
Update Dienstag, 24. Januar 2017, 11:44:21 GMT:
VM-Netzwerk-Setup:
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
IPADDR="213.xxx.xxx.2"
PREFIX="27"
GATEWAY="213.xxx.xxx.177" <-- not sure if this should be 213.xxx.xxx.180 instead?!
IPTables auf dem Host:
# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:68
# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
RETURN all -- 192.168.122.0/24 224.0.0.0/24
RETURN all -- 192.168.122.0/24 255.255.255.255
MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
Es funktioniert, wenn ich auf der VM ein Standard-Gateway auf 213.xxx.xxx.1 einstelle (IP von br0:1 auf dem Host) – ich bin nicht sicher, warum ich nicht einfach dasselbe Standard-Gateway wie beim Host (213.xxx.xxx.177) verwenden kann.
Ich musste auch IPTables leeren, also muss ich herausfinden, welche Regeln erforderlich sind.
Ich bekomme auch eine Umleitung, wenn ich von einer VM aus pinge, daher bin ich nicht sicher, ob diese Konfiguration optimal ist:
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 213.xxx.xxx.1: icmp_seq=1 Redirect Host(New nexthop: 213.xxx.xxx.177)
From 213.xxx.xxx.1 icmp_seq=1 Redirect Host(New nexthop: 213.xxx.xxx.177)
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=7.26 ms
...
Update Dienstag, 24. Januar 2017, 14:49:43 GMT:
Ich bin nicht sicher, warum IPTables tatsächlich Pakete filtert, die die Brücke passieren, auch wenn br_netfilter
das Modul nicht geladen ist
# lsmod | grep "br_netfilter"; echo $?
1
# test -d /proc/sys/net/bridge; echo $?
1
Auch diese Regel hat nicht geholfen:
# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
Antwort1
Lösung, die „die Frage beantwortet“:
- Stellen Sie sicher, dass die IP-Weiterleitung auf dem Host aktiviert ist. Wenn
cat /proc/sys/net/ipv4/ip_forward
sie nicht 1 ist, sehen Sie auf dieser Site nach, wie Sie sie ändern können. - Ändern Sie das VM-Gateway zur Host-IP im VM-Subnetz: 213.xxx.xxx.1
- Reparieren Sie Ihre defekte iptable-Konfiguration.
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
Sieht gut aus. Ändern Sie sie eventuell in etwas Linkiptables -I FORWARD -s 213.xxx.xxx.0/27 -j ACCEPT
(das heißt: akzeptieren Sie den gesamten Datenverkehr vom VMS-Netzwerk zu einem anderen Netzwerk).
Die Idee dieser Lösung besteht darin, Ihren Host als Gateway für das VM-Netzwerk zu verwenden. Wenn Sie bereits ein anderes Gateway im Netzwerk 213.xx0 ( 213.xxx.xx.180 ) haben, können Sie es natürlich direkt von Ihren VMs aus verwenden.
Die vorgeschlagene iptables-Konfiguration erlaubt Datenverkehr von den VMs nach außen. Wenn Sie Verbindungen von außen zu den VMs zulassen möchten, müssen Sie eine Regel wie folgt festlegen:iptables -I FORWARD -d 213.xxx.xxx.0/27 -j ACCEPT
Empfohlene Lösung: Bedenken Sie, dass das alles wahrscheinlich nur ein Durcheinander ist, weil die Frage so gestellt wird. In der Praxis sollten Sie den einfachen Weg wählen, wenn Sie einen Router/eine Firewall haben, der/die Ihre beiden Subnetze verwaltet: - Der Router/die Firewall hat in jedem Subnetz eine IP-Adresse. Er/sie ist das Gateway für alle Hosts in den Subnetzen. - Weisen Sie jedem Subnetz ein VLAN zu. - Auf Ihrem Host haben Sie zwei Schnittstellen und zwei Bridges. - Ihre VMs werden im „VMs-Subnetz“ überbrückt und verwenden die Firewall als Gateway.
Auf diese Weise haben Sie keine verrückte iptables-/Alias-/Weiterleitungskonfiguration. Sie haben einige Hosts in einem Subnetz und andere in dem anderen Subnetz und das Routing/die ACLs/die NATs sind in Ihrer Firewall konfiguriert. Sie sollten Ihrem Host nicht einmal eine IP-Adresse im „VM-Netzwerk“ zuweisen.
Das Zusammenführen zweier Netzwerke in derselben Broadcast-Domäne kann Probleme verursachen. Wenn Sie sich bei der Netzwerkkonfiguration nicht besonders gut auskennen, sollten Sie die Konfiguration mehrerer IP-Adressen auf einem Host vermeiden.
Antwort2
Aus Wikipedia:
Ein Standard-Gateway in einem Computernetzwerk ist der Knoten, von dem angenommen wird, dass er weiß, wie Pakete an andere Netzwerke weitergeleitet werden.
Das bedeutet, dass der Gateway-Knoten ein Knoten im Netzwerk oder Subnetz sein muss. Sie verwenden zwei Subnetze auf einer Schnittstelle br0
213.xxx.xxx.0/27
und 213.xxx.xxx.176/28
.
Es gibt einen Gateway-Host 213.xxx.xxx.177
im Netzwerk 213.xxx.xxx.176/28
. Und Ihr Host-Server erhält über dieses Gateway Internetzugriff. Ich denke, der Gateway-Host 213.xxx.xxx.177
ist ein Router und dieser Router ist kein Mitglied (Knoten) des Subnetzes 213.xxx.xxx.0/27
. Aber er weiß, dass das Subnetz 213.xxx.xxx.0/27
über den Knoten (Ihren Host-Server) zugänglich ist 213.xxx.xxx.180
.
Ihre VM hat die falsche Gateway-Adresse. Wenn die VM eine IP-Adresse hat, 213.xxx.xxx.2/27
muss die VM eine Gateway-Adresse aus demselben Subnetz haben 213.xxx.xxx.0/27
. Aus diesem Grund muss die VM eine Gateway-Adresse haben 213.xxx.xxx.1
, die Ihr Hostserver als sekundäre IP-Adresse auf br0
der Schnittstelle hat.
Wenn Sie eine VM im Subnetz erstellen, 213.xxx.xxx.176/28
müssen Sie ihr dieselbe Gateway-IP zuweisen 213.xxx.xxx.177
wie Ihrem Hostserver. Stellen Sie sicher, dass diese IP nicht bereits irgendwo verwendet wird.
Zusätzlich:
Löschen Sie alle iptables-Regeln wie unterHier
Zuvor muss der iptables-Dienst gestartet werden. Starten Sie den iptables-Dienst nach dem Löschen neu, um gelöschte Regeln auf der Festplatte zu speichern.