nftables
Linuxのパケットフィルタリング基盤。iptablesの後継?らしいので、乗り換え。
必要なカーネルモジュールを組み込む。基本的な説明はGentooのマニュアルにて。Sakura Internetの解説も大変参考になる。
フィルタリングルール確認
# すべての設定 > nft list ruleset # -a オプションで各エレメントの操作に利用できるハンドル名が表示できる > nft -a list ruleset # ip(ipv4)の設定のみ > nft list ruleset ip
ルールセットの削除
# すべて削除 > nft flush ruleset # アドレスファミリの指定 > nft flush ruleset ip
ルールセットの保存
> nft list ruleset > <ファイル名> # Gentoo Linuxの場合は起動スクリプトでも保存できる。 # この場合、/var/lib/nftables/rules-saveに保存され、nftables起動スクリプトで起動時に読み込むようになる。 # /etc/conf.d/nftablesでSAVE_ON_STOP="yes"となっていると、シャットダウン時に現在の設定が保存される。 # 基本的には"no"にして、自分で保存する方がよいと思う。 > /etc/init.d/nftables save
Tableの作成と削除
nftablesでは、iptablesのように標準でTableは用意されない。処理するアドレスファミリのTableを任意の名称で作成する必要がある。
ipv4用のフィルタリングを設定するテーブルを「ipv4_filter」として作成する。nftablesではアドレスファミリの指定がなければ、標準ではipv4を示すipが指定される。
> nft create table ip ipv4_filter
Tableの削除
# Table名を指定 > nft delete table ip ipv4_filter
Chainの作成
ルールを格納するコンテナをChainという。Chainにリストされた順にルールが適用される。
チェーンには種類があり、Netfilterフックによってお呼ばれる「Base Chain」と、ユーザの指定で他のチェーンから呼ばれる「Regular Chain」がある。Chainの作成時に、タイプ、紐づけるフック、プライオリティを指定されたものがBase Chainとなる。
ここでは、ipv4_filterテーブルの中に、base_filterという名前でチェーンを作成する。タイプには、filterを指定し、フックはinputとしてローカルマシンをあて先としたパケットを対象とする。プライオリティは0としておく。プライオリティは、同じフックから呼び出されるチェーンが複数ある場合、数値が小さいものから適用される。ポリシーは、ひとまずAcceptとしておく。ここでdropとすると、すべてのパケットが破棄されてしまうため、sshもその時点で切れてしまう。
# add chain [<アドレスファミリ>] <テーブル名> <チェーン名> [<ベースチェーンのパラメータ>] # create chain [<アドレスファミリ>] <テーブル名> <チェーン名> [<ベースチェーンのパラメータ>] > nft add chain ip ipv4_filter base_filter {type filter hook input priority 0\; policy accept \; }
Ruleの作成
Chainでパケットをフックするタイミングが決まるので、その中に具体的なフィルタのルールを記述していく。