nftables - マルチキャストパケットの不一致

nftables - マルチキャストパケットの不一致

私は次のようにマルチキャストパケットを一致させるルールを設定しました。

add rule filter_4 new_out_4 meta pkttype multicast goto multicast_out_4

filter_4これはIPv4テーブルとnew_out4出力チェーンであり、multicast_out_4純粋なマルチキャストトラフィックを処理するチェーンです。

無関係な部分を除くIPv4テーブルの全体図は次のとおりです。

#!/usr/sbin/nft -f

add table filter_4

add chain filter_4 output {
    # filter = 0
    type filter hook output priority filter; policy drop;
}

add chain filter_4 multicast_out_4 {
    comment "Output multicast IPV4 traffic"
}

add chain filter_4 new_out_4 {
    comment "New output IPv4 traffic"
}

#
# Stateful filtering
#

# Established IPv4 traffic
add rule filter_4 input ct state established goto established_in_4
add rule filter_4 output ct state established goto established_out_4

# Related IPv4 traffic
add rule filter_4 input ct state related goto related_in_4
add rule filter_4 output ct state related goto related_out_4

# New IPv4 traffic ( PACKET IS MATCHED HERE )
add rule filter_4 input ct state new goto new_in_4
add rule filter_4 output ct state new goto new_out_4

# Invalid IPv4 traffic
add rule filter_4 input ct state invalid log prefix "drop invalid_filter_in_4: " counter name invalid_filter_count_4 drop
add rule filter_4 output ct state invalid log prefix "drop invalid_filter_out_4: " counter name invalid_filter_count_4 drop

# Untracked IPv4 traffic
add rule filter_4 input ct state untracked log prefix "drop untracked_filter_in_4: " counter name untracked_filter_count_4 drop
add rule filter_4 output ct state untracked log prefix "drop untracked_filter_out_4: " counter name untracked_filter_count_4 drop

上記の設定では、マルチキャストを含む新しい出力トラフィックがルールを介して一致します。add rule filter_4 output ct state new goto new_out_4

new_out_4機能しない関連(機能しない)マルチキャストルールのみを含むチェーンは次のとおりです。

# Multicast IPv4 traffic ( THIS RULE DOES NOT WORK, SEE LOG OUTPUT BELOW)
add rule filter_4 new_out_4 meta pkttype multicast goto multicast_out_4

#
# Default chain action ( MULTICAST PACKET IS DROPPED HERE )
#
add rule filter_4 new_out_4 log prefix "drop new_out_4: " counter name new_out_filter_count_4 drop

ドロップされたマルチキャストパケットのログ内容は次のとおりです。

new_out_4 削除: IN=OUT=eth0 SRC=192.168.1.100 DST=224.0.0.251 LEN=163 TOS=0x00 PREC=0x00 TTL=255 ID=27018 DF PROTO=UDP SPT=5353 DPT=53

224.0.0.251ドロップされたパケットは、マルチキャストアドレスである宛先アドレスに送信されます。このアドレスはnew_out_4チェーンのマルチキャストルールと一致し、multicast_out_4チェーンで処理する必要がありますが、そうではありません。

代わりに、パケットは一致せず、上記のチェーンのデフォルトの削除new_out_4ルールに従って破棄されます。注(基本チェーン操作)を参照してください。

明らかに、これはマルチキャストルールが機能しないことを意味します。

マルチキャストルールが機能しないのはなぜですか?

期待される:

meta pkttype multicast宛先アドレスの一致224.0.0.251

編集する:

システム情報:
カーネル:6.5.0-0.deb12.4-amd64
には、以前のカーネル6.1と同じ問題があります。

nftables:v1.0.6(レスターグッチ#5)

答え1

次のいくつかの追加項目を使用して設定を複製し、不足している部分を完成させます。

nft insert rule filter_4 new_out_4 counter meta pkttype host counter

meta pkttype実際、このskbuffの属性は発信マルチキャストパケットの予想属性ではありませんhostmulticast気づくこのキーワードが紹介されると、これは出力ではなく入力に関するものです。

src:メタ表現にpkttypeのサポートを追加する

skbuffのpkttypeフィールドを一致させるには、次の構文を使用する必要があります。

nft 追加規則 IP フィルタ入力要素 pkttype PACKET_TYPE

そのうち、PACKET_TYPEはユニキャスト、ブロードキャスト、マルチキャストにすることができます。

実際には、次のように直接同じです。iptables~であるpkttype マッチモジュール:

pkttype

このモジュールは一致しますリンクレイヤーパケットタイプ。

[!] --pkt-type {unicast|broadcast|multicast}

# iptables-translate -A OUTPUT -m pkttype --pkt-type multicast
nft 'add rule ip filter OUTPUT pkttype multicast counter'

これらすべてをまとめると、発信IP(ルーティング:レイヤ3)パケットが生成されたときにまだレイヤ2(リンクレイヤ)に到達していないため、そのskbuffは次のように計画しても反映されません。未来。

実際にテストする必要があるのは、イーサネットに関連するパケット属性ではなく、ルーティングスタックに関連するIPアドレス属性です。iptablesこのために規定されているaddrtypeマッチングモジュール:

addrtype

このモジュールは、以下に基づいてパケットを照合します。住所タイプ。 [...]

翻訳では、実際に何を使うべきかを示しています。fib表現する:

# iptables-translate -A OUTPUT -m addrtype --dst-type MULTICAST
nft 'add rule ip filter OUTPUT fib daddr type multicast counter'

FIB発現

fib {saddr | daddr | mark | iif | oif} [. ...] {oif | oifname | type}

fib式は、特定のアドレスが使用する出力インターフェイスのインデックスなどの情報をfib(配信情報ベース)に照会します。入力は、fib ルックアップ関数への入力として使用される要素のタプルです。

マルチキャストの直接的な例はありません。最新の例は、マルチキャストが3つの例外に対応する受信インターフェイスで使用することを意図していないアドレスに対してpacjetを削除することに関するより複雑な例です。

# drop packets to address not configured on incoming interface
filter prerouting fib daddr . iif type != { local, broadcast, multicast } drop

したがって、出力(またはルーティング後)フックで使用する場所ごとに変更します。

meta pkttype multicast

そして:

fib daddr type multicast

入力(または辞書パス)フックでは、skbuff属性はIP属性と一致する可能性がありますが、一貫性のためにまったく同じ属性で置き換える必要があります。

fib daddr type multicast

次のテストコマンドは、LAN上の他のホスト(テスト入力用)およびホスト(テスト出力用)と一緒に使用されます。

socat -d -d UDP4-DATAGRAM:224.0.0.251:5555,bind=:5555,ip-add-membership=224.0.0.251:eth0 -

fib daddr type multicast入力と出力が正しく一致します。


重要:

上記の方法で問題が解決したと思いますが、Netfilterはマルチキャストを正しく追跡しないことに注意してください。つながるこれは、別のユニキャスト送信元アドレスを使用する応答を初期クエリのマルチキャスト送信先アドレスに関連付けることができないためです。応答が異なるため、応答をリンクしてプロセスの一部として処理するのではなく、別の(新しい)ストリームと見なします。 。したがって、これらのストリームは ESTABLISHED 状態で表示されません。つながるまたはconntrack -Lコマンド。ルールセットはこれに対応する必要があります。どのような規則にも頼ることはできませんが、ct state established,relatedこれはこの質問の範囲外です。

関連情報