nftablesについてお探しですね。

広告

Linuxのファイアウォール、iptablesからnftablesへ移行しよう

Linuxサーバーの管理で長年使われてきた「iptables」ですが、最近のディストリビューション(RHEL 8やDebian 10以降など)では、新しいツール「nftables」が標準になってきています。

「iptablesのコマンドを使っているつもりでも、実は裏でnftablesが動いている」なんてことも珍しくありません。

サーバー管理者なら、もうnftablesは避けて通れない時代になっているんですね。

この記事では、iptablesとの違いや仕組みの変更点、そして実際に使える基本コマンドまで、初心者の方にも分かりやすく、でも実務でもちゃんと使える深さで解説していきます。

nftablesって何?iptablesと何が違うの?

Linuxのファイアウォール機能は、カーネルの中にある「Netfilter」という仕組みで動いています。

これを操作するツールとして、従来のiptablesに代わって新しく作られたのがnftablesです。

一番大きな違いは、**コマンドの統一**です。

iptablesでは、IPv4用に「iptables」、IPv6用に「ip6tables」、ARP用に「arptables」、ブリッジ用に「ebtables」と、プロトコルごとに別々のコマンドを使わなければいけませんでした。

これがnftablesでは、**「nft」という1つのコマンドだけ**で全部管理できるようになったんです。

例えば、IPv4とIPv6の両方に同じルールを適用したいとき、iptablesでは2回設定を書く必要がありましたが、nftablesなら「inet」というファミリーを指定するだけで両方に適用できます。

設定がシンプルになって、読みやすさも格段に上がりました。

内部の処理も改良されていて、ルールをバイトコードにコンパイルしてからカーネルに渡す仕組みになったので、パケット処理のスピードも速くなっています。

運用面での大きなメリット

実際の運用で特に便利なのが、**「アトミックなルール更新」**ができるようになったことです。

iptablesでは、ルールを1つずつ追加・削除していたので、その処理の途中でパケットがすり抜けてしまったり、大量のルールを更新するときにサーバーに負荷がかかったりする問題がありました。

nftablesなら、複数のルール変更を1つのまとまりとして一気にカーネルに適用できます。

これで設定を変えている一瞬の隙を突かれる心配がなくなり、セキュリティを保ったまま安全に設定変更ができるんです。

もう1つの違いは、**テーブルの自由度**です。

iptablesでは「filter」「nat」「mangle」といったテーブルが最初から決まっていましたが、nftablesでは必要なテーブルだけを自分で作れます。

メモリの無駄も減って、より柔軟な構成が可能になりました。

既存のiptablesコマンドとの互換性(iptables-nft)も用意されていますが、nftables本来の機能をフルに使うには、ネイティブな「nft」コマンドに慣れておくのがおすすめです。

nftablesの基本構造を理解しよう

nftablesを使いこなすには、その**階層構造**を理解することが一番大切です。

iptablesでは最初から用意された枠組みにルールを当てはめていく感じでしたが、nftablesでは「テーブル」「チェーン」「ルール」という3つの階層を、自分でゼロから作っていく必要があります。

3つの階層

1. **テーブル(一番上の階層)**:IPv4(ip)、IPv6(ip6)、または両方(inet)など、どのプロトコルを扱うかを決める箱のようなもの
2. **チェーン(中間の階層)**:パケットをいつ処理するかを決めるタイミングの設定
3. **ルール(一番下の階層)**:具体的に「これは許可」「これは拒否」という条件

この構造のおかげで、例えば「Webサーバー用のテーブル」と「メンテナンス用のテーブル」を分けて管理して、必要なときだけ片方を無効にする、なんて運用も簡単にできます。

チェーンとフックの関係

初心者がつまずきやすいのが、**「チェーン」と「フック」の関係**です。

チェーンを作るときは、Netfilterが用意している「フック(hook)」という処理ポイントに紐付ける必要があります。

主なフックには次のようなものがあります:

– **prerouting**:パケットがシステムに届いた直後
– **input**:サーバー自身宛ての通信
– **forward**:他のマシンへ転送される通信
– **output**:サーバーから送信される通信
– **postrouting**:送信直前

