導入
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