nftablesを調べる/使う その1

はじめに

いつかはCentOS8での運用を始めるときがくる、ということで、iptablesからnftablesへの対応できるように少しnftablesについて触れながら勉強してみようと思いました。 けどその前に、まずはわかる範囲でnftablesに触れるときに出てくる用語やその関係性についてさらってみようと思います。調べていくとnftablesどころかNetfilterやLinuxカーネルも深堀りしないといけない雰囲気がありますが、ほどほどで止めておきます。

環境

サーバー: AWS EC2
OS: CentOS8

nftables? iptables-nft?

CentOS8からはiptables-serviceを引き続きインストール可能ですが、バックエンドはnftablesになっています。つまり、iptablesコマンドも引き続き使用することは一応可能です。 とはいえ、いつかはiptablesも使えなくなってくると思われるので、nftablesを直接さわっていきます。

nftablesを調べていくうえでのざっくりとした用語の整理

Netfilter

Linuxカーネルがネットワーク処理を実行する際に、そのタイミングで事前に登録しておいた処理を実行できるようにするための”フック”を提供する。 input, forward, outputなどのネットワークパケット処理の各段階でフックを使って登録された関数を実行する。
Netfilterの各フックが実行されるタイミングで、netfilterであらかじめ登録していたルールに従ってパケットを処理され、パケットの操作やフィルタリングが実現する。

アドレスファミリ(Address Family) またはファミリ(Family)

nftablesでは各対象のプロトコルをアドレスファミリ(またはファミリ)と呼ぶ。そして各アドレスファミリ毎にテーブル(tables)という設定を作ることができる。下記はよそからコピペした表。

対象の各アドレスファミリ一覧

名称説明
ipIPv4
ip6IPv6
inetIPv4およびIPv6
arpARP
bridgeネットワークブリッジ
netdevネットワークインターフェイスなどのネットワークデバイス

各Address Family にtables を作成するので、例えば、inet以下に テーブル(tables)を作ることができるという感じ。

ルールセット(ruleset)

nftablesのフィルタリングルール設定全体のこと

ルールセットを構成する簡単な全体図

ルールセット  
      ┣  アドレスファミリ: テーブルA...Z  
                ┣  チェーンA...Z  
                        ┣  ルール1...n  

テーブル(tables)

ルールセットにはアドレスファミリ毎にテーブルが作成できる。ip: tabaleA, ip6: tablesB inet: tablesC また、アドレスファミリには複数のテーブルを作れる。ip: tableA ip: tablesB

チェーン(chain)

チェーンはNetfilterのフックによって呼び出されるもので、input, forward, output などがそれに当たる。

ベースチェーン(base chain)

Netfilterのフックによって呼び出されるチェーン。

レギュラーチェーン(regular chain)

他のチェーンから呼び出されるチェーン。jump, goto などのステートメントによって呼び出される。

ルール

パケットフィルタリングをどのように処理するかを記述したもの

ハンドル

テーブルに割り振られる一意な数字のこと。そのテーブルを識別するための数字として扱える。テーブルの削除のときにハンドル(数字)を指定して削除できる。

インストール/起動

今回はひとまずインストールして起動するところまでを行い、次回は実際に使いそうなコマンドを実行していきたいと思います。

EC2のCentOS8 AMI ではインストール直後に起動できるファイアウォールのサービスが存在しないようで、最初はnftablesをインストールするところから始めます。

[root@ip-172-30-3-223 ~]# dnf install nftables
[root@ip-172-30-3-223 ~]# systemctl enable nftables
Created symlink /etc/systemd/system/multi-user.target.wants/nftables.service → /usr/lib/systemd/system/nftables.service.
[root@ip-172-30-3-223 ~]# systemctl start nftables
[root@ip-172-30-3-223 ~]# systemctl status nftables
● nftables.service - Netfilter Tables
   Loaded: loaded (/usr/lib/systemd/system/nftables.service; enabled; vendor preset: disabled)
   Active: active (exited) since Wed 2020-10-28 02:16:49 UTC; 22s ago
     Docs: man:nft(8)
  Process: 12972 ExecStart=/sbin/nft -f /etc/sysconfig/nftables.conf (code=exited, status=0/SUCCESS)
 Main PID: 12972 (code=exited, status=0/SUCCESS)

Oct 28 02:16:49 ip-172-30-3-223.ap-northeast-1.compute.internal systemd[1]: Starting Netfilter Tables...
Oct 28 02:16:49 ip-172-30-3-223.ap-northeast-1.compute.internal systemd[1]: Started Netfilter Tables.

今回はここまで。