例えば、サーバー自体を守るファイアウォールを設定したいなら、「input」フックを持つチェーンを作って、そこに「80番ポートは許可」みたいなルールを追加します。

チェーンには**「プライオリティ(優先度)」**も設定できます。

同じフックに複数のチェーンがある場合、数字が小さい順に処理されるので、どのルールを先に評価させるかをきっちりコントロールできます。

実際に使ってみよう!基本コマンド

では、実際にnftablesを操作する「nft」コマンドの使い方を見ていきましょう。

基本的には`nft [サブコマンド] [対象] [詳細]`という形で実行します。

現在の設定を確認する

まず、今どんな設定になっているか確認するには:

“`bash

nft list ruleset

“`

これはiptablesの`iptables-save`や`-L`に相当しますが、もっと読みやすい形式で表示されます。

テーブルを作る

設定を始めるには、まずテーブルを作ります。

IPv4/IPv6両対応のテーブル「filter」を作るなら:

“`bash

nft add table inet filter

“`

チェーンを作る

次に、その中にチェーンを作ります。

外部からの通信を制御するベースチェーンなら:

“`bash

nft add chain inet filter input { type filter hook input priority 0 \; }

“`

(コマンドラインではセミコロンの前に`\`が必要です)

ルールを追加する

ルールを追加するときは、作ったテーブルとチェーンを指定します。

**SSH(22番ポート)を許可する:**
“`bash

nft add rule inet filter input tcp dport 22 accept

“`

**特定のIPアドレスからの通信を拒否する:**
“`bash

nft add rule inet filter input ip saddr 192.168.1.100 drop

“`

便利な集合(Set)機能

nftablesの便利なところは、複数のポートやIPアドレスをまとめて扱える点です。

**80番と443番を同時に許可:**
“`bash

nft add rule inet filter input tcp dport { 80, 443 } accept

“`

iptablesでは2行書く必要がありましたが、nftablesなら波括弧を使って1行でOKです。

ルールを削除する

作ったルールを削除するには、まずハンドル番号(IDみたいなもの)を確認します:

“`bash

nft -a list ruleset

“`

それから、番号を指定して削除:

“`bash

nft delete rule inet filter input handle [番号]

“`

設定を保存して永続化する

nftコマンドで設定したルールは、そのままだと再起動すると消えてしまいます。

ちゃんと保存しておきましょう。

設定ファイルに保存

多くのディストリビューションでは`/etc/nftables.conf`がデフォルトの設定ファイルです。

現在の設定を保存するには:

“`bash

nft list ruleset > /etc/nftables.conf

“`

起動時に自動読み込み

システムが起動したときに自動で設定を読み込むには、systemdで有効化します:

“`bash

systemctl enable nftables
systemctl start nftables

“`

設定ファイルを反映

設定ファイルを編集したあとに反映させるには:

“`bash

nft -f /etc/nftables.conf

“`

このコマンドはファイルの内容を一気に読み込むので、設定ミスでサーバーに入れなくなるリスクも減らせます。

他のツールと一緒に使うときの注意点

DockerやUFW(Uncomplicated Firewall)みたいな他のネットワーク管理ツールと一緒に使うときは、特に注意が必要です。

やってはいけないこと

Dockerはコンテナの通信用に独自のiptables/nftablesルールを自動で作ります。

ここで安易に`nft flush ruleset`(全ルール削除)を実行してしまうと、これらのツールが作った大事なルールまで消してしまって、コンテナの通信が止まったり、UFWが無効になったりするトラブルが起きます。

正しい対処法

**全体をフラッシュせず、特定のテーブルだけを指定:**
“`bash

nft flush table inet my_table

“`

Docker環境で独自のフィルタリングをしたいときは:
– 「DOCKER-USER」チェーンみたいな特定のポイントを使う
– 優先度(priority)を慎重に設計した独自のチェーンを作る

こうすることで、ツールの自動設定と競合せずに共存できます。

まとめ

nftablesは最初は複雑に見えるかもしれませんが、慣れてくるとiptablesよりずっと柔軟で分かりやすいツールです。

これからのLinuxサーバー管理には欠かせないスキルなので、ぜひこの記事を参考に実際に触ってみてください!

広告