Vlan

已應用數據包元類,但擷取的 VLAN 優先級錯誤

  • November 5, 2018

我的 linux 家用路由器位於我的 ISP(橙色)和我的家庭網路之間。在 WAN 端,Orange 在標記為 832 的 VLAN 中提供網際網路。

一些控制消息(ARP、DHCP、ICMPv6“路由器發現”類型、DHCPv6)需要回復到 Orange: - VLAN 優先級 = 6 - IPv4 或 IPv6 DSCP = “CS6”(6 位 0x30,或十進製表示法中的 48)

第一個問題,對於引導序列 DHCP v4 消息,isc-dhclient 需要使用原始乙太網數據包套接字,它通過設計繞過 linux 核心 IP 堆棧。所以不能使用 netfilter 來分配 IPv4 DSCP 或 Meta Class,但現在讓我們把它放在一邊。

這是我的 nftables 配置的轉儲,與 IP DSCP 和元優先級的更改有關: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
   }
}

我的vlan 832配置如下:

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

這意味著,對於出口,6 類數據包 -> VLAN prio 6。

DHCPv6、ICMPv6“路由器”和 ARP 的 nftables 計數器按預期遞增。但是,我注意到我的線鯊擷取中的問題(通過 swich 埠鏡像完成):

  • DHCPv6:好的。DSCP = CS6 和 VLAN 優先級 = 6
  • ICMPv6:不行。DSCP = CS6 但 VLAN 優先級 = 0
  • ARP:不好。VLAN 優先級 = 0
  • 通過正常 UDP 套接字發送的 IPv4 DHCP 租約更新數據包也可以(DSCP+VLAN prio)。

VLAN 優先級未正確應用於 ARP 和 ICMPv6 數據包。對於 linux 核心生成的 ARP 和 ICMPv6 消息,有沒有辦法進一步調試為什麼元類不能正確轉換為 VLAN prio?

源問題是關於 vlan 介面的簡單排序問題。我的網路介面持久性文件最初配置錯誤:

# 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

不好的部分是“向上”指令。當初始 ARP / DHCP / NDP 已經發生時,出口映射完成得太晚。修復非常簡單,使用 pre-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

這樣,初始 ARP/DHCP/NDP 握手以正確的 QoS 優先級完成。

引用自:https://unix.stackexchange.com/questions/479796