A meta classe de pacotes aplicada, mas a prioridade de VLAN capturada está errada

2

Meu roteador doméstico linux fica entre o meu provedor (laranja) e minha rede doméstica. No lado da WAN, a Orange fornece internet em uma VLAN marcada como 832.

Algumas mensagens de controle (ARP, DHCP, ICMPv6 "tipos de descoberta de roteador", DHCPv6) precisam ser respondidas para a Orange com: - prioridade da VLAN = 6 - IPvCP ou IPv6 DSCP="CS6" (6 bits 0x30 ou 48 em notação decimal)

Primeiro problema, para as mensagens DHCP v4 de sequência de inicialização, o isc-dhclient precisa usar um soquete de pacote Ethernet, que ignora a pilha IP do kernel do Linux por design. Portanto, não é possível usar o netfilter para atribuir DSCP ou Meta Class IPv4, mas vamos deixar isso de lado por enquanto.

Aqui está um dump da minha configuração nftables, relevante para a alteração de IP DSCP e Meta Priority: me @ debox: ~ $ sudo / usr / sbin / nft lista de regras

table inet fltr46 {
    chain assign-orange-prio {
        ip version 4 udp sport { bootps, bootpc} ip dscp set cs6 meta priority set 0:6 counter packets 0 bytes 0 comment "isc-dhclient LPF socket bypass netfilter"
        icmpv6 type { nd-neighbor-solicit, nd-router-solicit} ip6 dscp set cs6 meta priority set 0:6 counter packets 8 bytes 480
        udp sport { dhcpv6-client, dhcpv6-server} ip6 dscp set cs6 meta priority set 0:6 counter packets 4 bytes 1180
    }

    chain postrouting {
        type filter hook postrouting priority 0; policy accept;
        oifname vmap { "enp1s0.832" : goto assign-orange-prio}
    }

    chain output {
        type filter hook output priority 0; policy accept;
        oifname vmap { "enp1s0.832" : goto assign-orange-prio }
    }
}
table arp arp4 {
    chain output {
        type filter hook output priority 0; policy accept;
        oifname ! "enp1s0.832" accept
        meta priority set 0:6 counter packets 851 bytes 35742
    }
}

Minha configuração do vlan 832 é a seguinte:

me@debox:~$ sudo cat /proc/net/vlan/enp1s0.832 
enp1s0.832  VID: 832     REORDER_HDR: 1  dev->priv_flags: 1001
Device: enp1s0
INGRESS priority mappings: 0:0  1:0  2:0  3:0  4:0  5:0  6:0 7:0
 EGRESS priority mappings: 6:6

O que significa, para saída, pacotes de classe 6 - > VLAN prio 6.

Os contadores nftables para DHCPv6, ICMPv6 "router" e ARP são incrementados, como esperado. No entanto, percebo problemas na minha captura de tubarões de arame (feita pelo espelhamento de porta swich):

  • DHCPv6: OK. DSCP = CS6 e VLAN prio = 6
  • ICMPv6: não está OK. DSCP = CS6 mas VLAN prio = 0
  • ARP: não está bem. VLAN prio = 0
  • Pacotes de renovação de concessão de DHCP IPv4, enviados por meio de um soquete UDP comum, também estão corretos (DSCP + VLAN prio).

A prioridade da VLAN não é aplicada corretamente aos pacotes ARP e ICMPv6. Existe uma maneira de depurar ainda mais porque a classe meta não traduz corretamente para o prio VLAN, para mensagens ARP e ICMPv6 geradas pelo kernel do linux?

    
por Strangelovian 04.11.2018 / 23:36

1 resposta

0

O problema de origem foi um problema de sequenciamento simples em relação à interface vlan. Meu arquivo de persistência de interface de rede foi inicialmente configurado incorretamente:

# WAN vlan 832 internet
auto enp1s0.832
iface enp1s0.832 inet dhcp
  up ip link set enp1s0.832 type vlan egress 0:0 1:0 2:0 3:0 4:0 5:0 6:6 7:0
iface enp1s0.832 inet6 dhcp
  up ip link set enp1s0.832 type vlan egress 0:0 1:0 2:0 3:0 4:0 5:0 6:6 7:0
  request_prefix 1
  accept_ra 2

A parte ruim é a instrução "up". O mapeamento de saída é feito tarde demais, quando o ARP / DHCP / NDP inicial já aconteceu. A correção é realmente simples, basta usar pré-up:

# WAN vlan 832 internet
auto enp1s0.832
iface enp1s0.832 inet dhcp
  pre-up ip link set enp1s0.832 type vlan egress 0:0 1:0 2:0 3:0 4:0 5:0 6:6 7:0
iface enp1s0.832 inet6 dhcp
  pre-up ip link set enp1s0.832 type vlan egress 0:0 1:0 2:0 3:0 4:0 5:0 6:6 7:0
  request_prefix 1
  accept_ra 2

Com isso, o handshake inicial ARP / DHCP / NDP é feito com a prioridade certa de QoS.

    
por 05.11.2018 / 21:50