Cisco y Linux y Vlans

9

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.

Darren H
fuente
¿Has probado ifup eth0 en lugar de ifconfig eth0 0.0.0.0 arriba?
Antoine Benkemoun
¿Puedes publicar la salida de lsmoden el cuadro de Linux?
pepoluan
2
¿Cómo ifconfig eth0.37y ifconfig -acómo se ve?
Handyman5
También por favor publicar /proc/net/vlan/config?
Handyman5
1
sho mac address-table vlan 37?
Shane Madden

Respuestas:

2

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

interface GigabitEthernet 0/1
    switchport mode access
    switchport access vlan 37

En el lado de Linux, el comando vconfig crea un alias de interfaz para el tráfico etiquetado como vlan 37.

vconfig add eth0 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.

interface GigabitEthernet 0/1
    switchport trunk allowed vlan 37
    switchport mode trunk

En dispositivos IOS bastante antiguos, usted debe configurar la encapsulación del camión en 8021q, ya que su valor predeterminado será ISL.

Joshua Hoblitt
fuente
El acceso funcionó bien, el enlace troncal no. El objetivo era tener tres o más VLAN, cada una con su propia subred, terminando en la caja de Linux. La solución / solución consistía en garantizar que cada VLAN en el lado de Linux tuviera una dirección MAC distinta.
Darren H
Bueno, eso depende de lo que quieras decir con "trabajo". Cuando un dispositivo IOS tiene un puerto en modo de acceso, significa que "todos los paquetes ingresados en este puerto serán etiquetados [internos al conmutador] como vlan X". Eso significa que cualquier encabezado 802.1q que haya agregado desde el host Linux se está eliminando. Puede probar esto fácilmente ejecutando tcpdump en un puerto diferente, también configurado para acceder al modo en vlan 37; debería poder ver el tráfico de transmisión desde las tres interfaces "vlan" en el cuadro de Linux.
Joshua Hoblitt
Debería haber mencionado dos cosas. 1) Que uso etiquetas vlan en centos 5 con conmutadores Cisco y Blade Networks en mi entorno de virtualización de producción. 2) switch port mode accesstambié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 .
Joshua Hoblitt
Solo por claridad, en IOS "troncal" significa usar etiquetas vlan 802.1q.
Joshua Hoblitt
0

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.

gokul varma nk
fuente
1
La parte vconfig configura el enlace troncal dot1q :)
Antoine Benkemoun
El objetivo final es tener múltiples VLAN que terminen en el sistema Linux; Primero tengo que conseguir uno;)
Darren H
¿Quiere decir que quiere que su máquina Linux sea parte de múltiples Vlans o que permanecer en Vlan37 necesita ser accesible desde varios Vlans?
Gokul Varma nk
El primero: la máquina Linux debe tener varias direcciones IP no superpuestas, cada una en su propia VLAN. Cuerpo principal editado para aclarar esto.
Darren H
0

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.

arrojar
fuente
No noté los puntos 3 y 4 al publicar. Me gustaría volver a probar Wireshark ya que permitiría que verifique que el tráfico destinado para el interruptor se envía en la VLAN 37.
Chuck
Wireshark en Linux a menudo no puede mostrar las etiquetas VLAN, y desafortunadamente, tal es el caso aquí. Ver nueva nota al pie [6] en la pregunta editada arriba.
Darren H
Los valores predeterminados según la configuración del autor de la pregunta tendrán vlan 1 como vlan nativo y todos los demás como vlans etiquetados.
MikeyB