iptables/ip6tables — IPv4/IPv6パケットフィルタリングおよびNATの管理ツール
概要
iptables [-t table] {-A|-C|-D|-V} chain rule-specification
ip6tables [-t table] {-A|-C|-D|-V} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain policy
iptables [-t table] -E old-chain-name new-chain-name
rule-specification := [matches...] [target]
match := -m matchname [per-match-options]
target := -j targetname [per-target-options]
説明
Iptablesとip6tablesは、Linuxカーネル内のIPv4およびIPv6パケットフィルタリングルールをセットアップ、管理、および検査するために使用されます。 複数の異なるテーブルを定義できます。 各テーブルには、いくつかの組み込みチェーンと、ユーザー定義チェーンを含めることができます。
各チェーンは、パケットのセットに一致するルールのリストです。 各ルールは、一致するパケットに対して何を実行するかを指定します。 これは「ターゲット」と呼ばれ、同じテーブル内のユーザー定義チェーンにジャンプすることもできます。
ターゲット
ファイアウォールルールは、パケットの基準とターゲットを指定します。 パケットが一致しない場合、チェーン内の次のルールが検査されます。 一致する場合、次のルールはターゲットの値によって指定され、ターゲットはユーザー定義チェーンの名前、iptables-extensions(8)で説明されているターゲットのいずれか、または特殊な値ACCEPT、DROP、またはRETURNになります。
ACCEPTは、パケットを通過させることを意味します。 DROPは、パケットを破棄することを意味します。 RETURNは、このチェーンのトラバースを停止し、前の(呼び出し元の)チェーンの次のルールから再開することを意味します。 組み込みチェーンの末尾に到達するか、組み込みチェーン内のターゲットRETURNを持つルールが一致した場合、チェーンポリシーで指定されたターゲットがパケットの運命を決定します。
テーブル
現在、5つの独立したテーブルがあります(実際に存在するテーブルは、カーネル構成オプションと存在するモジュールによって異なります)。
-t, --table table
このオプションは、コマンドが操作するパケットマッチングテーブルを指定します。 カーネルが自動モジュールロードで構成されている場合、まだ存在しないテーブルの適切なモジュールをロードしようとします。
次のテーブルがあります。
filter:
これはデフォルトのテーブルです(-tオプションが指定されていない場合)。これには、組み込みチェーンであるINPUT(ローカルソケット宛てのパケット用)、FORWARD(ボックスを介してルーティングされるパケット用)、およびOUTPUT(ローカルで生成されたパケット用)が含まれます。
nat:
このテーブルは、新しい接続を作成するパケットが検出されたときに参照されます。これには、4つの組み込みチェーンであるPREROUTING(パケットが到着したときに変更するため)、INPUT(ローカルソケット宛てのパケットを変更するため)、OUTPUT(ローカルで生成されたパケットをルーティングする前に変更するため)、およびPOSTROUTING(パケットが送信される直前に変更するため)が含まれます。IPv6 NATサポートは、カーネル3.7以降で利用可能です。
mangle:
このテーブルは、特殊なパケットの変更に使用されます。カーネル2.4.17までは、2つの組み込みチェーンであるPREROUTING(受信パケットをルーティングする前に変更するため)とOUTPUT(ローカルで生成されたパケットをルーティングする前に変更するため)がありました。カーネル2.4.18以降、他の3つの組み込みチェーンもサポートされています。INPUT(ボックスに入るパケット用)、FORWARD(ボックスを介してルーティングされるパケットを変更するため)、およびPOSTROUTING(パケットが送信される直前に変更するため)。
raw:
このテーブルは、主にNOTRACKターゲットと組み合わせて、接続追跡からの例外を設定するために使用されます。これは、netfilterフックでより高い優先度で登録されるため、ip_conntrackまたはその他のIPテーブルよりも前に呼び出されます。次の組み込みチェーンを提供します。PREROUTING(任意のネットワークインターフェースを介して到着するパケット用)およびOUTPUT(ローカルプロセスによって生成されたパケット用)。
security:
このテーブルは、SECMARKおよびCONNSECMARKターゲットによって有効にされるような、強制アクセス制御(MAC)ネットワークルールに使用されます。強制アクセス制御は、SELinuxなどのLinuxセキュリティモジュールによって実装されます。セキュリティテーブルは、filterテーブルの後に呼び出されるため、filterテーブル内の任意の裁量アクセス制御(DAC)ルールは、MACルールが適用される前に有効になります。このテーブルは、次の組み込みチェーンを提供します。INPUT(ボックスに入るパケット用)、OUTPUT(ローカルで生成されたパケットをルーティングする前に変更するため)、およびFORWARD(ボックスを介してルーティングされるパケットを変更するため)。
オプション
iptablesとip6tablesによって認識されるオプションは、いくつかのグループに分けることができます。
コマンド
これらのオプションは、実行するアクションを指定します。コマンドラインで1つのオプションのみを指定できます(以下で明示的に許可されている場合を除く)。コマンドとオプション名の長いバージョンでは、iptablesが他のオプションと区別できるだけの文字数を使用する必要があります。
-A, --append chain rule-specification
選択したチェーンの末尾に1つまたは複数のルールを追加します。ソースおよび/または宛先の名前が複数のアドレスに解決される場合、各可能なアドレスの組み合わせに対してルールが追加されます。
-C, --check chain rule-specification
指定されたルールが選択したチェーンに存在するかどうかを確認します。このコマンドは、-Dで使用されるものと同じロジックを使用して一致するエントリを見つけますが、既存のiptables構成を変更せず、成功または失敗を示す終了コードを使用します。
-D, --delete chain rule-specification
-D, --delete chain rulenum
選択されたチェーンから 1 つ以上のルールを削除します。このコマンドには 2 つのバージョンがあります。 ルールは、チェーン内の番号 (最初のルールから 1) または一致するルールとして指定できます。
-I, --insert chain [rulenum] rule-specification
指定されたチェーンに 1 つ以上のルールを、指定されたルール番号として挿入します。したがって、ルール番号が 1 の場合、ルールまたはルールはチェーンの先頭に挿入されます。これは、ルール番号が指定されていない場合のデフォルトでもあります。
-R, --replace chain rulenum rule-specification
選択されたチェーン内のルールを置き換えます。ソースおよび/または宛先名が複数のアドレスに解決される場合、コマンドは失敗します。ルールは 1 から番号が付けられます。
-L, --list [chain]
選択されたチェーン内のすべてのルールをリストします。チェーンが選択されていない場合、すべてのチェーンがリストされます。 他のすべての iptables コマンドと同様に、これは指定されたテーブル (デフォルトは filter) に適用されるため、NAT ルールは iptables -t nat -n -L でリストされます。 これは、多くの場合、長いリバース DNS 参照を避けるために、-n オプションとともに使用されます。-Z (ゼロ) オプションも指定できます。この場合、チェーンはアトミックにリストされ、ゼロになります。正確な出力は、与えられた他の引数によって影響を受けます。正確なルールは、iptables -L -v または iptables-save(8) を使用するまで抑制されます。
-S, --list-rules [chain]
選択されたチェーン内のすべてのルールを出力します。チェーンが選択されていない場合、iptables-save と同様に、すべてのチェーンが出力されます。他のすべての iptables コマンドと同様に、これは指定されたテーブル (デフォルトは filter) に適用されます。
-F, --flush [chain]
選択されたチェーンをフラッシュします (指定されていない場合は、テーブル内のすべてのチェーン)。これは、すべてのルールを 1 つずつ削除することと同等です。
-Z, --zero [chain [rulenum]]
すべてのチェーン、または指定されたチェーン、またはチェーン内の指定されたルールでのパケットとバイトのカウンターをゼロにします。-L、--list (リスト) オプションも指定して、カウンターをクリアする直前に表示できます。(上記を参照)。
-N, --new-chain chain
指定された名前で新しいユーザー定義チェーンを作成します。同じ名前のターゲットは存在してはなりません。
-X, --delete-chain [chain]
指定されたチェーンを削除します。チェーンへの参照は存在してはなりません。存在する場合は、参照するルールを削除または置き換えてから、チェーンを削除する必要があります。チェーンは空である必要があります。つまり、ルールを含んではなりません。引数が指定されていない場合、テーブル内のすべての空のチェーンが削除されます。空の組み込みチェーンは、iptables-nft を使用してのみ削除できます。
-P, --policy chain target
組み込み (ユーザー定義ではない) チェーンのポリシーを、指定されたターゲットに設定します。ポリシーターゲットは、ACCEPT または DROP のいずれかでなければなりません。
-E, --rename-chain old-chain new-chain
ユーザーが指定したチェーンを、ユーザーが指定した名前に変更します。これは見た目の変更であり、テーブルの構造には影響しません。
-h ヘルプ。コマンド構文の簡単な説明を表示します。
パラメータ
次のパラメータは、ルール仕様を構成します(add、delete、insert、replace、および append コマンドで使用)。
-4, --ipv4
このオプションは、iptables および iptables-restore では効果がありません。-4 オプションを使用したルールを ip6tables-restore のみで挿入した場合、無視されます。それ以外の使用法ではエラーが発生します。このオプションを使用すると、IPv4 および IPv6 のルールを 1 つのルールファイルに含めることができ、iptables-restore と ip6tables-restore の両方で使用できます。
-6, --ipv6
-6 オプションを使用したルールを iptables-restore のみで挿入した場合、無視されます。それ以外の使用法ではエラーが発生します。このオプションを使用すると、IPv4 および IPv6 のルールを 1 つのルールファイルに含めることができ、iptables-restore と ip6tables-restore の両方で使用できます。このオプションは、ip6tables および ip6tables-restore では効果がありません。
[!] -p, --protocol protocol
ルールのプロトコル、またはチェックするパケットのプロトコルを指定します。指定できるプロトコルは、tcp、udp、udplite、icmp、icmpv6、esp、ah、sctp、mh、または特別なキーワード "all" です。数値も指定でき、上記のプロトコルのいずれか、または別のプロトコルを表します。/etc/protocols のプロトコル名も許可されます。プロトコルの前に "!" を付けると、テストが反転します。数値 0 は "all" と同じです。"all" はすべてのプロトコルに一致し、このオプションが省略された場合のデフォルトとして扱われます。ip6tables では、esp 以外の IPv6 拡張ヘッダーは許可されていません。esp および ipv6-nonext は、バージョン 6.11 以降のカーネルで使用できます。数値 0 は "all" と同じであるため、プロトコルフィールドを 0 の値で直接テストすることはできません。HBH ヘッダーに一致させるには、最後のヘッダーであっても、-p 0 を使用するのではなく、常に -m hbh を使用する必要があります。
[!] -s, --source address[/mask][,...]
ソースの指定。アドレスは、ネットワーク名、ホスト名、ネットワーク IP アドレス(/マスク付き)、またはプレーンな IP アドレスのいずれかになります。ホスト名は、ルールをカーネルに送信する前に、1 回だけ解決されます。リモートクエリ(DNS など)を使用して解決する名前を指定するのは非常に悪い考えです。マスクは、iptables の場合は IPv4 ネットワークマスク、またはプレーンな数値で、ネットワークマスクの左側にある 1 の数を指定します。したがって、iptables のマスク 24 は 255.255.255.0 と同じです。"!" をアドレスの指定の前に付けると、アドレスの意味が反転します。--src はこのオプションのエイリアスです。複数のアドレスを指定できますが、これは複数のルールに展開されます(-A で追加する場合)、または複数のルールが削除されます(-D で削除する場合)。
[!] -d, --destination address[/mask][,...]
宛先の指定。-s(ソース)フラグの説明を参照して、構文の詳細を確認してください。--dst はこのオプションのエイリアスです。
-m, --match match
特定のプロパティをテストする拡張モジュール、つまり「マッチ」を指定します。マッチのセットは、ターゲットが呼び出される条件を構成します。マッチはコマンドラインで指定された順に最初から最後まで評価され、ショートカット方式で機能します。つまり、ある拡張モジュールが false を返した場合、評価は停止します。
-j, --jump target
これは、ルールのターゲット、つまりパケットがマッチした場合に行うことを指定します。ターゲットは、ユーザー定義のチェーン(このルールが含まれるチェーンを除く)、パケットの運命を直ちに決定する特別な組み込みターゲットのいずれか、または拡張モジュール(「マッチおよびターゲット拡張」を参照)にすることができます。ルールでこのオプションが省略され(-g も使用されていない場合)、ルールにマッチしてもパケットの運命には影響しませんが、ルールのカウンターが増加します。
-g, --goto chain
処理はユーザー指定のチェーンで継続されることを指定します。--jump オプションとは異なり、RETURN はこのチェーンで処理を継続するのではなく、--jump を介して呼び出したチェーンで処理を継続します。
[!] -i, --in-interface name
パケットが受信されたインターフェイスの名前(INPUT、FORWARD、および PREROUTING チェーンに入ってくるパケットの場合)。「!」引数がインターフェイス名の前に使用される場合、意味が反転します。インターフェイス名が「+」で終わる場合、この名前で始まる任意のインターフェイスがマッチします。このオプションが省略された場合、任意のインターフェイス名がマッチします。
[!] -o, --out-interface name
パケットが送信されるインターフェイスの名前(FORWARD、OUTPUT、および POSTROUTING チェーンに入ってくるパケットの場合)。「!」引数がインターフェイス名の前に使用される場合、意味が反転します。インターフェイス名が「+」で終わる場合、この名前で始まる任意のインターフェイスがマッチします。このオプションが省略された場合、任意のインターフェイス名がマッチします。
[!] -f, --fragment
これは、ルールがフラグメント化されたパケットの 2 番目以降の IPv4 フラグメントのみを参照することを意味します。フラグメント化されたパケットには、送信元または宛先のポート(または ICMP タイプ)を判断する方法がないため、これらのポートまたは ICMP タイプを指定するルールにはマッチしません。 「!」引数が「-f」フラグの前に使用される場合、ルールはヘッダーフラグメントまたはフラグメント化されていないパケットにのみマッチします。このオプションは IPv4 に固有であり、ip6tables では使用できません。
-c, --set-counters packets bytes
これにより、管理者はルールのパケット数とバイト数のカウンターを初期化できます(INSERT、APPEND、REPLACE 操作中に)。
その他のオプション
次の追加オプションを指定できます。
-v, --verbose
冗長出力。このオプションを使用すると、list コマンドでインターフェイス名、ルールオプション(存在する場合)、および TOS マスクが表示されます。パケット数とバイト数も、「K」、「M」、または「G」の接尾辞が付いて表示され、それぞれ 1,000、1,000,000、および 1,000,000,000 の乗数を表します(ただし、-x フラグを使用して変更できます)。追加、挿入、削除、および置換の場合、このオプションを使用すると、ルールに関する詳細情報が出力されます。-v を複数回指定すると、さらに詳細なデバッグステートメントが出力される場合があります。2 回指定すると、iptableslegacy はテーブル情報と libiptc 内のエントリをダンプし、iptables-nft はルールをネットリンク(VM コード)形式でダンプします。3 回指定すると、iptables-nft はカーネルに送信されるネットリンクメッセージもダンプします。
-V, --version
プログラムのバージョンと使用されているカーネル API を表示します。
-w, --wait [秒]
xtables ロックを待機します。プログラムが同時に複数インスタンスで実行されないように、起動時に排他的ロックを取得しようとします。デフォルトでは、ロックを取得できない場合、プログラムは終了します。このオプションを使用すると、プログラムは排他的ロックを取得できるまで(無期限またはオプションで指定された秒数)、待機します。
-n, --numeric
数値出力を表示します。IP アドレスとポート番号は、数値形式で表示されます。デフォルトでは、プログラムは、可能な場合は、ホスト名、ネットワーク名、またはサービスとして表示しようとします。
-x, --exact
数値を拡張します。パケットとバイトのカウンタの正確な値を表示します。そうしないと、K(1000 の倍数)、M(1000K の倍数)、または G(1000M の倍数)で丸めた数のみが表示されます。このオプションは、-L コマンドでのみ有効です。
--line-numbers
ルールをリスト表示するときに、各ルールの先頭に、そのルールがチェーン内のどこにあるかを示す行番号を追加します。
--modprobe=command
チェーンにルールを追加または挿入するときに、必要なモジュール(ターゲット、マッチ拡張など)をロードするために、コマンドを使用します。
ロックファイル
iptables は、起動時に /run/xtables.lock ファイルを使用して排他的ロックを取得します。
環境変数 XTABLES_LOCKFILE を使用して、デフォルトの設定をオーバーライドできます。
マッチとターゲット拡張
iptables は、拡張パケットマッチングモジュールとターゲットモジュールを使用できます。これらのリストは、iptables-extensions(8) のマニュアルページで確認できます。
診断
さまざまなエラーメッセージが標準エラーに出力されます。正常に機能した場合の終了コードは 0 です。無効または不正なコマンドラインパラメータが原因と思われるエラーは、終了コード 2 を返します。カーネルとユーザー空間の互換性がないことを示すエラーは、終了コード 3 を返します。リソースの問題(ビジーロック、メモリ割り当ての失敗、カーネルからのエラーメッセージなど)を示すエラーは、終了コード 4 を返します。その他のエラーは、終了コード 1 を返します。
バグ
バグ? 何のことでしょう? ;-) ただし、(https://bugzilla.netfilter.org/) を確認することをお勧めします。 iptables が、root ユーザーとして実行されていることを検出した場合、エラーコード 111 で直ちに終了します。iptables は、実行時にロードされる共有ライブラリ(マッチ、ターゲット)を信頼するため、安全に使用することはできません。検索パスは、環境変数を使用して設定できます。
IPCHAINSとの互換性
この iptables は、Rusty Russell による ipchains と非常によく似ています。主な違いは、INPUT チェーンと OUTPUT チェーンは、それぞれローカルホストへのパケットとローカルホストから発生するパケットに対してのみトラバースされることです。したがって、すべてのパケットは 3 つのチェーンのうちの 1 つだけを通過します(ループバックトラフィックを除く。ループバックトラフィックでは、INPUT チェーンと OUTPUT チェーンの両方が関係します)。以前は、転送されたパケットはすべての 3 つのチェーンを通過していました。
もう 1 つの主な違いは、-i が入力インターフェースを指し、-o が出力インターフェースを指すことです。これらはどちらも、FORWARD チェーンに入ってくるパケットで使用できます。
さまざまな形式の NAT は分離されています。iptables は、デフォルトの filter テーブルを使用すると、純粋なパケットフィルターとなり、オプションの拡張モジュールが追加されます。これにより、以前に見られた IP マスカーレードとパケットフィルターの組み合わせに関する混乱を回避できます。したがって、次のオプションは異なる方法で処理されます。
-j MASQ
-M -S
-M -L
iptables には、他にもいくつかの変更点があります。
関連項目
iptables-apply(8), iptables-save(8), iptables-restore(8), iptables-extensions(8)
パケットフィルタリング HOWTO には、iptables を使用したパケットフィルタリングの使用方法が記載されており、NAT HOWTO には NAT が記載されており、netfilter-extensions-HOWTO には標準ディストリビューションに含まれていない拡張機能が記載されており、netfilter-hacking-HOWTO には netfilter の内部構造が記載されています。 https://www.netfilter.org/ を参照してください。
著者
Rusty Russell が最初に iptables を作成し、その初期段階で Michael Neuling と協力しました。
Marc Boucher は、iptables に汎用的なパケット選択フレームワークを導入するよう Rusty を説得し、その後 mangle テーブル、owner マッチ、mark 機能を作成し、さまざまな場所でクールなことを行いました。
James Morris は、TOS ターゲットと tos マッチを作成しました。
Jozsef Kadlecsik は、REJECT ターゲットを作成しました。
Harald Welte は、ULOG および NFQUEUE ターゲット、新しい libiptc、および TTL、DSCP、ECN マッチとターゲットを作成しました。
Netfilter コアチームは、Jozsef Kadlecsik、Pablo Neira Ayuso、Eric Leblond、Florian Westphal、および Arturo Borrero Gonzalez です。名誉コアチームメンバーは、Marc Boucher、Martin Josefsson、Yasuyuki Kozakai、James Morris、Harald Welte、および Rusty Russell です。
このマニュアルページは、Herve Eychenne <__> によって最初に作成されました。
バージョン
このマニュアルページは、iptables/ip6tables 1.8.11 に適用されます。