Interface não marcada no Linux?

4

Eu sei como criar uma interface marcada no linux usando vconfig como eth1.10, o que faz com que receba e envie pacotes marcados. É possível criar uma interface que receba e envie um pacote não marcado para a vlan 10?

    
por user1762571 13.07.2015 / 06:55

5 respostas

4

Já existe uma interface não marcada: é a interface pai, ou seja, eth1 , neste caso.

O envio de pacotes através de eth1.10 faz com que esses pacotes sejam marcados enquanto os pacotes recebidos com a tag VLAN 10 chegam através dessa interface.

O envio de pacotes através de eth1 faz com que esses pacotes não sejam marcados enquanto os pacotes recebidos sem uma tag VLAN chegam através dessa interface.

Não existe algo como "enviar pacotes não marcados para vlan 10". Pacotes não marcados não possuem tag vlan, por definição.

    
por 13.07.2015 / 07:50
3

isto:

# ip link add link eth0 name untagged type vlan id 0

parece fazer o truque.

tcpdump na interface pai (eth0) mostra pacotes não marcados quando você faz o ping -I untagged (algum-ip).

(o tcpdump na nova interface lógica deve mostrar apenas tráfego não marcado, enquanto o tcpdump na interface pai deve mostrar todo o tráfego, marcado e não marcado, com cabeçalhos 802.1q para o material marcado.)

pode ser necessário desabilitar o ARP na interface pai, para que as respostas ARP não marcadas não sejam colocadas na tabela ARP em relação à interface pai:

# ip link set eth0 arp off
# ip link set untagged arp on

Eu também desabilitaria os endereços locais de vínculo IPv6 na interface pai e ativaria na interface lógica não marcada, por uma boa medida.

você pode subir / descer a interface não marcada sem matar a interface pai inteira (tráfego marcado incluído) etc.

    
por 16.02.2017 / 22:21
1

Como mencionado nos comentários e outra resposta, não há especificamente uma maneira de enviar pacotes não identificados pertencentes a uma VLAN específica, porque os pacotes não rotulados não têm como descrever a qual VLAN eles pertencem devido à falta de uma tag. Como também mencionado, a interface pai (eth1 aqui) enviará pacotes não marcados.

No entanto, isso não significa que pacotes não marcados enviados de sua caixa linux não possam pertencer a uma VLAN específica em sua rede. Cabe ao switch atribuir pacotes não marcados que chegam em uma determinada porta a uma determinada VLAN. Normalmente, os switches (que são capazes de VLANs), por padrão, atribuem pacotes não marcados à "VLAN padrão (1)". No entanto, alterando a configuração do switch, você pode instruí-lo a colocar pacotes não-marcados recebidos na VLAN 10 e rotea-los onde quer que a VLAN 10 esteja atribuída.

Se a VLAN 10 estiver configurada para ser marcada em uma porta diferente, esses mesmos pacotes serão marcados lá, se esse for o destino do pacote e não marcado em uma porta diferente configurada como não marcada para VLAN 10

    
por 11.03.2016 / 21:57
1

Eu encontrei o seguinte método para trabalhar.

  • Use o TC para corresponder aos pacotes sem o 802.1q no ingres e enviar um cabeçalho vlan com o id 0
  • Use o TC para corresponder aos pacotes no vlan 0 na saída e estale o cabeçalho vlan
  • Crie a interface lógica não marcada com type = vlan e id = 0

Veja um exemplo:

$ tc qdisc del dev eth0 root
$ tc qdisc add dev eth0 handle 1: root prio
$ tc filter add dev eth0 parent 1: protocol 802.1q basic match 'meta(vlan eq 0)' action vlan pop

$ tc qdisc del dev eth0 ingress
$ tc qdisc add dev eth0 handle ffff: ingress
$ tc filter add dev eth0 parent ffff: protocol all basic match 'not meta(protocol eq 0x8100)' action vlan push id 0

$ ip link add eth0-vlan0 type vlan id 0
$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0

peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.209 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.188 ms
^C

Observe que a adição do prio qdisc na saída (conhecida como "root" acima) desabilita a disciplina mq padrão, que divide os pacotes de acordo com o número de filas de transmissão na NIC para permitir que vários encadeamentos da CPU enviem pacotes para as diferentes Filas TX. Para restaurar o comportamento padrão, use o mqprio da seguinte maneira:

$ tx_q_count=$(ls -d /sys/class/net/eth0/queues/tx-* | wc -l)

$ tc qdisc del dev eth0 root
$ tc qdisc add dev eth0 handle 1: root prio bands $tx_q_count multiqueue
$ tc filter add dev eth0 parent 1: protocol 802.1q basic match 'meta(vlan eq 0)' action vlan pop
$ for i in $(seq 1 $tx_q_count); do tc qdisc add dev eth0 parent 1:$i pfifo_fast; done

$ tc qdisc del dev eth0 ingress
$ tc qdisc add dev eth0 handle ffff: ingress
$ tc filter add dev eth0 parent ffff: protocol all basic match 'not meta(protocol eq 0x8100)' action vlan push id 0

$ ip link add eth0-vlan0 type vlan id 0
$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0

peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.230 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.198 ms
^C

