このページの目次
nftables 操作マニュアル
nftables は Linux の次世代ファイアウォールフレームワークであり、iptables/ip6tables/arptables/ebtables を置き換えます。nft コマンドを使用して管理し、設定はアトミックにロードできます。Gentoo では、カーネルで CONFIG_NF_TABLES および関連モジュールを有効にする必要があります。
主要な概念: table (namespace, family ごとにグループ化), chain (ルールコンテナ, type/hook/priority に分類), rule (マッチ条件+アクション), set (IP/ポートの集合), verdict (accept/drop/reject/ジャンプ)。
状態の確認
# すべてのルールをリスト表示
# テーブル/チェーンごとに確認
# sets / counters の確認
# ルールセットの統計
|
基本ルール管理
# 一時的な変更 (再起動で消失, テスト用)
# ハンドルの確認
# 出力例: tcp dport 22 accept # handle 5
永続化とアトミックロード
# 現在のルールセットを保存
# アトミックな置換 (推奨)
# 構文チェック (ロードしない)
# systemd による自動ロード
一般的なテーブル/チェーン構造テンプレート
table inet filter { # inet = IPv4 + IPv6
chain input {
type filter hook input priority 0; policy drop;
# lo を許可
iif lo accept
# 確立済み/関連接続を許可
ct state established,related accept
# SSH を許可
tcp dport 22 accept
# ICMPv6 を許可 (IPv6 で必須)
ip6 nexthdr icmpv6 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
ct state established,related accept
}
chain output {
type filter hook output priority 0; policy accept;
}
}
ルールの書き方
# マッチ条件
# アクション
# カスタムチェーンから戻る
NAT / ポートフォワーディング
# テーブル定義
# DNAT (ポートフォワーディング, 外部→内部)
# SNAT (出口の統一 IP)
# MASQUERADE (ダイナミック IP 出口, 例: DHCP インターフェース)
# ポートリダイレクト (ローカル 80 → 8080)
Sets (集合, 効率的な一括マッチ)
# 名前付き集合の定義
# または設定ファイル内で:
# set blackhole { type ipv4_addr; }
# 要素の動的追加/削除
# ルールでの使用
# ip saddr @blackhole drop
# タイムアウト付きの集合 (自動期限切れ)
# set ratelimit { type ipv4_addr; timeout 1h; }
# ip saddr @ratelimit counter drop
# 集合のタイプ:
# ipv4_addr / ipv6_addr IP アドレス
# ipv4_addr . inet_service IP+ポートの組み合わせ
# ifname インターフェース名
# mark 接続マーク
運用操作
# 指定位置へのルール挿入 (デフォルトは末尾追加)
# ルールの置換
# ルールのコメント
# ファイル内: tcp dport 22 accept comment "SSH access"
# カウンターのリセット
# リアルタイム監視
# デバッグ
一般的なシナリオ
# SSH 爆破攻撃対策 (新規接続のレートを制限)
# tcp dport 22 ct state new limit rate 4/minute accept
# tcp dport 22 ct state new drop
# 特定の IP のみポートアクセスを許可
# ip saddr {10.0.0.1, 10.0.0.2} tcp dport 5432 accept
# tcp dport 5432 drop
# 透過プロキシ (TPROXY, mihomo/v2ray と併用必要)
# table ip mangle {
# chain prerouting { type filter hook prerouting priority mangle; }
# }
# meta l4proto tcp ip daddr != 127.0.0.0/8 tproxy to :12345
# Docker ユーザーへの注意
# Docker は独自の iptables ルールを挿入するため、nftables と混在させると順序が乱れる可能性があります。
# 推奨: iptables のみを使用 (Docker 互換モード)、または nftables ルールが Docker より先にロードされることを確認
# 確認方法: nft list ruleset | grep -i docker
# Docker の nftables サポート: /etc/docker/daemon.json → "iptables": false
移行メモ (iptables → nft)
# 現在の iptables ルールを表示
# 自動翻訳 (完璧ではありませんが参考になります)
# 出力: nft add rule ip filter INPUT tcp dport 22 counter accept
# 一括翻訳 (完全なルールセット)