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.
lsmod
na caixa do Linux?ifconfig eth0.37
e / ou seifconfig -a
parece?/proc/net/vlan/config
?sho mac address-table vlan 37
?Respostas:
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.
No lado do linux, o comando vconfig cria um alias de interface para o tráfego marcado como vlan 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.
Em dispositivos IOS bastante antigos, você precisa configurar o encapsulamento do caminhão para 8021q, pois eles serão padronizados para ISL.
fonte
switch port mode access
també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 .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.
fonte
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.
fonte