概要
パケットフィルタリングツールとして、今まで「iptables」を使用していましたが、CentOS8からは標準が「nftables」に変わりましたね。CentOS8でもiptablesはインストールすれば使用できますが、せっかく標準がnftablesになったので、そちらを使用してみようと思います。
iptablesとnftablesの違い、どちらがどのように長けているかを触ることで把握して、どちらが良いか見定めて、今後どうするかを決めていきたいと思います。
インストール
CentOS8で標準で入っているとは思うのですが、入っていない方は以下のコマンドでインストールを行いましょう。dnf install -y nftables
インストールはこれだけです。では設定を行っていきましょう。
設定方法
nftablesを用いて、パケットフィルタリングの設定を行うには「nft」コマンドを用いて行います。nft オプション 処理の対象 パラメータ
といった感じです。
テーブル追加
テーブルの追加を行うのであればnft add table xx yyyy
のようになります。
ここで、xxにはアドレスファミリー、yyyyにはテーブル名が入ります。 アドレスファミリーとは、
iptablesにおける「iptables」や「ip6tables」、「arptables」と同様の物でこれを指定することでIPv4やIPv6の指定ができます。
アドレスファミリーとiptablesの対応は以下になります。
「ip」→「iptables」
「ip6」→「ip6tables」
「inet」→「iptablesとip6tablesの両方」
「arp」→「arptables」
「bridge」→「ebtables」
「netdev」
これはnftablesで新たに出てきました。どうやらDDOS対策などに有効な物みたいですね。
詳しくは下記のURLを参照していただけると各々の説明が記載されています。
https://wiki.nftables.org/wiki-nftables/index.php/Nftables_families
実際に使用するコマンドの形は以下の形になります。
nft add table ip test
これでtestというテーブルが作成されます。
チェイン追加
テーブルの追加が完了したら、次にチェインを設定していきます。nft add chain ip test zzzz { type hook priority \; }
先ほど作成したテーブル「test」に、「zzzz」というチェイン名を付けて、type、hook、priorityを指定していきます。
typeには「filter」「nat」「route」が設定でき、それぞれで利用可能なアドレスファミリーとhookが決まっています。
「filter」では全て利用可能。
「nat」「route」ではアドレスファミリーは「ip、ip6」のみ
「nat」でのhookは「prerouting、input、output、postrouting」が利用可能で、「route」は「output」のみとなります。
「priority」は、そのチェインの優先度を設定します。値は小さければ優先度が高く、負の値も設定することが可能です。
ルール追加
これを踏まえた上でルールを作成していくのですが、実際にコマンドを見ないとわからない事の方が多いので、実際のルール設定をしていこうと思います。22番ポートからのアクセス拒否(drop)設定
nft add rule ip test zzzz tcp dport 22 drop
このような感じでルールを設定していきます。
また、ルールの削除の方法もご紹介します。
まず、ルールのハンドルを確認する必要があるので、下記のコマンドでハンドルを確認します。
nft --handle --numeric list chain test zzzz
すると、下記のようにルールの横に
# handle 2
などが記載されています。table ip test {
chain zzzz { # handle 1
type filter hook inpu priority 0; policy accept;
tcp dport 22 drop # handle 2
}
}
この、
# handle 2
が先ほど設定したルールのハンドルの番号です。このルールを削除する場合、以下のコマンドを実行します。
nft delete rule test zzzz handle 2
上記でルールの削除ができたと思いますので、確認してみましょう。
下記のコマンドで、定義済みのルールを確認することができます。
nft list ruleset
このほかに、チェイン内のルールを全て削除したい場合には以下のコマンドで全て削除できます。
nft flush chain test zzzz
総括
iptablesと違って、優先度を決定出来たり、なかなか細かいところまで手が届きそうです。ただ、まだ全くと言っていいほど慣れていない為、まだまだ使いこなすには程遠いですし、勉強をしていくことも必須かな、とは思います。ぜひとも、iptablesを使用していた方はnftablesを使用してみて、比較をしてみてはいかがでしょうか?