本文へスキップ
BecomeCoder

ネットワークコース · 第5章 ネットワークを守る · レッスン21

nft ― nftables で書く(iptables の後継)

ブラウザで完結

導入

iptables は長年の定番でしたが、いまのディストリビューションでは後継の nftables(コマンドは nft)が標準になりつつあります。iptables の4つのテーブル・複数コマンドを 1つの体系 にまとめ直したもので、記法もすっきりしています。netstat に対する ss のような関係——読めて・書ければ、これからのサーバーにそのまま通用します。

説明

nftables は「テーブル(table)の中に チェイン(chain)、その中に ルール(rule)」という入れ子で組み立てます。iptables の組み込みチェインと違い、チェインは自分で作り、どの hook(関所の位置)に、どんな policy(既定)で置くかを宣言します。

flowchart TD
    T["table inet filter"] --> C1["chain input<br/>hook input / policy drop"]
    T --> C2["chain forward<br/>hook forward / policy drop"]
    T --> C3["chain output<br/>hook output / policy accept"]
    C1 --> R1["tcp dport 22 accept"]
    C1 --> R2["tcp dport 80 accept"]
    C1 --> R3["… それ以外は policy drop"]

今のルールセット全体は nft list ruleset で見られます(iptables と同じく root が必要です)。

su -
nft list ruleset

iptables の初期状態と同じ「22 と 80 は通す」意図を、nftables では 「既定は drop、通すものだけ明示的に accept」 という現代的な書き方で表しています。前レッスンで学んだホワイトリスト方式そのものです。既定を閉じておくのが安全側の設計です。

ルールを足すのは nft add rule 家族 テーブル チェイン 条件... 動作 です。iptables のような -A-p--dport といったフラグではなく、自然な語順で書けるのが特徴です。

nft add rule inet filter input tcp dport 3306 drop
nft list ruleset

input チェインの末尾に tcp dport 3306 drop が増えます。見比べると、iptables の

iptables -A INPUT -p tcp --dport 3306 -j DROP

が、nftables では

nft add rule inet filter input tcp dport 3306 drop

とほぼ同じ意味になる、という対応が分かります。まるごと消してやり直すときは nft flush ruleset です。

inet は「IPv4 と IPv6 の両方」を指す家族(family)です。iptables では v4 と v6 でコマンドが分かれていました(iptablesip6tables)が、nftables は inet ひとつで両方まとめて書けます。これも「1つの体系にまとまった」良さのひとつです。

やってみよう

su - で root になってから nft list ruleset を打ち、table inet filter の中に inputforwardoutput の3チェインと、policy dropaccept の宣言が並ぶことを確認しましょう。nft add rule inet filter input tcp dport 3306 drop を足して nft list ruleset で末尾に増えるのを見て、iptables の同じ操作と記法を見比べてください。

演習

root に切り替えたうえで、nftables の現在のルールセット全体を表示してください。

ヒント1を見る

先に su -。一覧は nft list ruleset です。

ヒント2を見る

su - のあと nft list ruleset

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Linux シェル(シミュレート)

ブラウザ内でコマンドを試せる仮想シェルを読み込みます(本物のLinuxカーネルではなく学習用の再現です)。
スクロールして表示された時点でも自動で読み込まれます。