/br今号では、nftables について、その仕組みや設定方法について説明します!
nftables とは
nltables とはパケットフィルタリング (通過するパケットの IPアドレス、プロトコル、ポート番号などをフィルタリング設定に基づいてチェックし、通信を許可・拒否を判断すること) ツールの名称です。カーネル 3.13 (RHEL だとバージョン 8系) から導入されました。
従来は iptables、ip6tables、arptables、ebtables といった複数のツールを使い分けてフィルタリング設定をする必要がありましたが、これらのツールを 1つの nft コマンドに統合し、より管理しやすくなりました。
nftables は従来のツールと比較して構文がシンプルかつ柔軟に設定ができるようになっています。
なお、nftables について過去に下記の記事でもご紹介しています。2019年の記事ということもあり、前回説明しきれなかった部分も含めてご紹介できればと思います。
※内容が重複してしまう部分もあります。ご了承ください。
https://tech-lab.sios.jp/archives/16930#teburuno_she_ding
フィルタリング設定の全体的な構造
nftables では、フィルタリング設定のことをルールセットと呼びます。
ルールセットは、inet、ip、ip6 などのアドレスファミリごとに作成できるテーブル、さらにテーブル内にフィルタリングのルールをひとまとめに管理するためのチェーン、そしてチェーン内で具体的なルール設定を行うためのルールが含まれる構造になっています。
基本の書式
nft コマンドの基本的な使用方法をご説明します。
ルールセットの追加
nftables によるフィルタリング設定は、①テーブル、②チェーン、③ルール、という順序で行なっていきます。
- テーブルの追加
テーブルを新しく追加するには nft add table コマンドを使用します。
例1:inet ファミリのテーブルを作成# nft add table inet table1
例2:ip4 ファミリのテーブルを作成
# nft add table ip table2
- チェーンの追加
チェーンを新しく追加するには nft add chain コマンドを使用します。
例1:table1 テーブルに新しいチェーンを作成# nft add chain inet table1 chain1 { type filter hook input priority 0 \; }
- ルールの追加
ルールを新しく追加するには nft add rule コマンドを使用します。
例1:table1 テーブル内の chain1 に、22 番ポート (SSH) による外部アクセスを許可するルールを作成# nft add rule inet table1 chain1 tcp dport 22 accept
例2:table1 テーブル内の chain1 に,、80 番ポート (HTTP) による外部アクセスを許可するルールを作成
# nft add rule inet table1 chain1 tcp dport 80 accept
※ “{}” 内で指定する type、hook、priority に指定可能な値については、過去にご紹介した記事でも説明しています。
(ブログより抜粋)
—–
・type には、filter、route、nat のいずれかを設定します。
・hook には、prerouting、input、forward、output、postrouting のいずれかを設定します。
・priority には、チェインの優先度 (整数値) を設定します。
値が小さいほど、優先度は高くなります。また、負の値を設定することもできます。
—–
ルールセットの表示
ルールセットの内容を表示するには nft list ruleset コマンドを使用します。
# nft list ruleset table inet table1 { chain chain1 { type filter hook input priority filter; policy accept; tcp dport 22 accept tcp dport 80 accept } }
テーブルの一覧を表示するには nft list tables コマンドを使用します。
※テーブルの一覧のみ。内容は表示されません
# nft list tables table inet table1
特定のチェーンに設定されているルールの内容を表示するには、nft list chain コマンドを使用します。
# nft list chain inet table1 chain1 table inet table1 { chain chain1 { type filter hook input priority filter; policy accept; tcp dport 22 accept tcp dport 80 accept } }
ルールセットの削除
ルールを削除するには nft delete コマンドを使用します。
なお、ルールの削除には各ルールごとに設定されているハンドル番号が必須となります。
ハンドル番号の確認方法は、上で説明した nft list chain コマンドに –handle もしくは -a オプションを指定します。
# nft -a list chain inet table1 chain1 table inet table1 { chain chain1 { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 80 accept # handle 3 } }
# nft --handle list chain inet table1 chain1 table inet table1 { chain chain1 { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 80 accept # handle 3 } }
tcp dport 22 accept の横に handle 2、tcp dport 80 accept の横に handle 3 と記載されており、各ルールのハンドル番号を確認することができました。
例えば、上記のうち 22 番ポート (SSH) のルールを削除するには、下記の様に handle 2 と指定します。
# nft delete rule inet table1 chain1 handle 2
次号について
次号では、nftables の設定例や、知っておくと便利な tips についてご紹介します!