nftables クイック入門:テーブル、チェーン、ルールとよく使う操作

nftables の入門メモです。table、chain、rule の関係を理解し、IP、MAC、ポートのマッチ、トラフィック統計、帯域制限、ルール削除などの基本操作を整理します。

nftables は、Linux でよく使われるパケットフィルタリングとファイアウォールルール管理の仕組みです。端末の通信制御、トラフィック統計、ポートマッチ、簡単な帯域制限だけを行うなら、最初からルール体系全体を覚える必要はありません。まずは次の 3 つを押さえれば十分です。

  • table:ルールを入れるコンテナ。
  • chain:ルールが評価される場所。通常は特定の hook に接続します。
  • rule:実際のマッチ条件とアクション。

以下では、まずテスト環境で試しやすい最小構成の流れを整理します。

基本構成

先にいくつか変数を用意します。以降のコマンドで再利用します。

1
2
3
4
5
table=customtable
chain=custom_control
target=drop
ip=192.168.18.251
mac=00:00:01:02:03:04

IPv4 と IPv6 の両方を扱える inet table を作成します。

1
nft add table inet $table

次に、forward 段階に接続する chain を作成します。

1
nft add chain inet $table $chain { type filter hook forward priority 0\; }

ここで、type filter はフィルタリング用のルールであることを示し、hook forward は転送されるパケットを処理することを示します。

よく使うマッチ方法

送信元 IP でマッチします。通常はアップロード方向の制御として考えられます。

1
nft add rule inet $table $chain ip saddr $ip $target

宛先 IP でマッチします。通常はダウンロード方向の制御として考えられます。

1
nft add rule inet $table $chain ip daddr $ip $target

MAC アドレスでマッチする場合、ether saddr で上り方向を制御できます。

1
nft add rule inet $table $chain ether saddr $mac $target

ブリッジ、転送、アドレス変換を経由するネットワークでは、下りパケットを宛先 MAC で安定してフィルタできない場合があります。端末の通信制御を行うときは、まず ether saddr または IP ベースのルールから検証するのが安全です。

ポートでマッチする場合、TCP と UDP をまとめて対象にできます。

1
nft add rule inet $table $chain { tcp, udp } dport 22 $target

ポート範囲をマッチしたい場合は、比較式を使えます。

1
nft add rule inet $table $chain tcp dport \>= 1024 $target

単一端末の通信量を集計する

特定 IP の上りと下りの通信量を集計したいだけなら、counter return を使えます。マッチしたらカウンターを記録して戻るため、後続に他の統計ルールがある場合でも余計なマッチ処理を減らせます。

1
2
nft add rule inet $table $chain ip saddr $ip counter return
nft add rule inet $table $chain ip daddr $ip counter return

統計結果を確認します。

1
nft list chain inet $table $chain

各ルールの handle を確認したい場合は、-a を付けます。

1
nft -a list chain inet $table $chain

handle は重要です。nftables で単一ルールを削除するときは、通常この値で対象を指定します。

簡単な帯域制限

帯域制限には limit rate over を使えます。たとえば、MAC アドレスごとに指定速度を超えた通信を制限します。

1
2
3
4
rate=10
unit=mbytes

nft add rule inet $table $chain ether saddr $mac limit rate over $rate $unit/second drop

ここでの mbyteskbytes は、日常的な M、K の単位として理解できます。手動で 8 倍換算する必要はありません。実際に使うときは、まず緩めの値でテストし、マッチ方向と効果を確認してから調整するのが安全です。

ルールの削除と整理

まず handle 付きでルールを表示します。

1
nft -a list chain inet $table $chain

次に handle を指定してルールを削除します。

1
nft delete rule inet $table $chain handle <handle>

chain を空にします。

1
nft flush chain inet $table $chain

chain を削除します。

1
nft delete chain inet $table $chain

table 全体を削除します。

1
nft delete table inet $table

日常的なデバッグでは、自分で作成した table だけを整理するのがおすすめです。システムや他のサービスが自動生成した table を直接変更しないほうが、ルールを書き間違えた場合でも戻しやすくなります。

使い方のポイント

nftables を使うときは、まず独立した table と chain を自分で作成すると扱いやすくなります。利点は次の 2 つです。

  1. システム既存のルールと混ざりにくい。
  2. デバッグ、flush、削除を安全に行いやすい。

ルールを書いたあとは、必ず nft list chain で実際のマッチ状況を確認します。特に MAC、インターフェイス、ポート、帯域制限のルールは、デバイス、ブリッジ構成、システムバージョンによって挙動が変わることがあります。複雑なルールを一度に書くより、まず小さい範囲で試すほうが安全です。

参考

记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。