nftablesを調べる/使う その2

はじめに

その1ではnftablesを使っていくうえでの用語などの概念的な部分をまずはさらっていきました。
前回は簡単にインストールまでを終わらせているので、今回は具体的にコマンドを使って設定をと思いましたが、デフォルトで記述されたルールを調べるのに意外と時間がかかってしまいました。

環境

サーバー: AWS EC2
OS: CentOS8

設定の一覧を見る

まずはnftablesのフィルタリングルール設定全体のルールセットを見てみます。このルールセットはデフォルトのルールセットのようで、/etc/nftables/main.nft がそれにルールセットで記述されています。nft list ruleset コマンドでは以下のように表示されていますが、実際にmain.nft ファイルを開くと違った記述がされています。(そのあたりはまた別途)

まずはコマンドで表示されたルールセットについて確認してみます。

[root@ip-172-30-3-189 ~]# nft list ruleset
table ip filter {
        chain INPUT {
                type filter hook input priority filter; policy accept;
                ct state related,established counter packets 3485 bytes 16848128 accept
                meta l4proto icmp counter packets 0 bytes 0 accept
                iifname "lo" counter packets 0 bytes 0 accept
                meta l4proto tcp ct state new tcp dport 22 counter packets 1 bytes 64 accept
                counter packets 1 bytes 362 reject with icmp type host-prohibited
        }

        chain FORWARD {
                type filter hook forward priority filter; policy accept;
                counter packets 0 bytes 0 reject with icmp type host-prohibited
        }

        chain OUTPUT {
                type filter hook output priority filter; policy accept;
        }
}

おさらいすると、table ip filter がip(IPv4)アドレスファミリのテーブルで、その下にINPUT, FORWARD, OUTPUT のチェーンが存在します。そして、それぞれのチェーンにはルールが記述されてます。

chain INPUT を確認してみます。

        chain INPUT {
                type filter hook input priority filter; policy accept;
                ct state related,established counter packets 3616 bytes 16857288 accept
                meta l4proto icmp counter packets 0 bytes 0 accept
                iifname "lo" counter packets 0 bytes 0 accept
                meta l4proto tcp ct state new tcp dport 22 counter packets 1 bytes 64 accept
                counter packets 1 bytes 362 reject with icmp type host-prohibited
        }

type filter hook input ; policy accept;

この行はベースチェーンパラメータで、
type filter はチェーンが汎用的なフィルタリング動作を指定しています。普段はfilterでいいのかもしれません。
hook input はNetfilterのinput処理のときフックで呼び出すことを意味しています。
policy accept とあるので chain INPUT では記述されたルールで処理されなかったパケットについては基本的に受け入れるようです。

ct state related,established counter packets 3616 bytes 16857288 accept

ct state related,established はiptablesで言うところのいつものあれです。
iptables -A INPUT -m state –state ESTABLISHED、RELATED -j ACCEPT
これです。既に確立した(許可された)接続か、既に確率した接続に関連した接続を許可しています。

ct の部分は初めて見ますが接続のトラッキングを意味しており、iptables の state モジュールと同じく、NEW, ESTABLISHED, RELATED の状態を判別するもののようです。

counter packets 3616 bytes 16857288 はパケットや許可したパケットのカウンターですね。そうすると counter ~ 以降の記述は特別見る必要もなさそうなので、ルールを見たときに見るべき部分が絞られてきました。

ではちょっとそのcounter packets ~以降を削除して、他のルールを見てみます。

meta l4proto icmp ~ accecpt
iifname “lo” ~ accept
meta l4proto tcp ct state new tcp dport 22 ~ accept
counter packets 1 bytes 362 reject with icmp type host-prohibited

meta l4proto icmp ~ accept はping を許可するルール
iifname “lo” ~ accept はローカルループバックの通信を許可するルール
meta l4proto tcp ct state new tcp dport 22 はもうぱっと見てSSH接続の許可だとわかってきます。

counter packets 1 bytes 362 reject with icmp type host-prohibited はちょっと書き方が変わってきたように思います。reject はパケットを拒否し、送信元に情報を返送するもので、reject with ~ で返送する情報を指定することができ、reject with icmp type host-profibited の場合は送信元ホストの接続が拒否されてることを伝えています。

ここまで見てきたものは iptables のデフォルトルール設定がそのままnftables の記述になっているだけなのですが、けっこうnftables の構文に慣れないとまだわかりづらいところがありますね。今回はここまでにして、次こそは具体的にコマンドを実行するか、もしくはconf設定を見ていきたいと思います。