<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.archlinux.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nakarch</id>
	<title>ArchWiki - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.archlinux.jp/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nakarch"/>
	<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Nakarch"/>
	<updated>2026-04-19T06:44:22Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.44.3</generator>
	<entry>
		<id>https://wiki.archlinux.jp/index.php?title=Nftables&amp;diff=41364</id>
		<title>Nftables</title>
		<link rel="alternate" type="text/html" href="https://wiki.archlinux.jp/index.php?title=Nftables&amp;diff=41364"/>
		<updated>2026-03-01T06:00:59Z</updated>

		<summary type="html">&lt;p&gt;Nakarch: /* Docker と共に使う */ PrivateMounts=No を追加（英語版を反映）&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:nftables}}&lt;br /&gt;
[[Category:ファイアウォール]]&lt;br /&gt;
[[en:nftables]]&lt;br /&gt;
{{Related articles start}}&lt;br /&gt;
{{Related|iptables}}&lt;br /&gt;
{{Related|Firewalld}}&lt;br /&gt;
{{Related articles end}}&lt;br /&gt;
[https://netfilter.org/projects/nftables/ nftables] は既存の ip-, ip6-, arp-, ebtables フレームワークを置き換える netfilter のプロジェクトです。新しいパケットフィルタリングフレームワーク、新しいユーザースペースユーティリティ (nft)、そして ip- と ip6tables の互換レイヤーを提供します。現行のフック、接続追跡システム、ユーザースペースのキューイングコンポーネント、そして netfilter のログサブシステムを使っています。&lt;br /&gt;
&lt;br /&gt;
nftables は3つのメインコンポーネントから構成されています: カーネルの実装、libnl netlink communication そして nftables ユーザースペースフロントエンド。カーネルは netlink の設定インターフェイスだけでなく、小さなクラス言語インタプリタを使用するランタイムのルールセットの評価も提供します。libnl にはカーネルと通信するためのローレベルな関数が含まれています。nftables フロントエンドはユーザーが対話するものです。&lt;br /&gt;
&lt;br /&gt;
[https://wiki.nftables.org/wiki-nftables/index.php/Main_Page nftables の公式 wiki] には詳しい情報が載っています。&lt;br /&gt;
&lt;br /&gt;
== インストール ==&lt;br /&gt;
&lt;br /&gt;
nftables のユーザーランドユーティリティは {{Pkg|nftables}} パッケージで利用できます。開発版の {{AUR|nftables-git}} パッケージも存在します。&lt;br /&gt;
&lt;br /&gt;
{{Tip|ほとんどの [[iptables#Front-ends|iptables フロントエンド]] はnftables の直接的または間接的なサポートを備えていませんが、導入することは可能です。[https://www.spinics.net/lists/netfilter/msg58215.html] nftables と iptables の両方をサポートするグラフィカルなフロントエンドとしては、[[firewalld]] があります。[https://firewalld.org/2018/07/nftables-backend]}}&lt;br /&gt;
&lt;br /&gt;
== 使用方法 ==&lt;br /&gt;
&lt;br /&gt;
nftables ではコマンドラインで作成される一時的なルールと、ファイルに保存して読み込まれる永続的なルールを区別していません。デフォルトファイルの {{ic|/etc/nftables.conf}} には &amp;quot;inet filter&amp;quot; という名前のシンプルな ipv4/ipv6 ファイアウォールテーブルが既に記述されています。&lt;br /&gt;
&lt;br /&gt;
{{ic|nftables.service}} を[[起動]]・[[有効化]]してください。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでルールセットを確認できます:&lt;br /&gt;
&lt;br /&gt;
 # nft list ruleset&lt;br /&gt;
&lt;br /&gt;
=== シンプルなファイアウォール ===&lt;br /&gt;
​&lt;br /&gt;
{{Pkg|nftables}} には、{{ic|/etc/nftables.conf}} ファイルに保存されたシンプルで安全なファイアウォール設定が付属しています。&lt;br /&gt;
​&lt;br /&gt;
{{ic|nftables.service}} は、[[起動]]または[[有効化]]時に、このファイルからルールを読み込みます。&lt;br /&gt;
&lt;br /&gt;
== 設定 ==&lt;br /&gt;
&lt;br /&gt;
nftables のユーザースペースユーティリティ {{ic|nft}} は現在カーネルのためにルールセットを処理する前にほとんどのルールセットの評価を行います。ルールはチェインに保存され、チェインはテーブルに保存されます。下のセクションではルールを作成・編集する方法を説明します。&lt;br /&gt;
&lt;br /&gt;
下のセクションで行った変更は全て一時的なものになります。変更を永続化するにはルールセットを {{ic|/etc/nftables.conf}} に保存してください (ルールセットは {{ic|nftables.service}} によって読み込まれます):&lt;br /&gt;
&lt;br /&gt;
 # nft list ruleset &amp;gt; /etc/nftables.conf&lt;br /&gt;
&lt;br /&gt;
{{Note|{{ic|nft list}} は変数の定義を出力しません。{{ic|/etc/nftables.conf}} に何か記述していた場合、定義は失われます。ルールによって使われていた変数は変数の値に置き換えられます。}}&lt;br /&gt;
&lt;br /&gt;
ファイルから入力するには {{ic|-f}} フラグを使用します:&lt;br /&gt;
&lt;br /&gt;
 # nft -f &#039;&#039;filename&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ロード済みのルールは自動的に消去されることはないので注意してください。&lt;br /&gt;
&lt;br /&gt;
利用可能なコマンドの一覧は {{man|8|nft}} を参照してください。&lt;br /&gt;
&lt;br /&gt;
===テーブル===&lt;br /&gt;
&lt;br /&gt;
テーブルは[[#チェイン|チェイン]]を保持します。iptables のテーブルと違って、nftables には初めから組み込まれているテーブルはありません。テーブルの数や名前はユーザーが自由に決めることができますが、各テーブルにはアドレスファミリーをひとつしか保持することができません。5つのファミリーのうち指定したファミリーのパケットにだけ適用されます:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! nftables ファミリー || iptables ユーティリティ&lt;br /&gt;
|-&lt;br /&gt;
| ip || iptables&lt;br /&gt;
|-&lt;br /&gt;
| ip6 || ip6tables&lt;br /&gt;
|-&lt;br /&gt;
| inet || iptables と ip6tables&lt;br /&gt;
|-&lt;br /&gt;
| arp || arptables&lt;br /&gt;
|-&lt;br /&gt;
| bridge || ebtables&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{ic|ip}} (IPv4) がデフォルトのファミリーです。特に指定がなければ {{ic|ip}} が使われます。&lt;br /&gt;
&lt;br /&gt;
IPv4 と IPv6 の両方に適用されるルールを作成するには {{ic|inet}} を使います。{{ic|inet}} を使うには Linux 3.15 以上が必要で、{{ic|ip}} と {{ic|ip6}} ファミリーを統一してルールを簡単に定義できます。&lt;br /&gt;
&lt;br /&gt;
{{Note|{{ic|inet}} は {{ic|nat}} タイプのチェインでは使えず、{{ic|filter}} タイプのチェインを使う必要があります ([https://www.spinics.net/lists/netfilter/msg56411.html ソース])。}}&lt;br /&gt;
&lt;br /&gt;
アドレスフファミリーの完全な定義は {{man|8|nft}} の {{ic|ADDRESS FAMILIES}} セクションを参照してください。&lt;br /&gt;
&lt;br /&gt;
以下で例示しているコマンドの {{ic|&#039;&#039;family&#039;&#039;}} は全て任意であり、指定しなかった場合は {{ic|ip}} が使われます。&lt;br /&gt;
&lt;br /&gt;
==== テーブルの作成 ====&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで新しいテーブルが追加されます:&lt;br /&gt;
&lt;br /&gt;
 # nft add table &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== テーブルの表示 ====&lt;br /&gt;
&lt;br /&gt;
全てのテーブルを表示するには:&lt;br /&gt;
&lt;br /&gt;
 # nft list tables&lt;br /&gt;
&lt;br /&gt;
==== テーブル内のチェインとルールの表示 ====&lt;br /&gt;
&lt;br /&gt;
指定したテーブルの全てのチェインとルールを表示するには:&lt;br /&gt;
&lt;br /&gt;
 # nft list table &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
例えば {{ic|inet}} ファミリーの {{ic|filter}} テーブルのルールを全て表示するには:&lt;br /&gt;
&lt;br /&gt;
 # nft list table inet filter&lt;br /&gt;
&lt;br /&gt;
==== テーブルの削除 ====&lt;br /&gt;
&lt;br /&gt;
テーブルを削除するには:&lt;br /&gt;
&lt;br /&gt;
 # nft delete table &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
テーブルはチェインが全く存在しない場合にのみ削除できます。&lt;br /&gt;
&lt;br /&gt;
==== テーブルのクリア ====&lt;br /&gt;
&lt;br /&gt;
テーブルから全てのルールを消去するには:&lt;br /&gt;
&lt;br /&gt;
 # nft flush table &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===チェイン===&lt;br /&gt;
&lt;br /&gt;
チェインの用途は[[#ルール|ルール]]を保持することです。iptables のチェインと違って、nftables には初めから組み込まれているチェインはありません。そのためチェインが netfilter フレームワークにあるタイプやフックをどれも使わない場合、iptables とは異なりチェインを通り抜けるパケットは nftables の影響を受けません。&lt;br /&gt;
&lt;br /&gt;
チェインには2つのタイプがあります。&#039;&#039;base&#039;&#039; チェインはネットワークスタックからのパケットのエントリポイントとなります。フックの値を指定することができます。&#039;&#039;regular&#039;&#039; チェインはジャンプターゲットとして使用することができます。&lt;br /&gt;
&lt;br /&gt;
以下のコマンドで使っている {{ic|&#039;&#039;family&#039;&#039;}} は全て任意であり、指定しなかった場合は {{ic|ip}} が使われます。&lt;br /&gt;
&lt;br /&gt;
==== チェインの作成 ====&lt;br /&gt;
&lt;br /&gt;
===== Regular チェイン =====&lt;br /&gt;
&lt;br /&gt;
以下のコマンドは {{ic|&#039;&#039;table&#039;&#039;}} という名前のテーブルに {{ic|&#039;&#039;chain&#039;&#039;}} という名前のレギュラーチェインを追加します:&lt;br /&gt;
&lt;br /&gt;
 # nft add chain &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039; &#039;&#039;chain&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
例えば、{{ic|inet}} アドレスファミリーの {{ic|filter}} テーブルに {{ic|tcpchain}} という名前のレギュラーチェインを追加するには:&lt;br /&gt;
&lt;br /&gt;
 # nft add chain inet filter tcpchain&lt;br /&gt;
&lt;br /&gt;
===== Base チェイン =====&lt;br /&gt;
&lt;br /&gt;
ベースチェインを追加するにはフックとプライオリティの値を指定します:&lt;br /&gt;
&lt;br /&gt;
 # nft add chain &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039; &#039;&#039;chain&#039;&#039; { type &#039;&#039;type&#039;&#039; hook &#039;&#039;hook&#039;&#039; priority &#039;&#039;priority&#039;&#039; \; }&lt;br /&gt;
&lt;br /&gt;
{{ic|&#039;&#039;type&#039;&#039;}} は {{ic|filter}}, {{ic|route}}, {{ic|nat}} のどれかから選ぶことができます。&lt;br /&gt;
&lt;br /&gt;
IPv4/IPv6/Inet アドレスファミリーでは {{ic|&#039;&#039;hook&#039;&#039;}} は {{ic|prerouting}}, {{ic|input}}, {{ic|forward}}, {{ic|output}}, {{ic|postrouting}} のどれかになります。他のファミリーのフックについては {{man|8|nft}} を参照してください。&lt;br /&gt;
&lt;br /&gt;
{{ic|&#039;&#039;priority&#039;&#039;}} には整数値を指定します。低い値のチェインが先に処理され、負の値を指定することもできます [https://wiki.nftables.org/wiki-nftables/index.php/Configuring_chains#Base_chain_types]。&lt;br /&gt;
&lt;br /&gt;
例えば、input パケットをフィルタリングするベースチェインを追加するには:&lt;br /&gt;
&lt;br /&gt;
 # nft add chain inet filter input { type filter hook input priority 0\; }&lt;br /&gt;
&lt;br /&gt;
{{ic|add}} を {{ic|create}} に置き換えると、チェインが既に存在するときにエラーが返ってくるようになります。&lt;br /&gt;
&lt;br /&gt;
==== ルールの表示 ====&lt;br /&gt;
&lt;br /&gt;
以下のコマンドでチェインの全てのルールを表示できます:&lt;br /&gt;
&lt;br /&gt;
 # nft list chain &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039; &#039;&#039;chain&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
例えば、{{ic|filter}} という名前の {{ic|inet}} テーブルに存在する {{ic|output}} という名前のチェインのルールを表示するには:&lt;br /&gt;
&lt;br /&gt;
 # nft list chain inet filter output&lt;br /&gt;
&lt;br /&gt;
==== チェインの編集 ====&lt;br /&gt;
&lt;br /&gt;
チェインを編集したいときは、チェインの名前を指定して変更したいルールを定義します:&lt;br /&gt;
&lt;br /&gt;
 # &amp;lt;nowiki&amp;gt;nft chain &amp;lt;family&amp;gt; &amp;lt;table&amp;gt; &amp;lt;chain&amp;gt; { [ type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; device &amp;lt;device&amp;gt; priority &amp;lt;priority&amp;gt; \; policy &amp;lt;policy&amp;gt; \; ] }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば、デフォルトテーブルの input チェインポリシーを &amp;quot;accept&amp;quot; から &amp;quot;drop&amp;quot; に変更したい場合:&lt;br /&gt;
&lt;br /&gt;
 # nft chain inet filter input { policy drop \; }&lt;br /&gt;
&lt;br /&gt;
==== チェインの削除 ====&lt;br /&gt;
&lt;br /&gt;
チェインを削除するには:&lt;br /&gt;
&lt;br /&gt;
 # nft delete chain &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039; &#039;&#039;chain&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
削除するチェインにはルールやジャンプターゲットが含まれていてはいけません。&lt;br /&gt;
&lt;br /&gt;
==== チェインのルールを消去 ====&lt;br /&gt;
&lt;br /&gt;
チェインからルールを消去するには:&lt;br /&gt;
&lt;br /&gt;
 # nft flush chain &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039; &#039;&#039;chain&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== ルール ===&lt;br /&gt;
&lt;br /&gt;
ルールは表現または宣言から構成され、チェインの中に格納されます。&lt;br /&gt;
&lt;br /&gt;
==== ルールの追加 ====&lt;br /&gt;
&lt;br /&gt;
{{Tip|&#039;&#039;iptables-translate&#039;&#039; ユーティリティを使うことで [[iptables]] のルールを nftables フォーマットに変換できます。}}&lt;br /&gt;
&lt;br /&gt;
チェインにルールを追加するには:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039; &#039;&#039;chain&#039;&#039; &#039;&#039;position&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ルールは {{ic|&#039;&#039;position&#039;&#039;}} に追加されます。位置は指定しなくてもかまいません。指定しなかった場合、ルールはチェインの末尾に追加されます。&lt;br /&gt;
&lt;br /&gt;
特定の位置の前にルールを追加するには:&lt;br /&gt;
&lt;br /&gt;
 # nft insert rule &#039;&#039;family&#039;&#039; &#039;&#039;table&#039;&#039; &#039;&#039;chain&#039;&#039; &#039;&#039;position&#039;&#039; &#039;&#039;statement&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{ic|&#039;&#039;position&#039;&#039;}} を指定しなかった場合、ルールはチェインの一番前に追加されます。&lt;br /&gt;
&lt;br /&gt;
===== 表現 =====&lt;br /&gt;
&lt;br /&gt;
{{ic|&#039;&#039;statement&#039;&#039;}} にはマッチする表現と判断宣言が入ります。判断宣言には {{ic|accept}}, {{ic|drop}}, {{ic|queue}}, {{ic|continue}}, {{ic|return}}, {{ic|jump &#039;&#039;chain&#039;&#039;}}, {{ic|goto &#039;&#039;chain&#039;&#039;}} などが存在します。判断宣言以外の宣言も指定できます。詳しくは {{man|8|nft}} を参照してください。&lt;br /&gt;
&lt;br /&gt;
nftables では様々な表現を使うことができ、ほとんどは、iptables と対応するようになっています。一番大きな違いは汎用的なマッチと暗黙的なマッチが存在しないことです。汎用的なマッチとは、{{ic|--protocol}} や {{ic|--source}} のように、いつでも使うことができるマッチで、暗黙的なマッチとは、{{ic|--sport}} のように、特定のプロトコルでしか使えないマッチのことです。&lt;br /&gt;
&lt;br /&gt;
以下は利用できるマッチの一部です:&lt;br /&gt;
&lt;br /&gt;
* meta    (メタプロパティ。例: インターフェイス)&lt;br /&gt;
* icmp    (ICMP プロトコル)&lt;br /&gt;
* icmpv6  (ICMPv6 プロトコル)&lt;br /&gt;
* ip      (IP プロトコル)&lt;br /&gt;
* ip6     (IPv6 プロトコル)&lt;br /&gt;
* tcp     (TCP プロトコル)&lt;br /&gt;
* udp     (UDP プロトコル)&lt;br /&gt;
* sctp    (SCTP プロトコル)&lt;br /&gt;
* ct      (接続のトラッキング)&lt;br /&gt;
&lt;br /&gt;
以下はマッチ引数の一部です (完全なリストは {{man|8|nft}} を見て下さい):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
meta:&lt;br /&gt;
  oif &amp;lt;output interface INDEX&amp;gt;&lt;br /&gt;
  iif &amp;lt;input interface INDEX&amp;gt;&lt;br /&gt;
  oifname &amp;lt;output interface NAME&amp;gt;&lt;br /&gt;
  iifname &amp;lt;input interface NAME&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  (oif and iif accept string arguments and are converted to interface indexes)&lt;br /&gt;
  (oifname and iifname are more dynamic, but slower because of string matching)&lt;br /&gt;
&lt;br /&gt;
icmp:&lt;br /&gt;
  type &amp;lt;icmp type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
icmpv6:&lt;br /&gt;
  type &amp;lt;icmpv6 type&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ip:&lt;br /&gt;
  protocol &amp;lt;protocol&amp;gt;&lt;br /&gt;
  daddr &amp;lt;destination address&amp;gt;&lt;br /&gt;
  saddr &amp;lt;source address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ip6:&lt;br /&gt;
  daddr &amp;lt;destination address&amp;gt;&lt;br /&gt;
  saddr &amp;lt;source address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tcp:&lt;br /&gt;
  dport &amp;lt;destination port&amp;gt;&lt;br /&gt;
  sport &amp;lt;source port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp:&lt;br /&gt;
  dport &amp;lt;destination port&amp;gt;&lt;br /&gt;
  sport &amp;lt;source port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
sctp:&lt;br /&gt;
  dport &amp;lt;destination port&amp;gt;&lt;br /&gt;
  sport &amp;lt;source port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ct:&lt;br /&gt;
  state &amp;lt;new | established | related | invalid&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====削除====&lt;br /&gt;
個々のルールはハンドルを使わないと削除することができません。{{ic|nft --handle list}} コマンドを使うことでルールのハンドルを確認できます。{{ic|--handle}} スイッチを付けると、{{ic|nft}} はハンドルを出力するようになります。&lt;br /&gt;
&lt;br /&gt;
以下ではルールのハンドルを確認してルールを削除しています。未解決の IP アドレスのような、数字の出力を表示するときは {{ic|--number}} 引数を使うと良いでしょう。&lt;br /&gt;
{{hc|# nft --handle --numeric list chain filter input|2=&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
table ip fltrTable {&lt;br /&gt;
     chain input {&lt;br /&gt;
          type filter hook input priority 0;&lt;br /&gt;
          ip saddr 127.0.0.1 accept # handle 10&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
 # nft delete rule fltrTable input handle 10&lt;br /&gt;
&lt;br /&gt;
{{ic|nft flush table}} コマンドを使うことでテーブルの全てのチェインをフラッシュできます。個別のチェインをフラッシュするときは {{ic|nft flush chain}} または {{ic|nft delete rule}} コマンドを使います。&lt;br /&gt;
 # nft flush table foo&lt;br /&gt;
 # nft flush chain foo bar&lt;br /&gt;
 # nft delete rule ip6 foo bar&lt;br /&gt;
最初のコマンドでは ip {{ic|foo}} テーブルのチェイン全てをフラッシュします。2番目のコマンドは ip {{ic|foo}} テーブルの {{ic|bar}} チェインをフラッシュします。3番目のコマンドは ip6 {{ic|foo}} テーブルの {{ic|bar}} チェインの全てのルールを削除します。&lt;br /&gt;
&lt;br /&gt;
===アトミックリロード===&lt;br /&gt;
現在のルールセットをフラッシュする:&lt;br /&gt;
 # echo &amp;quot;flush ruleset&amp;quot; &amp;gt; /tmp/nftables&lt;br /&gt;
現在のルールセットをダンプする:&lt;br /&gt;
 # nft list ruleset &amp;gt;&amp;gt; /tmp/nftables&lt;br /&gt;
{{ic|/tmp/nftables}} を編集して次のコマンドで変更を適用:&lt;br /&gt;
 # nft -f /tmp/nftables&lt;br /&gt;
&lt;br /&gt;
== サンプル ==&lt;br /&gt;
&lt;br /&gt;
=== ワークステーション ===&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/nftables.conf|2=&amp;lt;nowiki&amp;gt;&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table inet filter {&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority 0;&lt;br /&gt;
&lt;br /&gt;
                # accept any localhost traffic&lt;br /&gt;
                iif lo accept&lt;br /&gt;
&lt;br /&gt;
                # accept traffic originated from us&lt;br /&gt;
                ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
                # activate the following line to accept common local services&lt;br /&gt;
                #tcp dport { 22, 80, 443 } ct state new accept&lt;br /&gt;
&lt;br /&gt;
                # accept neighbour discovery otherwise IPv6 connectivity breaks.&lt;br /&gt;
                ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit,  nd-router-advert, nd-neighbor-advert } accept&lt;br /&gt;
&lt;br /&gt;
                # count and drop any other traffic&lt;br /&gt;
                counter drop&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== シンプルな IPv4/IPv6 ファイアウォール ===&lt;br /&gt;
&lt;br /&gt;
{{hc|firewall.rules|2=&amp;lt;nowiki&amp;gt;&lt;br /&gt;
# A simple firewall&lt;br /&gt;
&lt;br /&gt;
flush ruleset&lt;br /&gt;
&lt;br /&gt;
table inet filter {&lt;br /&gt;
	chain input {&lt;br /&gt;
		type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
		# established/related connections&lt;br /&gt;
		ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
		# invalid connections&lt;br /&gt;
		ct state invalid drop&lt;br /&gt;
		&lt;br /&gt;
		# loopback interface&lt;br /&gt;
		iif lo accept&lt;br /&gt;
&lt;br /&gt;
		# ICMP&lt;br /&gt;
		# routers may also want: mld-listener-query, nd-router-solicit&lt;br /&gt;
		ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept&lt;br /&gt;
		ip protocol icmp icmp type { destination-unreachable, router-advertisement, time-exceeded, parameter-problem } accept&lt;br /&gt;
&lt;br /&gt;
		# SSH (port 22)&lt;br /&gt;
		tcp dport ssh accept&lt;br /&gt;
&lt;br /&gt;
		# HTTP (ports 80 &amp;amp; 443)&lt;br /&gt;
		tcp dport { http, https } accept&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	chain forward {&lt;br /&gt;
		type filter hook forward priority 0; policy drop;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	chain output {&lt;br /&gt;
		type filter hook output priority 0; policy accept;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
===レート制限 IPv4/IPv6 ファイアウォール===&lt;br /&gt;
&lt;br /&gt;
{{hc|firewall.2.rules|2=&amp;lt;nowiki&amp;gt;&lt;br /&gt;
table inet filter {&lt;br /&gt;
	chain input {&lt;br /&gt;
		type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
		# no ping floods:&lt;br /&gt;
		ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 10/second accept&lt;br /&gt;
		ip protocol icmp icmp type echo-request limit rate 10/second accept&lt;br /&gt;
&lt;br /&gt;
		ct state established,related accept&lt;br /&gt;
		ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
		iif lo accept&lt;br /&gt;
&lt;br /&gt;
		# avoid brute force on ssh:&lt;br /&gt;
		tcp dport ssh limit rate 15/minute accept&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	chain forward {&lt;br /&gt;
		type filter hook forward priority 0; policy drop;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	chain output {&lt;br /&gt;
		type filter hook output priority 0; policy accept;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
===ジャンプ===&lt;br /&gt;
&lt;br /&gt;
設定ファイルでジャンプを使うときは、先にターゲットチェインを定義する必要があります。そうしないと {{ic|Error: Could not process rule: No such file or directory}} というエラーが発生します。&lt;br /&gt;
{{hc|jump.rules|2=&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
table inet filter {&lt;br /&gt;
    chain web {&lt;br /&gt;
        tcp dport http accept&lt;br /&gt;
        tcp dport 8080 accept&lt;br /&gt;
    }&lt;br /&gt;
    chain input {&lt;br /&gt;
        type filter hook input priority 0;&lt;br /&gt;
        ip saddr 10.0.2.0/24 jump web&lt;br /&gt;
        drop&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== インターフェイスによってルールを変える ===&lt;br /&gt;
&lt;br /&gt;
複数のネットワークインターフェイスが存在する場合、それぞれのインターフェイスごとに別々のフィルターチェインを設定したい場合があるかもしれません。例えば、ホームルーターを構築するとき、LAN 上でアクセスできるウェブサーバーを実行しつつ ({{ic|nsp3s0}} インターフェイス)、インターネットからはアクセスできないようにしたい場合 ({{ic|enp2s0}} インターフェイス) などは以下のように設定します:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;table inet filter {&lt;br /&gt;
  chain input { # this chain serves as a dispatcher&lt;br /&gt;
    type filter hook input priority 0;&lt;br /&gt;
&lt;br /&gt;
    iif lo accept # always accept loopback&lt;br /&gt;
    iifname enp2s0 jump input_enp2s0&lt;br /&gt;
    iifname enp3s0 jump input_enp3s0&lt;br /&gt;
&lt;br /&gt;
    reject with icmp type port-unreachable # refuse traffic from all other interfaces&lt;br /&gt;
  }&lt;br /&gt;
  chain input_enp2s0 { # rules applicable to public interface interface&lt;br /&gt;
    ct state {established,related} accept&lt;br /&gt;
    ct state invalid drop&lt;br /&gt;
    udp dport bootpc accept&lt;br /&gt;
    tcp dport bootpc accept&lt;br /&gt;
    reject with icmp type port-unreachable # all other traffic&lt;br /&gt;
  }&lt;br /&gt;
  chain input_enp3s0 {&lt;br /&gt;
    ct state {established,related} accept&lt;br /&gt;
    ct state invalid drop&lt;br /&gt;
    udp dport bootpc accept&lt;br /&gt;
    tcp dport bootpc accept&lt;br /&gt;
    tcp port http accept&lt;br /&gt;
    tcp port https accept&lt;br /&gt;
    reject with icmp type port-unreachable # all other traffic&lt;br /&gt;
  }&lt;br /&gt;
  chain ouput { # we let everything out&lt;br /&gt;
    type filter hook output priority 0;&lt;br /&gt;
    accept&lt;br /&gt;
  }&lt;br /&gt;
 }&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
もしくは {{ic|iifname}} ステートメントを特定のインターフェイスで使用して、他のインターフェイスについてはデフォルトルールを設定するという方法もあります。&lt;br /&gt;
&lt;br /&gt;
=== マスカレード ===&lt;br /&gt;
&lt;br /&gt;
nftables には特殊なキーワード {{ic|masquerade}} が存在し、送信元アドレスが自動的に出力インターフェイスのアドレスに設定されます ([http://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_%28NAT%29#Masquerading ソース])。ルーターのインターフェイスが多数の ISP に接続されているときなど、インターフェイスの IP アドレスが一定でない場合に有用です。通常は、インターフェイスの IP アドレスが変わるたびにネットワークアドレス変換 (NAT) のルールを更新する必要があります。&lt;br /&gt;
&lt;br /&gt;
{{ic|masquerade}} を使用するには:&lt;br /&gt;
&lt;br /&gt;
* カーネルコンフィグで以下のマスカレード設定が有効になっている必要があります。&lt;br /&gt;
&lt;br /&gt;
 CONFIG_NFT_MASQ=m&lt;br /&gt;
&lt;br /&gt;
* {{ic|masquerade}} キーワードは {{ic|nat}} タイプのチェインでのみ使うことができます。&lt;br /&gt;
* マスカレードは一種のソース NAT であり、出力パスでのみ機能します。&lt;br /&gt;
&lt;br /&gt;
2つのインターフェイスが存在し {{ic|nsp3s0}} が LAN に接続され、{{ic|enp2s0}} がインターネットに接続されているマシンでの設定例:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;table inet my_nat {&lt;br /&gt;
  chain my_masquerade {&lt;br /&gt;
    type nat hook postrouting priority srcnat;&lt;br /&gt;
    oifname &amp;quot;enp2s0&amp;quot; masquerade&lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
テーブルタイプが{{ic|inet}}であるため、IPv4パケットとIPv6パケットの両方がマスカレードされます。IPv4パケットのみをマスカレードしたい場合（IPv6のアドレス空間が拡張されているためNATが不要）、{{ic|oifname &amp;quot;enp2s0&amp;quot;}}の前に{{ic|meta nfproto ipv4}}を追記するか、テーブルタイプを{{ic|ip}}に変更してください。&lt;br /&gt;
&lt;br /&gt;
== ヒントとテクニック ==&lt;br /&gt;
&lt;br /&gt;
=== シンプルなステートフルファイアウォール ===&lt;br /&gt;
&lt;br /&gt;
[[シンプルなステートフルファイアウォール]]の記事も参照してください。&lt;br /&gt;
&lt;br /&gt;
==== シングルマシン ====&lt;br /&gt;
&lt;br /&gt;
現在のルールセットを消去:&lt;br /&gt;
&lt;br /&gt;
 # nft flush ruleset&lt;br /&gt;
&lt;br /&gt;
テーブルを追加:&lt;br /&gt;
&lt;br /&gt;
 # nft add table inet filter&lt;br /&gt;
&lt;br /&gt;
input, forward, output ベースチェインを追加。input と forward のポリシーは破棄にして、output のポリシーは許可にする:&lt;br /&gt;
&lt;br /&gt;
 # nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }&lt;br /&gt;
 # nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }&lt;br /&gt;
 # nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }&lt;br /&gt;
&lt;br /&gt;
レギュラーチェインを追加して tcp と udp に関連付ける:&lt;br /&gt;
&lt;br /&gt;
 # nft add chain inet filter TCP&lt;br /&gt;
 # nft add chain inet filter UDP&lt;br /&gt;
&lt;br /&gt;
関連・確立済みトラフィックは許可する:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter input ct state related,established accept&lt;br /&gt;
&lt;br /&gt;
ループバックインターフェイスのトラフィックは全て許可する:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter input iif lo accept&lt;br /&gt;
&lt;br /&gt;
不正なトラフィックは全て破棄する:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter input ct state invalid drop&lt;br /&gt;
&lt;br /&gt;
新しいエコー要求 (ping) は許可する:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter input ip protocol icmp icmp type echo-request ct state new accept&lt;br /&gt;
&lt;br /&gt;
新しい udp トラフィックは UDP チェインにジャンプする:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter input ip protocol udp ct state new jump UDP&lt;br /&gt;
&lt;br /&gt;
新しい tcp トラフィックは TCP チェインにジャンプする:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter input ip protocol tcp tcp flags \&amp;amp; \(fin\|syn\|rst\|ack\) == syn ct state new jump TCP&lt;br /&gt;
&lt;br /&gt;
他のルールによって処理されなかったトラフィックは全て拒否する:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter input ip protocol udp reject&lt;br /&gt;
 # nft add rule inet filter input ip protocol tcp reject with tcp reset&lt;br /&gt;
 # nft add rule inet filter input counter reject with icmp type prot-unreachable&lt;br /&gt;
&lt;br /&gt;
ここから TCP と UDP チェインで処理する接続で開きたいポートを決めます。例えばウェブサーバーの接続を開くには:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter TCP tcp dport 80 accept&lt;br /&gt;
&lt;br /&gt;
ポート 443 からのウェブサーバーの HTTPS 接続を許可するには:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter TCP tcp dport 443 accept&lt;br /&gt;
&lt;br /&gt;
ポート 22 の SSH 接続を許可するには:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter TCP tcp dport 22 accept&lt;br /&gt;
&lt;br /&gt;
DNS リクエストを許可するには:&lt;br /&gt;
&lt;br /&gt;
 # nft add rule inet filter TCP tcp dport 53 accept&lt;br /&gt;
 # nft add rule inet filter UDP tcp dport 53 accept&lt;br /&gt;
&lt;br /&gt;
設定に満足したら変更を保存して永続化させてください。&lt;br /&gt;
&lt;br /&gt;
=== ブルートフォース攻撃の対策 ===&lt;br /&gt;
&lt;br /&gt;
[[Sshguard]] はブルートフォース攻撃を検出して一時的に IP アドレスに基づきブロックするようにファイアウォールを編集します。Sshguard で nftables を使うように設定する方法は [[Sshguard#nftables]] を見てください。&lt;br /&gt;
&lt;br /&gt;
== トラブルシューティング ==&lt;br /&gt;
&lt;br /&gt;
=== Docker と共に使う ===&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* 次のセットアップでは、{{ic|--net host --privileged}} を使用してもコンテナ内で {{ic|AF_BLUETOOTH}} などのプロトコルを利用できなくなります。&lt;br /&gt;
* ルートレス Dockerコンテナはすでに別のネットワーク名前空間で実行されています。何もする必要がないかもしれません。&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
nftables を使用すると、[[Docker]] のネットワーク (おそらく他のコンテナランタイムも同様) に干渉する可能性があります。&lt;br /&gt;
iptables ルールにパッチを適用して定義されたサービス開始順序を確保するか、docker の使用が非常に制限される dockerのiptablesの管理を完全に無効にするなど、さまざまな回避策がインターネット上で見つかります。&lt;br /&gt;
(ポートフォワーディングや docker-compose を考えてください)&lt;br /&gt;
&lt;br /&gt;
信頼できる方法は、docker を別のネットワーク名前空間で実行させ、そこで任意の処理を実行できるようにすることです。 &lt;br /&gt;
Docker が nftables と iptables ルールを混在させないように、{{Pkg|iptables-nft}} を&#039;&#039;&#039;使用しない&#039;&#039;&#039;方が良いでしょう。&lt;br /&gt;
&lt;br /&gt;
以下の docker サービス [[ドロップインファイル]] を使用してください:&lt;br /&gt;
&lt;br /&gt;
{{hc|/etc/systemd/system/docker.service.d/netns.conf|2=&lt;br /&gt;
[Service]&lt;br /&gt;
PrivateNetwork=yes&lt;br /&gt;
PrivateMounts=No&lt;br /&gt;
&lt;br /&gt;
# cleanup&lt;br /&gt;
ExecStartPre=-nsenter -t 1 -n -- ip link delete docker0&lt;br /&gt;
&lt;br /&gt;
# add veth&lt;br /&gt;
ExecStartPre=nsenter -t 1 -n -- ip link add docker0 type veth peer name docker0_ns&lt;br /&gt;
ExecStartPre=sh -c &#039;nsenter -t 1 -n -- ip link set docker0_ns netns &amp;quot;$$BASHPID&amp;quot; &amp;amp;&amp;amp; true&#039;&lt;br /&gt;
ExecStartPre=ip link set docker0_ns name eth0&lt;br /&gt;
&lt;br /&gt;
# bring host online&lt;br /&gt;
ExecStartPre=nsenter -t 1 -n -- ip addr add 10.0.0.1/24 dev docker0&lt;br /&gt;
ExecStartPre=nsenter -t 1 -n -- ip link set docker0 up&lt;br /&gt;
&lt;br /&gt;
# bring ns online&lt;br /&gt;
ExecStartPre=ip addr add 10.0.0.100/24 dev eth0&lt;br /&gt;
ExecStartPre=ip link set eth0 up&lt;br /&gt;
ExecStartPre=ip route add default via 10.0.0.1 dev eth0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
セットアップにおいてIPアドレス {{ic|10.0.0.*}} が適切でない場合は、調整してください。&lt;br /&gt;
&lt;br /&gt;
以下のポストルーティングルールで、{{ic|docker0}} のIPフォワーディングを有効にし、NATを設定します:&lt;br /&gt;
&lt;br /&gt;
 iifname docker0 oifname eth0 masquerade&lt;br /&gt;
&lt;br /&gt;
次に、[[インターネット共有#パケット転送の有効化|kernel IP forwarding]] が有効になっていることを確認します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
これで、nftables を使用して {{ic|docker0}} インターフェイスのファイアウォールとポートフォワーディングを干渉することなくセットアップできるようになります。&lt;br /&gt;
&lt;br /&gt;
==参照==&lt;br /&gt;
* [https://wiki.nftables.org/ netfilter nftables wiki]&lt;br /&gt;
* [https://lwn.net/Articles/324251/ nftables の最初のリリース]&lt;br /&gt;
* [https://home.regit.org/netfilter-en/nftables-quick-howto/ nftables クイックハウツー]&lt;br /&gt;
* [https://lwn.net/Articles/564095/ nftables の帰還]&lt;br /&gt;
* [https://developers.redhat.com/blog/2016/10/28/what-comes-after-iptables-its-successor-of-course-nftables/ What comes after ‘iptables’? It’s successor, of course: `nftables`]&lt;/div&gt;</summary>
		<author><name>Nakarch</name></author>
	</entry>
</feed>