Puente KVM sobre unión con múltiples subredes

Puente KVM sobre unión con múltiples subredes

Puedo acceder al host a través de 213.xxx.xxx.1la máquina virtual asignada, br0:1pero con 213.xxx.xxx.2(interfaz puente activada br0:1) no funciona.

¿Tengo que crear otra interfaz puente para la segunda subred, pero luego bond0ya está conectada br0?

Básicamente, ¿cómo puedo usar la segunda subred para máquinas virtuales en este escenario?

Subredes:

213.xxx.xxx.176/28
213.xxx.xxx.0/27 routed via 213.xxx.xx.180

Configuración:

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

bono0

# 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"

Actualización miércoles 18 de enero a las 16:25:17 GMT de 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>

Actualización martes 24 de enero a las 11:44:21 GMT de 2017:

Configuración de red de máquina virtual:

# 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 en el 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

Funciona cuando configuro una puerta de enlace predeterminada en 213.xxx.xxx.1 en la máquina virtual (IP de br0:1 en el host). No estoy seguro de por qué no puedo usar la misma puerta de enlace predeterminada que el host (213.xxx.xxx). .177).

También tuve que vaciar IPTables, por lo que necesito averiguar qué reglas son necesarias.

También recibo una redirección cuando hago ping desde la máquina virtual, por lo que no estoy seguro de si esta configuración es óptima:

# 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
...

Actualización martes 24 de enero a las 14:49:43 GMT de 2017:

No estoy seguro de por qué IPTables filtra los paquetes que atraviesan el puente incluso si br_netfilterel módulo no está cargado

# lsmod | grep "br_netfilter"; echo $?
1
# test -d /proc/sys/net/bridge; echo $?
1

Esta regla tampoco ayudó:

# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT

Respuesta1

Solución que "responde a la pregunta":

  1. Asegúrese de que el reenvío de IP esté habilitado en el host si cat /proc/sys/net/ipv4/ip_forward no es 1, busque en este sitio cómo cambiarlo
  2. Cambie la puerta de enlace de VM a la IP del host en la subred de VM: 213.xxx.xxx.1
  3. Arregle su configuración de iptable rota. iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPTSe ve bien. Eventualmente cámbielo a algún enlace iptables -I FORWARD -s 213.xxx.xxx.0/27 -j ACCEPT(esto significa: acepte todo el tráfico de la red vms a otra red)

La idea de esta solución es utilizar su host como puerta de enlace para la red vm. Obviamente, si ya tiene otra puerta de enlace en la red 213.xx0 (213.xxx.xx.180), puede usarla directamente desde su máquina virtual.

La configuración de iptables sugerida permitirá el tráfico desde las máquinas virtuales hacia el exterior. Si desea permitir conexiones desde el exterior a las máquinas virtuales, debe establecer una regla que se parezca aiptables -I FORWARD -d 213.xxx.xxx.0/27 -j ACCEPT

Solución recomendada: tenga en cuenta que probablemente todo esto sea un desastre debido a la forma en que se formula la pregunta. En el mundo real, si tiene un enrutador/firewall que administra sus dos subredes, debe tomar el camino más fácil: - el enrutador/firewall tendrá una dirección IP en cada subred. Será una puerta de enlace para todos los hosts en las subredes - asigne una VLAN a cada subred - en su host tendrá 2 interfaces y puentes - sus máquinas virtuales se conectarán en la "subred de máquinas virtuales" y usarán el firewall como puerta de enlace

De esta manera no tendrás una configuración loca de iptables/alias/reenvío. Tendrá algunos hosts en una subred y otros en la otra subred, y el enrutamiento/acls/nats configurado en su firewall. Ni siquiera deberías asignar una dirección IP en la "red vm" a tu host.

Fusionar dos redes en el mismo dominio de transmisión es una fuente de problemas, y debe evitar configurar múltiples direcciones IP en un host si no tiene mucha confianza en la configuración de la red.

Respuesta2

De Wikipedia:

Una puerta de enlace predeterminada en las redes de computadoras es el nodo que se supone que sabe cómo reenviar paquetes a otras redes.

Significa que el nodo de puerta de enlace debe ser un nodo en la red o subred. Utiliza dos subredes en una interfaz br0 213.xxx.xxx.0/27y 213.xxx.xxx.176/28.

Hay un host de puerta de enlace 213.xxx.xxx.177en la red 213.xxx.xxx.176/28. Y su servidor host obtiene acceso a Internet a través de esta puerta de enlace. Creo que el host de puerta de enlace 213.xxx.xxx.177es un enrutador y este enrutador no es miembro (nodo) de la subred 213.xxx.xxx.0/27. Pero sabe que 213.xxx.xxx.0/27se puede acceder a la subred a través del nodo 213.xxx.xxx.180(su servidor host).

Su VM tiene una dirección de puerta de enlace incorrecta. Si la VM tiene una dirección IP 213.xxx.xxx.2/27, entonces la VM debe tener una dirección de puerta de enlace de la misma subred 213.xxx.xxx.0/27. Es por eso que la VM debe tener una dirección de puerta de enlace 213.xxx.xxx.1, que su servidor host tiene como dirección IP secundaria en br0la interfaz.

Si va a crear una máquina virtual en una subred, 213.xxx.xxx.176/28debe asignarle la misma IP de puerta de enlace 213.xxx.xxx.177que en su servidor host. Asegúrese de que esta IP no se utilice en ninguna parte.

Además:

Borre todas las reglas de iptables como se describe enaquí

Antes de hacer esto se debe iniciar el servicio iptables. Reinicie el servicio iptables después de borrarlo para almacenar las reglas borradas en el disco.

información relacionada