Puedo acceder al host a través de 213.xxx.xxx.1
la máquina virtual asignada, br0:1
pero con 213.xxx.xxx.2
(interfaz puente activada br0:1
) no funciona.
¿Tengo que crear otra interfaz puente para la segunda subred, pero luego bond0
ya 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_netfilter
el 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":
- 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 - Cambie la puerta de enlace de VM a la IP del host en la subred de VM: 213.xxx.xxx.1
- Arregle su configuración de iptable rota.
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
Se ve bien. Eventualmente cámbielo a algún enlaceiptables -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/27
y 213.xxx.xxx.176/28
.
Hay un host de puerta de enlace 213.xxx.xxx.177
en 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.177
es un enrutador y este enrutador no es miembro (nodo) de la subred 213.xxx.xxx.0/27
. Pero sabe que 213.xxx.xxx.0/27
se 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 br0
la interfaz.
Si va a crear una máquina virtual en una subred, 213.xxx.xxx.176/28
debe asignarle la misma IP de puerta de enlace 213.xxx.xxx.177
que 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.