Meu roteador doméstico linux fica entre meu ISP (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, tipos de "descoberta de roteador" ICMPv6, DHCPv6) precisam ser respondidas ao Orange com: - Prioridade de VLAN = 6 - IPv4 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, isc-dhclient precisa usar um soquete de pacote ethernet bruto, que ignora a pilha de IP do kernel linux por design. Portanto, não se pode usar o netfilter para atribuir IPv4 DSCP ou Meta Class, mas vamos deixar isso de lado por enquanto.
Aqui está um dump da minha configuração nftables, relevante para a alteração do IP DSCP e Meta Priority: me@debox:~$ sudo /usr/sbin/nft list ruleset
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 da 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 classe 6 -> VLAN prio 6.
Os contadores nftables para DHCPv6, "roteador" ICMPv6 e ARP são incrementados, conforme o esperado. No entanto, noto problemas na minha captura de wire shark (feita por espelhamento de porta swich):
- DHCPv6: OK. DSCP = CS6 e VLAN prior = 6
- ICMPv6: não está bem. DSCP = CS6 mas VLAN prior = 0
- ARP: não está bem. VLAN prior = 0
- Os pacotes de renovação de concessão DHCP IPv4, enviados através de um soquete UDP regular, também estão OK (DSCP+VLAN prior).
A prioridade de VLAN não é aplicada corretamente aos pacotes ARP e ICMPv6. Existe uma maneira de depurar ainda mais por que a metaclasse não traduz corretamente para VLAN prio, para mensagens ARP e ICMPv6 geradas pelo kernel do linux?