環境
$ 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の設定は完了。