本文へスキップ
BecomeCoder

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

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 でコマンドが分かれていました(iptables と ip6tables)が、nftables は inet ひとつで両方まとめて書けます。これも「1つの体系にまとまった」良さのひとつです。

やってみよう

su - で root になってから nft list ruleset を打ち、table inet filter の中に input・forward・output の3チェインと、policy drop/accept の宣言が並ぶことを確認しましょう。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カーネルではなく学習用の再現です)。
スクロールして表示された時点でも自動で読み込まれます。

次のレッスンへ →