nftコマンドの使い方をお探しですね。

広告

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

Linuxサーバーのファイアウォール設定といえば、長い間「iptables」が定番でしたよね。

でも最近は「nftables(nftコマンド)」が主流になってきています。

とはいえ、長年iptablesを使ってきたエンジニアにとっては、nftコマンドの新しい書き方や考え方がちょっと難しく感じるかもしれません。

この記事では、nftコマンドの基本から、実際の運用で絶対に必要になるルールの追加・削除・確認方法まで、できるだけわかりやすく説明していきます。

これからnftablesを使いこなしたい方は、ぜひ参考にしてみてください。

1. nftコマンドの基本的な考え方と構造

nftコマンドをうまく使うには、まず「nftablesがどんな仕組みでファイアウォールを管理しているか」を理解することが大切です。

iptablesでは最初からテーブルやチェーンがある程度用意されていましたが、nftablesは完全にまっさらな状態からスタートします。

つまり、自分で一から構造を作っていく必要があるんですね。

だからこそ、全体像をつかんでおくことが設定ミスを防ぐポイントになります。

nftablesの設定は、次の3つの階層で成り立っています。

**テーブル(Table)**
一番大きな枠組みです。

IPv4やIPv6など、どのネットワークプロトコル(ファミリー)を扱うかを決めます。

**チェーン(Chain)**
テーブルの中に作るグループです。

パケット(通信データ)がサーバーに入ってくるとき(input)や出ていくとき(output)など、「どのタイミングで処理するか」を決めます。

**ルール(Rule)**
チェーンの中に作る具体的な条件です。

「80番ポート宛ての通信は許可する」とか「特定のIPアドレスからの通信は拒否する」といった、実際のフィルタリング条件を設定します。

特に覚えておきたいのが、テーブルを作るときに指定する「ファミリー」という概念です。

IPv4だけを対象にする「ip」、IPv6だけを対象にする「ip6」のほかに、両方をまとめて扱える「inet」というファミリーがあります。

最近のWebサーバーやアプリケーションサーバーでは、IPv4とIPv6の両方で通信を制御することが多いので、基本的には「inet」ファミリーを使ってテーブルを作ると設定がシンプルになります。

2. 今の設定を確認する方法

ファイアウォールの設定を変更するとき、まず最初にやるべきことは「今どんな設定になっているか」を確認することです。

nftコマンドでは、システム全体に適用されているルールを一覧表示するコマンドが用意されています。

今の設定を確認せずに新しいルールをどんどん追加してしまうと、意図しない通信の遮断や既存ルールとのぶつかり合いが起きる可能性があるので、必ず確認する習慣をつけましょう。

現在の設定をすべて見るには、ターミナルで次のコマンドを実行します。

“`

nft list ruleset

“`

このコマンドを実行すると、今設定されているすべてのテーブル、チェーン、ルールが階層構造でわかりやすく表示されます。

もしまだ何も設定していない初期状態のサーバーなら、何も表示されずにプロンプトが戻ってきます。

その場合は、ゼロからファイアウォールを作っていくことになります。

また、後で説明する「ルールの削除」をするときに重要になるのが、各ルールに割り当てられている「ハンドル番号」の確認です。

ハンドル番号というのは、個々のルールをシステムが識別するための管理番号のことです。

ハンドル番号も一緒に表示したいときは、次のように「-a」オプションをつけて実行します。

“`

nft -a list ruleset

“`

このオプションをつけると、ルールの最後に「# handle 5」といった形で番号が表示されるようになります。

これを使えば、削除したいルールを正確に指定できるので、安全に操作できます。

3. ルールを追加する方法(通信の許可と拒否)

設定状態が確認できたら、次は実際に通信を制御するルールを追加していきましょう。

さっきも言ったように、nftablesは最初は空っぽなので、まず枠組みとなるテーブルとチェーンを作って、その中に具体的なルールを追加するという3ステップで進めます。

ここでは、Webサーバーを想定した基本的な設定を例に説明しますね。

**ステップ1:テーブルを作る**

まず、IPv4とIPv6の両方を制御するテーブルを作ります。

“`

nft add table inet my_table

“`

これで、inetファミリーの「my_table」という名前のテーブルができました。

**ステップ2:チェーンを作る**

次に、このテーブルの中にパケットの入力を処理するチェーンを作ります。

コマンドは少し長くなりますが、こんな感じです。

“`

nft add chain inet my_table my_input { type filter hook input priority 0 \; policy drop \; }

“`

ここで指定している「hook input」は「パケットが入ってくるタイミング」を表しています。

「policy drop」は「ルールに合わない通信はすべて基本的に拒否する」という意味で、セキュリティ上とても重要な設定です。

**ステップ3:具体的なルールを追加する**

枠組みができたら、最後に必要な通信を許可(または拒否)するルールを追加します。

HTTP通信を許可する場合:
“`

nft add rule inet my_table my_input tcp dport 80 accept

“`

SSH通信を許可する場合:
“`

nft add rule inet my_table my_input tcp dport 22 accept

“`

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

nft add rule inet my_table my_input ip saddr 192.168.1.100 drop

“`

「add」コマンドを使うと、指定したチェーンの最後尾にルールが追加されます。

もし特定のルールの前に新しいルールを優先的に入れたいときは、「add」の代わりに「insert」コマンドを使うと、チェーンの先頭にルールを配置できます。

ファイアウォールのルールは上から順番にチェックされるので、追加と挿入をうまく使い分けることが、意図通りのセキュリティを作るコツです。

4. ルールを削除する方法と設定の保存

不要になったルールをそのまま放置しておくと、セキュリティ上のリスクになるだけでなく、サーバーのネットワーク性能が落ちる原因にもなります。

なので、適切な手順でルールを削除する方法も覚えておきましょう。

また、コマンドラインから直接追加したルールは、サーバーを再起動すると完全に消えてしまうので、最終的には設定を保存する作業が必要です。

**ルールを削除する**

特定のルールを安全に削除するには、さっき紹介した「nft -a list ruleset」コマンドで、削除したいルールのハンドル番号を確認します。

たとえば、inetファミリーの「my_table」内にある「my_input」チェーンの、ハンドル番号5のルールを削除したいときは、次のように実行します。

“`

nft delete rule inet my_table my_input handle 5

“`

通信内容の文字列を指定して削除することもできますが、似たようなルールがあると間違って別のルールを消してしまう危険があるので、ハンドル番号で指定する方法を強くおすすめします。

なお、チェーン内のルールを全部まとめて消したいときは、次のコマンドを使います。

“`

nft flush chain inet my_table my_input

“`

**設定を保存する**

ファイアウォールの構築と動作確認が終わったら、最後に設定を保存しましょう。

今動いているルールセットをファイルに書き出すには、次のコマンドを実行します。

“`

nft list ruleset > /etc/nftables.conf

“`

(保存先のパスは、使っているLinuxディストリビューションによって違う場合があります)

保存したら、OS起動時にnftablesサービスが自動的に立ち上がって、このファイルを読み込むように設定しておきましょう。

“`

systemctl enable nftables

“`

これで、サーバーを再起動しても、しっかりしたファイアウォール環境が自動的に維持されるようになります。

まとめ

以上が、nftコマンドの基本的な使い方です。

最初はちょっと難しく感じるかもしれませんが、一つひとつ確認しながら進めていけば、きっとマスターできますよ!

広告