ファイアウォールを設定

環境

$ cat /etc/redhat-release

の結果は次の通り。

Rocky Linux release 9.1 (Blue Onyx)

参考ページ

Linuxにおける新たなパケットフィルタリングツール「nftables」入門

概要

iptables廃止で、nftablesが使われるらしい。
firewalldもnftablesも根本は同じなので、慣れた方使えば良さそう。

おおざっぱな違いは下記の通り。

  • firewalld:ネットワークに詳しくない人でもできるように考えられている。
  • nftables:多少ネットワークの知識が必要。

Tips

  • nftablesがインストールされているか確認するには、次のコマンドを使う。
    # dnf list installed | grep nftables
  • nftablesはシステム起動時に下記ファイルを読み込む。
    /etc/sysconfig/nftables.conf
  • 設定ファイルのサンプルは下記の場所に置かれている。
    /etc/nftables
  • nftables.confを読むと、設定を直接nftables.confに書き込むのでは無く、
    includeで/etc/nftablesに配置した.nftファイルを読み込ませるのが良いらしい。
  • nftコマンドで変更された内容はnftablesを再起動すると元に戻る。

nftablesの構成について簡易まとめ

  • フィルタリングルール設定全体のことをルールセットと呼び、ルールセットにはアドレスファミリ毎に作成できるテーブルがあり、テーブル内にはルールを管理するための入れ物であるチェインがあり、ルールにパケットフィルタリングをどのように行うかを記述する。
  • ユーザはテーブルをいくつでも作成可能。
  • デフォルトのテーブルは存在しない。
  • 1つのアドレスファミリに対し、複数のテーブルを作成することも可能。実行順序はテーブル内のチェインの優先度によって決まる。
  • ユーザはチェインをいくつでも作成可能。
  • ベースチェインとレギュラーチェインが存在し、ベースチェインは作成時にそのタイプや紐付けるフック、デバイス、プライオリティが指定され、レギュラーチェインはルール内のjumpやgotoで呼び出される、プログラミングにおけるサブルーチンのようなもの。
  • チェインの最後にdropを加えることで、ポリシーをAcceptにしながら指定したパケット以外をdropすることが可能。

手順

firewalldを無効化する。

# systemctl disable --now firewalld

nftablesを有効化する。

# systemctl enable --now nftables

SSHとWebサーバに関するルールだけなので、テーブル1つ、ベースチェインもiptablesと同様に3つで設定する。

テーブル作成。

# nft create table inet filter

テーブルが作成されたことを確認。

# nft list tables

ベースチェインを作成。

# nft create chain inet filter input { type filter hook input priority 0\; policy drop\; }
# nft create chain inet filter output { type filter hook output priority 0\; policy accept\; }
# nft create chain inet filter forward { type filter hook forward priority 0\; policy drop\; }

SSHの22番ポート向けのパケットを全てAcceptする。

# nft add rule inet filter input tcp dport 22 accept

Webサーバの80番ポート向けのパケットを全てAcceptする。

# nft add rule inet filter input tcp dport 80 accept

Webサーバの443番ポート向けのパケットを全てAcceptする。

# nft add rule inet filter input tcp dport 443 accept

コネクションが確立した通信のパケットと、
コネクションが確立した通信に関連するパケットをAcceptする。

# nft add rule inet filter input ct state related, established accept

ローカルホストからのパケットをAcceptする。

# nft add rule inet filter input iif lo accept

pingを使えるようにAcceptする。

# nft add rule inet filter input icmp type { echo-request, echo-reply } accept

上記コマンドでSSHとpingについては正常に動作することを確認した。
(Webサーバ関連の確認は、Webサーバ構築後に行う)

再起動しても設定が保持されるようにするには、

/etc/nftables/任意のファイル名.nft

に、下記のコマンドで表示された文字列をコピーしても良いはず。
# nft list ruleset

(ただし、1行目にflush rulesetのコマンドは加えておいた方が良い)

今回作成した/etc/nftables/ファイル名.nftの内容は下記の通り。

# 初期化。
flush ruleset
# filterテーブル
table inet filter {
    # inputベースチェイン
    chain input {
        type filter hook input priority 0; policy drop;
        # SSHのポート22番向けのパケットを全てAcceptする。
        tcp dport 22 accept
        # HTTPサーバのポート80番向けのパケットを全てAcceptする。
        tcp dport 80 accept
        # HTTPSサーバのポート443番向けのパケットを全てAcceptする。
        tcp dport 443 accept
        # 確立済みコネクションのパケットと、それに関連するパケットをAcceptする。
        ct state related, established accept
        # ローカルホスト(サーバ自身)からのパケットをAcceptする。
        iif lo accept
        # pingを使えるようにAcceptする。
        icmp type { echo-request, echo-reply } accept
    }
    # outputベースチェイン
    chain output {
        type filter hook output priority 0; policy accept;
    }
    # forwardベースチェイン
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
}

作成したファイル名.nftを反映させるために、

/etc/sysconfig/nftables.conf

に、下記文字列を追加する。

include "/etc/nftables/ファイル名.nft"

動作確認をするために、nftablesを下記コマンドで再起動。

# systemctl restart nftables

nftablesが正常に起動していることを確認するために、下記コマンドで確認。

# systemctl status nftables

nftablesが正常に起動していたら、下記コマンドで確認。

# nft list ruleset

設定した通りの内容が記載されていれば、nftablesの設定は完了。

コメント

タイトルとURLをコピーしました