내 Linux 홈 라우터는 ISP(주황색)와 홈 네트워크 사이에 있습니다. WAN 측에서 Orange는 832 태그가 지정된 VLAN에서 인터넷을 제공합니다.
특정 제어 메시지(ARP, DHCP, ICMPv6 "라우터 검색" 유형, DHCPv6)에는 다음을 통해 Orange에 대한 응답이 필요합니다. - VLAN 우선순위 = 6 - IPv4 또는 IPv6 DSCP = "CS6"(6비트 0x30 또는 10진수 48)
첫 번째 문제는 부팅 시퀀스 DHCP v4 메시지의 경우 isc-dhclient가 설계상 Linux 커널 IP 스택을 우회하는 원시 이더넷 패킷 소켓을 사용해야 한다는 것입니다. 따라서 netfilter를 사용하여 IPv4 DSCP 또는 메타클래스를 할당할 수는 없지만 지금은 이를 따로 남겨 두겠습니다.
다음은 IP DSCP 및 메타 우선순위 변경과 관련된 내 nftables 구성 덤프입니다. 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 카운터가 예상대로 증가합니다. 그러나 Wire Shark 캡처(스위치 포트 미러링을 통해 수행됨)에서 문제를 발견했습니다.
- 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로 올바르게 변환되지 않는 이유를 추가로 디버그할 수 있는 방법이 있습니까?
답변1
소스 문제는 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
나쁜 부분은 "up" 명령입니다. 초기 ARP/DHCP/NDP가 이미 발생한 경우 송신 매핑이 너무 늦게 완료됩니다. 수정은 매우 간단합니다. 사전 준비를 사용하면 됩니다.
# 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 우선순위로 완료됩니다.