Parece que tengo algunos malentendidos fundamentales sobre cómo funcionan las VLAN en Linux, y espero que las buenas personas aquí puedan educarme.
Reparto: un Cisco 3560, una VLAN y una caja de Linux [1].
Cisco --------------- Linux
ge0/1 eth0
Cisco tiene una interfaz Vlan 37, con dirección IP 10.40.37.252/24. Quiero colocar 10.40.37.1/24 en el cuadro de Linux.
Cuando Cisco desencapsula vlan 37, todo funciona bien [2]:
# Cisco
interface Vlan37
ip address 10.40.37.252/24
interface GigabitEthernet 0/1
switchport mode access
switchport access vlan 37
# Linux
ip link set eth0 up
ip addr add 10.40.37.1/24 dev eth0
$ ping 10.40.37.252 && echo It works
Sin embargo, cuando configuro el puerto para trunking y asigno vlan 37 en el lado de Linux, deja de funcionar:
# Cisco
interface GigabitEthernet 0/1
switchport trunk encapsulation dot1q
switchport mode trunk
! [3] [4] [7]
# Linux
vconfig add eth0 37
ip link set eth0.37 up
ifconfig eth0 0.0.0.0 up # ensure no address
ip addr add 10.40.37.1/24 dev eth0.37
$ ping 10.40.37.252 || echo Why does this not work
¿Que me estoy perdiendo aqui?
Editar: Soluciones:
La pregunta de Shane sobre la tabla de direcciones mac me llevó a una solución: usar "ip addr" para configurar diferentes direcciones L2 (MAC) únicas en cada una de las subinterfaces VLAN, y de repente funciona.
Otra posible solución que no probé (porque mi hardware es demasiado antiguo) es usar "ethtool" para deshabilitar la descarga de VLAN por la NIC y obligar al kernel a manejar las etiquetas.
Gracias Shane!
Editar: Más información según los comentarios:
El objetivo general es tener tres vlans (público, privado, oam & p) que terminen en tres direcciones IP individuales en el cuadro de Linux, con diferentes aplicaciones vinculadas a las direcciones locales. Puedo ampliar aún más si es necesario, pero estoy tratando de mantener la descripción y discusión del problema simple, ya que antes de que pueda tener tres vlans funcionando, necesito uno para que funcione. :)
Antoine -> ifup versus ifconfig no hace ninguna diferencia.
Pepoluan -> Supongo que esto es lo que estabas buscando. Tenga en cuenta que la falta de referencias de los controladores phy es aparentemente normal. [5]
$ lsmod | grep 802
8021q 25545 1 cxgb3
Manitas ->
$ ifconfig eth0
eth0 Link encap: Ethernet HWaddr 00:17:08:92:87:22
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 [...]
TX packets:31932 errors:0 dropped:0 overruns:0 carrier:0
$ ifconfig eth0.37
eth0.37 Link encap: Ethernet HWaddr 00:17:08:92:87:22
UP BROADCAST RUNNING MULTICAST MUT:1500 Metric:1
RX packets: 0 [...]
TX packets:32024 errors:90 dropped:0 overruns:0 carrier:0
$ cat /proc/net/vlan/config
VLAN Dev Name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
eth0.37 | 37 | eth0
Chuck -> wireshark y / o tcpdump no muestran las etiquetas, pero esto aparentemente es una limitación normal en Linux, debido al orden de procesamiento del manejo de vlan y pcap en el kernel [6]. Además, la VLAN sin etiquetar se establece en 1 [7].
[1] He intentado esto con CentOS 5.5 y Ubuntu 11.04, y ambos tienen el mismo problema.
[2] Tenga en cuenta que las configuraciones no son cortar y pegar, por lo que cualquier error tipográfico aquí es simplemente mi mala memoria.
[3] "no negociar" activado o desactivado no tiene ningún efecto sobre el problema.
[4] Vlan 37 se muestra como activo y no podado en el enlace, por lo que "permitido" no es el problema.
[5] serverfault: Habilitando 8021q en un nic
[6] http://wiki.wireshark.org/CaptureSetup/VLAN#Linux
[7] La VLAN nativa (sin etiquetar) es 1. La configuración manual con "switchport trunk native vlan 1" no tiene ningún efecto.
lsmod
en el cuadro de Linux?ifconfig eth0.37
yifconfig -a
cómo se ve?/proc/net/vlan/config
?sho mac address-table vlan 37
?Respuestas:
¿Desea que el host tenga acceso a solo vlan 37 o desea que el host tenga acceso a múltiples vlans?
Esta configuración de IOS significa establecer el vlan nativo (sin etiqueta) en 37.
En el lado de Linux, el comando vconfig crea un alias de interfaz para el tráfico etiquetado como vlan 37.
¿Ves el problema? El conmutador está enviando a su host tráfico sin etiquetar y el host está buscando / generando tráfico etiquetado.
Solo necesita usar eth0 en el vlan 37 nativo o cambiar la configuración del conmutador para que pase tráfico etiquetado, por ejemplo.
En dispositivos IOS bastante antiguos, usted debe configurar la encapsulación del camión en 8021q, ya que su valor predeterminado será ISL.
fuente
switch port mode access
también eliminará todas las etiquetas 802.1q en el tráfico de salida. Es por eso que ha tenido que recurrir a jugar con las direcciones MAC para que la comunicación funcione. Sin los destinos con direcciones MAC diferentes, todos terminaban en la interfaz vlan nativa ya que los paquetes llegan al host Linux sin etiquetas vlan .Ahora, no soy un experto en el lado de Linux de esto, según mi conocimiento de Switching, ¿tiene la interfaz eth0 en la máquina Linux configurada para el enlace troncal dot1q? No sé si existe una disposición para que múltiples vlans funcionen dentro de una máquina Linux, pero supongo que tiene una única interfaz que está configurada para funcionar como parte de Vlan37, lo que hace que la NIC de su máquina Linux sea un puerto de acceso. Un puerto de acceso no puede comunicarse directamente con un puerto troncal, no podrá crear o comprender la encapsulación de enlace troncal.
Por lo que entiendo, desea que la máquina Linux funcione dentro de Vlan 37. Simplemente revierta el puerto ge0 / 1 para que sea un puerto de acceso bajo Vlan37 y asigne rutinariamente a la máquina Linux cualquier IP bajo la subred de Vlan37. Realmente no necesita un enlace troncal que se usa solo para transmitir información de Vlan múltiple a través de un solo enlace.
fuente
Creo que el problema es con la configuración de su interruptor. Después de configurar el puerto en modo troncal con etiquetas 802.1q, debe configurar el conmutador para enviar el vlan 37 como tráfico etiquetado y también puede necesitar configurar el puerto para usar otro vlan para el tráfico no etiquetado. Cuando configuré esto, también tuve que establecer qué vlan estaban permitidos / denegados en ese puerto. Mi IOS está un poco oxidado, pero creo que esto es lo que estás buscando.
También debería poder confirmar la configuración de su conmutador utilizando wireshark en eth0, ya que le mostrará las etiquetas de VLAN en los paquetes. Los paquetes LLDP de Cisco también pueden darle una idea de lo que está haciendo el puerto ge0 / 1.
fuente