Uma solução diferente que também funciona é adicionar uma ponte de software ao lado das interfaces lógicas vlan na interface física. A ponte de software tem um recurso de filtragem de vlan que permite o remapeamento de vlan limitado (pvid-gt; vid on ingres e vid- > pvid on egress, mas não o remapeamento completo) que pode ser usado. Aqui está um exemplo:

$ ip link add eth0-vlan0 type bridge
$ echo 0 > /sys/class/net/eth0-vlan0/bridge/default_pvid
$ echo 1 > /sys/class/net/eth0-vlan0/bridge/vlan_filtering
$ ip link set dev eth0 master eth0-vlan0
$ bridge vlan add vid 4094 dev eth0 pvid untagged
$ bridge vlan add vid 4094 dev eth0-vlan0 untagged pvid self

$ ip link add eth0-vlan4094 link eth0 type vlan id 4094
# ... BEGIN: only if you intend to use vlan 4094 ...
$ ip link set eth0-vlan4094 up
$ ip addr add 10.10.40.253/24 dev eth0-vlan4094
# ... END ...

$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0

peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.238 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.215 ms
^C

Você precisa da interface de VLAN correspondente ao número de VID usado dentro da ponte, porque o recurso de filtragem de VLAN é um pouco mais ou menos. Ele aceita tanto frames não-marcados usando o mapeamento vid-pvid, mas também aceita frames com uma tag VLAN no wire matching com o remapped vid. A interface VLAN consome esses quadros. Deixe-o no estado inativo se você não precisar dessa VLAN em particular.

A ponte de software ganhou recentemente um recurso "default_pvid" que faz com que funcione como switches de hardware baratos: é vlan ciente, mas por padrão fará um mapeamento de vídeo pvid-and-vid para vid 1 e permitirá vid 1 em todos portas, para que você possa conectar o switch e começar a usar as portas para tráfego sem tag sem uma única diretiva de configuração.

Finalmente, uma solução mais moderna seria usar tc_clsact e escrever um pequeno programa BPF para empurrar / estourar as tags para o PVID. Funciona exatamente como o exemplo de TC acima, exceto que algumas NICs permitem descarregamento de hardware de programas BPF, portanto, poderia ter mais desempenho.

    
por 19.02.2017 / 00:24
1

Aqui está a solução usando o eBPF.

Para evitar ter que instalar o bcc e compilar o código a partir da fonte, aqui está o binário:

$ base64 -d > tag-native-vlan0.o
f0VMRgIBAQAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAALABAAAAAAAAAAAAAEAAAAAA
AEAABwABAGESFAAAAAAAVQIDAAAAAAC3AgAAAIEAALcDAAAAAAAAhQAAABIAAAC3AAAAAAAAAJUA
AAAAAAAAYRIUAAAAAAAVAgMAAAAAAGESGAAAAAAAVQIBAAAAAACFAAAAEwAAALcAAAAAAAAAlQAA
AAAAAABHUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF4AAAAAAAMAKAAAAAAAAAAAAAAA
AAAAAFcAAAAAAAQAKAAAAAAAAAAAAAAAAAAAAD0AAAAQAAUAAAAAAAAAAAAAAAAAAAAAACMAAAAQ
AAQAAAAAAAAAAAAAAAAAAAAAAAcAAAAQAAMAAAAAAAAAAAAAAAAAAAAAAAAudGV4dABjbHNhY3Rf
aW5ncmVzcwBwdmlkX2luZ3Jlc3MAY2xzYWN0X2VncmVzcwBwdmlkX2VncmVzcwBfX2xpY2Vuc2UA
LnN0cnRhYgAuc3ltdGFiAExCQjFfMwBMQkIwXzIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcAAAADAAAAAAAAAAAAAAAA
AAAAAAAAAEgBAAAAAAAAZQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAYA
AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAFgAA
AAEAAAAGAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAA
AAAAADEAAAABAAAABgAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAgAAAAA
AAAAAAAAAAAAAAA/AAAAAQAAAAMAAAAAAAAAAAAAAAAAAACwAAAAAAAAAAQAAAAAAAAAAAAAAAAA
AAABAAAAAAAAAAAAAAAAAAAATwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAuAAAAAAAAACQAAAAAAAA
AAEAAAADAAAACAAAAAAAAAAYAAAAAAAAAA==
^D

Eu configurei o PVID para mapear para o VID 0 em vez do VID 10, sem nenhum motivo específico.

(Para alterá-lo para o VID 10, use um desmontador e montador, por exemplo, ubpf ou llvm-objdump, no arquivo .o, e altere a tag VLAN. Você também pode falar com o eBPF do espaço do usuário, por isso, deve ser possível reconfigurar o pvid em tempo de execução, se necessário.)

Certifique-se de executar algo como o kernel 4.8.0 ( uname -a ) e o iproute2 4.9.0 ( ip -V ).

Adicione o eBPF à interface física:

$ tc qdisc add dev eth0 clsact
$ tc filter add dev eth0 ingress bpf object-file tag-native-vlan0.o section pvid_ingress
$ tc filter add dev eth0 egress bpf object-file tag-native-vlan0.o section pvid_egress

Crie uma interface lógica:

$ ip link add eth0-vlan0 link eth0 type vlan id 0
$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0

O L3 é configurado na interface lógica e a interface física é usada para o L2.

Teste de uma caixa conectada:

peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.380 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.240 ms
^C

E você tem isso, uma "interface não marcada no Linux".

    
por 20.02.2017 / 04:45