web-dev-qa-db-ja.com

パケットメタクラスが適用されましたが、キャプチャされましたVLAN優先度が間違っています

Linuxホームルーターは、ISP(オレンジ)とホームネットワークの間にあります。 WAN側では、OrangeはVLANタグ付き832でインターネットを提供します。

一部の制御メッセージ(ARP、DHCP、ICMPv6「ルーター検出」タイプ、DHCPv6)は、次のようにOrangeに返信する必要があります。-VLAN優先度= 6-IPv4またはIPv6DSCP = "CS6"(6ビット0x30、または10進表記の48)

最初の問題は、ブートシーケンスDHCP v4メッセージの場合、isc-dhclientは生のイーサネットパケットソケットを使用する必要があります。これは、設計上、LinuxカーネルのIPスタックをバイパスします。したがって、netfilterを使用してIPv4 DSCPまたはメタクラスを割り当てることはできませんが、とりあえずそれは脇に置いておきましょう。

IP DSCPとメタ優先度の変更に関連する私のnftables構成のダンプは次のとおりです:me @ debox:〜$ Sudo/usr/sbin/nftlistルールセット

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
    }
}

私のVLAN832構成は次のとおりです。

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 prio6。

DHCPv6、ICMPv6「ルーター」、およびARPのnftablesカウンターは、予想どおりにインクリメントされます。ただし、Wire sharkのキャプチャに問題があります(スイッチポートミラーリングによって実行されます)。

  • DHCPv6:わかりました。 DSCP = CS6およびVLAN prio = 6
  • ICMPv6:OKではありません。 DSCP = CS6、ただしVLAN prio = 0
  • ARP:OKではありません。 VLAN prio = 0
  • 通常のUDPソケットを介して送信されるIPv4DHCPリース更新パケットもOKです(DSCP + VLANprio)。

VLAN優先度がARPおよびICMPv6パケットに正しく適用されていません。 Linuxカーネルによって生成されたARPおよびICMPv6メッセージの場合、メタクラスがVLAN prio)に正しく変換されない理由をさらにデバッグする方法はありますか?

2
Strangelovian

ソースの問題は、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がすでに発生している場合、出力マッピングは遅すぎます。修正は本当に簡単です。代わりにプリアップを使用するだけで十分です。

# 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優先度で実行されます。

0
Strangelovian