Cisco e Linux e Vlans

9

Parece que tenho um mal-entendido fundamental sobre como as VLANs funcionam no Linux, e espero que as pessoas boas aqui possam me educar.

Elenco: Um Cisco 3560, uma VLAN e uma caixa Linux [1].

Cisco  ---------------  Linux
    ge0/1           eth0

O Cisco possui uma interface Vlan 37, com endereço IP 10.40.37.252/24. Quero colocar 10.40.37.1/24 na caixa do Linux.

Quando o Cisco descapsula a vlan 37, tudo funciona bem [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

No entanto, quando defino a porta como entroncamento e atribuo a vlan 37 no lado Linux, ela para 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

O que estou perdendo aqui?

Edit: Soluções:

A pergunta de Shane sobre a tabela de endereços MAC me levou a uma solução: Use "ip addr" para definir diferentes endereços L2 (MAC) únicos em cada uma das subinterfaces da VLAN, e de repente funciona.

Outra solução possível que eu não tentei (porque meu hardware é muito antigo) é usar "ethtool" para desativar o descarregamento de VLAN pela própria NIC e forçar o kernel a lidar com as tags.

Obrigado Shane!

Edit: Mais informações de acordo com os comentários:

O objetivo geral é ter três vlans (público, privado, oam & p) terminando em três endereços IP individuais na caixa linux, com aplicativos diferentes vinculados aos endereços locais. Posso expandir ainda mais, se necessário, mas estou tentando manter a descrição e a discussão do problema simples, pois antes que eu possa ter três vlans funcionando, eu meio que preciso de uma para estar funcionando. :)

Antoine -> ifup versus ifconfig não faz diferença.

Pepoluan -> Estou assumindo que é isso que você estava procurando. Observe que a falta de referências dos drivers phy é aparentemente normal. [5]

$ lsmod | grep 802
    8021q   25545 1 cxgb3

Faz-tudo ->

$ 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 e / ou tcpdump não mostram as tags, mas isso é aparentemente uma limitação normal no Linux, devido à ordem de processamento do manuseio da vlan e do pcap no kernel [6]. Além disso, a VLAN não marcada é definida como 1 [7].

[1] Eu tentei isso com o CentOS 5.5 e o Ubuntu 11.04, e ambos têm o mesmo problema.

[2] Observe que as configurações não são recortadas e coladas, portanto, quaisquer erros de digitação aqui são simplesmente minha memória ruim.

[3] "não negociado", ativado ou desativado, não afeta o problema.

[4] A Vlan 37 é mostrada como ativa e sem poda no link, portanto, "permitido" não é o problema.

[5] serverfault: Ativando 8021q em um nic

[6] http://wiki.wireshark.org/CaptureSetup/VLAN#Linux

[7] A VLAN nativa (sem etiqueta) é 1. A configuração manual com "switchport trunk native vlan 1" não tem efeito.

Darren H
fonte
Você já tentou ifup eth0 em vez de ifconfig eth0 0.0.0.0 up?
Antoine Benkemoun 18/08/11
Você pode postar a saída lsmodna caixa do Linux?
pepoluan 18/08/11
2
Como ifconfig eth0.37e / ou se ifconfig -aparece?
Handyman5
Também por favor poste /proc/net/vlan/config?
Handyman5
1
sho mac address-table vlan 37?
Shane Madden

Respostas:

2

Deseja que o host tenha acesso apenas à vlan 37 ou deseja que o host tenha acesso a várias vlans?

Essa configuração do IOS significa definir a vlan nativa (sem marcação) para 37.

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

No lado do linux, o comando vconfig cria um alias de interface para o tráfego marcado como vlan 37.

vconfig add eth0 37

Você vê o problema? O switch está enviando tráfego não marcado para o host e o host está procurando / gerando tráfego marcado.

Você precisa apenas usar eth0 na vlan 37 nativa ou alterar o conf do switch para que ele passe o tráfego marcado, por exemplo.

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

Em dispositivos IOS bastante antigos, você precisa configurar o encapsulamento do caminhão para 8021q, pois eles serão padronizados para ISL.

