【ITニュース解説】Installing and Using nftables in Linux
2026年10月15日に「Dev.to」が公開したITニュース「Installing and Using nftables in Linux」について初心者にもわかりやすく解説しています。
ITニュース概要
Linuxの新しいファイアウォールnftablesはiptablesの後継。IPv4/IPv6など複数プロトコルを統一的に管理でき、設定がシンプルで高性能だ。本記事では、そのインストールから基本ルールの設定、SSH/HTTP/HTTPSアクセス許可、NAT/ポートフォワーディング、ログ設定までを解説し、安全なシステム構築に役立つ。
ITニュース解説
Linuxシステムを運用する上で、ネットワークの安全を守るファイアウォールは非常に重要な役割を担っている。これまでLinuxの標準的なファイアウォールツールとして「iptables」が広く使われてきたが、現在では「nftables」という新しいフレームワークがその座を引き継ぎつつある。nftablesは、iptablesが抱えていたいくつかの課題を解決し、より現代的で効率的なファイアウォール管理を提供する。
iptablesは、IPv4、IPv6、ARPといった異なるネットワークプロトコルごとに個別のツール(iptables、ip6tables、arptablesなど)を必要とし、それぞれに複雑なルール構造を持っていたため、大規模なシステムでの管理は煩雑になりがちであった。また、ルールセットが大きくなると処理が遅くなるというパフォーマンスの問題や、ルールを変更する際に全体を一度フラッシュしてから再ロードする必要があるため、一時的に通信が途切れる可能性があるといった課題があった。
これに対し、nftablesは「統一されたアプローチ」を最大の特長とする。IPv4、IPv6、ARPなど全てのプロトコルを単一のインターフェースとルールセットで管理できるため、設定の簡素化と一貫性の向上が実現されている。ルール構文はiptablesよりもシンプルで直感的になり、テーブルベースの設計を採用しているため、ルールの書き方が分かりやすくなった。パフォーマンス面では、ルール評価が最適化され、大規模なルールセットでも高速に処理できる。さらに、ルールをアトミックに(不可分に)変更できるため、ファイアウォールを停止することなくリアルタイムでの更新が可能になり、サービスへの影響を最小限に抑えられる。ロギング機能も強化され、高度なトレースオプションが組み込まれており、コネクション追跡もシステムに直接統合されている。リソースの使用効率も向上し、同じルールを重複して記述する必要がないため、メモリ消費量も抑えられる。
nftablesのインストールは、使用しているLinuxディストリビューションのパッケージマネージャを使って行う。例えばUbuntuやDebianではsudo apt update && sudo apt install nftables -y、Rocky LinuxやAlmaLinuxではsudo dnf update && sudo dnf install -y nftables、Arch Linuxではsudo pacman -S nftablesというコマンドでインストールできる。
インストール後、nftablesサービスを管理することで、設定したファイアウォールルールをシステム再起動後も永続化させることが可能だ。sudo systemctl enable nftablesでシステム起動時の自動開始を有効にし、sudo systemctl start nftablesでサービスを開始する。sudo systemctl status nftablesで現在のサービスの状態を確認できる。
nftablesのルールは「テーブル」「チェーン」「ポリシー」という3つの主要な概念に基づいて構成される。
テーブルは、ファイアウォールルールの大きなグループを格納するコンテナのようなものだ。inetテーブルはIPv4とIPv6の両方のトラフィックを処理でき、ipはIPv4のみ、ip6はIPv6のみを対象とする。
チェーンは、テーブルの中にあり、特定の種類のトラフィックを処理するためのルールのリストである。各チェーンは「フック」に関連付けられる。フックは、パケットがネットワークスタックのどの段階で評価されるかを定義するもので、例えばinputフックはローカルマシン宛のパケット、outputフックはローカルマシンから発信されるパケット、forwardフックはローカルマシンを通過するパケットに適用される。
ポリシーは、チェーン内のどのルールにも一致しなかったパケットに対して適用されるデフォルトのアクションを定義する。acceptはすべてのトラフィックを許可し、dropはパケットを黙って破棄し、rejectは破棄するとともに送信元に拒否通知を送る。セキュリティの観点からは、許可されていない全てのトラフィックを遮断するdropポリシーが最も推奨される。
基本的なファイアウォールルールを設定する際、まずsudo nft add table inet my_tableのように、新しいテーブルを作成する。次に、sudo nft add chain inet my_table input { type filter hook input priority 0 \; policy drop \; }のように、入力チェーンを作成し、デフォルトポリシーをdropに設定するのが一般的だ。これにより、明示的に許可されたトラフィック以外は全てブロックされる。
既存の接続を維持するためには、sudo nft add rule inet my_table input ct state established,related acceptというルールを追加し、すでに確立された通信や、それに付随する関連通信を許可する。
特定のIPアドレスからの通信をブロックするには、sudo nft add rule inet my_table input ip saddr 192.0.2.10 dropのように記述する。
SSH(ポート22)、HTTP(ポート80)、HTTPS(ポート443)といったサービスへのアクセスを許可するには、sudo nft add rule inet my_table input tcp dport 22 acceptなどのルールを追加する。
設定したルールはsudo nft list rulesetで全て表示でき、sudo nft list chain inet my_table inputで特定のチェーンのルールと、ルールの削除に必要なハンドル番号を確認できる。特定のルールを削除する場合は、sudo nft delete rule inet my_table input handle 0のようにハンドル番号を指定する。
ネットワークアドレス変換(NAT)やポートフォワーディングを設定することも可能だ。まず、LinuxカーネルでIPフォワーディングを有効にするため、/etc/sysctl.confファイルを編集し、net.ipv4.ip_forward=1の行を有効にしてから、sudo sysctl -pで変更を適用する。
次に、NAT処理のためのnatテーブルとpostroutingチェーンを作成する。sudo nft add table nat、sudo nft add chain nat postrouting { type nat hook postrouting priority 100 \; }。
内部ネットワークからインターネットへのアクセスを共有する(マスカレード)ルールは、sudo nft add rule nat postrouting ip saddr 192.0.2.0/24 oif enp1s0 masqueradeのように設定する。これは、指定された内部ネットワークからの発信トラフィックが、enp1s0インターフェースを通じてインターネットに出る際に、サーバーのIPアドレスに変換されることを意味する。
外部からの特定のポートへのトラフィックを内部のサーバーに転送するポートフォワーディング(DNAT)は、sudo nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; }でpreroutingチェーンを作成し、sudo nft add rule nat prerouting tcp dport 80 dnat to 192.0.2.10のように設定する。これは、外部からポート80へのHTTPトラフィックを、内部の192.0.2.10というサーバーに転送する例である。
設定したファイアウォールルールは、システム再起動後に失われないように永続化する必要がある。これは、現在のルールセットを/etc/nftables.confファイルに保存することで実現できる。sudo nft list ruleset | sudo tee /etc/nftables.confコマンドを実行し、ファイルを保存した後、sudo nft -f /etc/nftables.confでファイルを読み込み、sudo systemctl restart nftablesでサービスを再起動すれば、設定が適用され、再起動後も保持される。
さらに高度な設定として、SSH接続のレート制限によりブルートフォース攻撃を防ぐことができる。例えば、sudo nft add rule inet my_table input tcp dport 22 limit rate 3/minute acceptは、SSHポートへの接続を1分あたり3回までに制限し、それ以上は拒否することで不正なログイン試行を緩和する。
また、ドロップされたパケットをログに記録することで、セキュリティイベントの監視やトラブルシューティングに役立てられる。sudo nft 'add rule inet my_table input log prefix "nftables-drop: " drop'というルールを追加すると、パケットが破棄される前にログメッセージが記録される。
全てのnftablesルールをリセットしたい場合は、sudo nft flush rulesetコマンドを使用するが、これは全てのルールを削除し、ファイアウォールを実質的に無効にするため、非常に慎重に扱う必要がある。
nftablesは非常に柔軟で強力なツールであり、より効率的なルール管理のために、IPアドレスやポートのグループをまとめて管理する「セット」や「マップ」の活用、ルールセットをバージョン管理された設定ファイルにスクリプト化してデプロイを自動化すること、ログを集中管理システムと連携させて監視を強化すること、IPv6固有のルールを詳細に設定することなど、様々な応用法がある。これらを学ぶことで、より堅牢で効率的なネットワークセキュリティ環境を構築できるようになる。