Joshua Hoblitt
fonte
O acesso funcionou bem, o entroncamento não. O objetivo era ter três ou mais VLANs, cada uma com sua própria sub-rede, terminando na caixa Linux. A solução / solução alternativa foi garantir que cada VLAN no lado Linux tivesse um endereço MAC distinto.
Darren H
Bem, isso depende do que você quer dizer com "trabalho". Quando um dispositivo IOS tem uma porta no modo de acesso, significa que "todos os pacotes recebidos nesta porta serão marcados [internos ao switch] como vlan X". Isso significa que qualquer cabeçalho 802.1q que você adicionou do host Linux está sendo removido. Você pode facilmente provar isso executando o tcpdump em uma porta diferente e também configurada para o modo de acesso na vlan 37; você poderá ver o tráfego de broadcast de todas as suas três interfaces "vlan" na caixa do linux.
Joshua Hoblitt
Eu deveria ter mencionado duas coisas. 1) Que eu uso tags vlan no centos 5 com switches Cisco & Blade Networks no meu ambiente de virtualização de produção. 2) switch port mode accesstambém removerá todas as tags 802.1q no tráfego de saída. É por isso que você teve que recorrer aos endereços mac para que a comunicação funcione. Sem os destinos com endereços MAC diferentes, todos estavam terminando na interface vlan nativa, pois os pacotes estavam chegando ao host do Linux sem tags vlan .
Joshua Hoblitt
Apenas para maior clareza, no "tronco" do IOS significa usar tags vlan 802.1q.
Joshua Hoblitt
0

Agora eu não sou especialista no lado Linux disso, passando pelo meu conhecimento de Switching, você tem a interface eth0 na máquina Linux configurada para o entroncamento dot1q? Não sei se há uma provisão para várias vlans operarem em uma máquina Linux, mas presumo que você tenha uma única interface configurada para funcionar como parte da Vlan37, tornando essencialmente a NIC da sua máquina Linux uma porta de acesso. Uma porta de acesso não pode se comunicar diretamente com uma porta de tronco, não poderá criar ou entender o encapsulamento de entroncamento.

Pelo que entendi, você deseja que a máquina Linux funcione na Vlan 37. Apenas reverta a porta ge0 / 1 para ser uma porta de acesso na Vlan37 e atribua rotineiramente à máquina Linux qualquer IP na sub-rede da Vlan37. Você realmente não precisa de entroncamento, que é usado apenas para transmitir várias informações de Vlan em um único link.

gokul varma nk
fonte
1
A parte vconfig configura o dot1q trunking :)
Antoine Benkemoun
O objetivo final é ter várias VLANs terminando no sistema Linux; I primeiro tem que obter um trabalho;)
Darren H
Quer dizer que você quer que sua máquina Linux faça parte de vários Vlans ou que, na Vlan37, ela precise ser acessível a partir de vários outros Vlans?
Gokul varma nk
O primeiro - A máquina Linux deve ter vários endereços IP não sobrepostos, cada um em sua própria VLAN. Corpo principal editado para esclarecer isso.
Darren H
0

Acho que o problema está na sua configuração do switch. Após definir a porta para o modo de tronco com tags 802.1q, você precisa configurar o switch para enviar a vlan 37 como tráfego marcado e também pode ser necessário configurar a porta para usar outra vlan para tráfego não marcado. Quando eu configurei isso, eu também precisei definir qual vlan era permitida / negada nessa porta. Meu IOS está um pouco enferrujado, mas acho que é isso que você está procurando.

Você também deve poder confirmar sua configuração de switch usando o wireshark no eth0, pois ele mostrará as tags VLAN nos pacotes. Os pacotes Cisco LLDP também podem fornecer uma pista do que a porta ge0 / 1 está fazendo.

mandril
fonte
Não notei os pontos 3 e 4 ao postar. Eu ainda iria tentar wireshark, uma vez que iria permitir-lhe verificar que o tráfego destinado para o interruptor está sendo enviado na VLAN 37.
mandril
O Wireshark no linux geralmente não pode mostrar as tags VLAN e, infelizmente, é o caso aqui. Veja a nova nota de rodapé [6] na pergunta editada acima.
Darren H
Os padrões conforme a configuração do solicitante terão a vlan 1 como vlan nativa e todos os outros como vlans marcados.
MikeyB