EN JA
IP6TABLES(8)
IP6TABLES(8) IP6TABLES(8)

名前

ip6tables - IPv6 パケットフィルタを管理する

書式

ip6tables [-t テーブル] -[AD] チェインルールの詳細 [オプション]
 
ip6tables [-t テーブル] -I チェイン [ルール番号] ルールの詳細 [オプション]
 
ip6tables [-t テーブル] -R チェインルール番号ルールの詳細 [オプション]
 
ip6tables [-t テーブル] -D チェインルール番号 [オプション]
 
ip6tables [-t テーブル] -[LFZ] [チェイン] [オプション]
 
ip6tables [-t テーブル] -N チェイン
 
ip6tables [-t テーブル] -X [チェイン]
 
ip6tables [-t テーブル] -P チェインターゲット [オプション]
 
ip6tables [-t テーブル] -E 旧チェイン名新チェイン名

説明

ip6tables は Linux カーネルの IPv6 パケットフィルタルールのテーブルを設定・管理・検査するために使われる。複数の異なるテーブルが定義される可能性がある。各テーブルは組み込み済みチェインを含む。さらにユーザー定義のチェインを含むこともできる。
 
各チェインは、パケット群にマッチするルールのリストである。各ルールはマッチしたパケットに対して何をするかを指定する。これは「ターゲット」と呼ばれ、同じテーブル内のユーザー定義チェインにジャンプすることもできる。
 

ターゲット

ファイアウォールのルールは、パケットを判断する基準とターゲットを指定する。パケットがマッチしない場合、チェイン内の次のルールが評価される。パケットがマッチした場合、ターゲットの値によって次のルールが指定される。ターゲットの値は、ユーザー定義チェインの名前、または特別な値 ACCEPT, DROP, QUEUE, RETURN のうちの 1 つである。

ACCEPT はパケットを通すという意味である。 DROP はパケットを床に落す (捨てる) という意味である。 QUEUE はパケットをユーザー空間に渡すという意味である (カーネルがサポートしていればであるが)。 RETURN は、このチェインを辿るのを中止して、前の (呼び出し元) チェインの次のルールから再開するという意味である。組み込み済みチェインの最後に到達した場合、または組み込み済みチェインでターゲット RETURN を持つルールにマッチした場合、チェインポリシーで指定されたターゲットがパケットの行方を決定する。

テーブル

現在のところ 2 つの独立なテーブルが存在する (どのテーブルがどの時点で現れるかは、カーネルの設定やどういったモジュールが存在するかに依存する)。 nat テーブルは、まだ実装されていない。
-t, --table table
このオプションは、このコマンドが操作するパケットマッチングテーブルを指定する。カーネルに自動モジュールローディングが設定されている場合、そのテーブルに対する適切なモジュールがまだロードされていなければ、そのモジュールがロードされる。
 
テーブルは以下の通りである。
filter:
(-t オプションが指定されていない場合は) これがデフォルトのテーブルである。これには INPUT (マシン自体に入ってくるパケットに対するチェイン)・ FORWARD (マシンを経由するパケットに対するチェイン)・ OUTPUT (ローカルマシンで生成されたパケットに対するチェイン) という組み込み済みチェインが含まれる。
mangle:
このテーブルは特別なパケット変換に使われる。カーネル 2.4.17 までは、 PREROUTING (パケットが入ってきた場合、すぐにそのパケットを変換するためのチェイン)・ OUTPUT (ローカルで生成されたパケットをルーティングの前に変換するためのチェイン) という 2 つの組み込み済みチェインが含まれていた。カーネル 2.4.18 からは、これらの他に INPUT (マシン自体に入ってくるパケットに対するチェイン)・ FORWARD (マシンを経由するパケットに対するチェイン)・ POSTROUTING (パケットが出て行くときに変換するためのチェイン)・という 3 つの組み込み済みチェインもサポートされる。

オプション

ip6tables で使えるオプションは、いくつかのグループに分けられる。

コマンド

これらのオプションは、実行する特定の動作を指定する。以下の説明で許可されていない限り、この中の 1 つしかコマンドラインで指定することができない。長いバージョンのコマンド名とオプション名は、 ip6tables が他のコマンド名やオプション名と区別できる範囲で (文字を省略して) 指定することもできる。
-A, --append chain rule-specification
選択されたチェインの最後に 1 つ以上のルールを追加する。送信元や送信先の名前の解決を行って、 1 つ以上のアドレスに展開された場合は、可能なアドレスの組合せそれぞれに対してルールが追加される。
-D, --delete chain rule-specification
-D, --delete chain rulenum
選択されたチェインから 1 つ以上のルールを削除する。このコマンドには 2 つの使い方がある: チェインの中の番号 (最初のルールを 1 とする) を指定する場合と、マッチするルールを指定する場合である。
-I, --insert
選択されたチェインにルール番号を指定して 1 つ以上のルールを挿入する。ルール番号が 1 の場合、ルールはチェインの先頭に挿入される。これはルール番号が指定されない場合のデフォルトでもある。
-R, --replace chain rulenum rule-specification
選択されたチェインにあるルールを置き換える。送信元や送信先の名前が 1 つ以上のアドレスに解決された場合は、このコマンドは失敗する。ルール番号は 1 からはじまる。
-L, --list [ chain]
選択されたチェインにある全てのルールを一覧表示する。チェインが指定されない場合、全てのチェインにあるリストが一覧表示される。他の各 iptables コマンドと同様に、指定されたテーブル (デフォルトは filter) に対して作用する。よって mangle ルールを表示するには以下のようにする。
ip6tables -t mangle -n -L
DNS の逆引きを避けるために、よく -n オプションと共に使用される。 -Z (ゼロ化) オプションを同時に指定することもできる。この場合、チェインは要素毎にリストされて、 (訳註: パケットカウンタとバイトカウンタが) ゼロにされる。出力表示は同時に与えられた他の引き数に影響される。以下のように、 -v オプションを指定しない限り、実際のルールそのものは表示されない。
ip6tables -L -v
-F, --flush [ chain]
選択されたチェイン (何も指定されなければテーブル内の全てのチェイン) の内容を全消去する。これは全てのルールを 1 個ずつ削除するのと同じである。
-Z, --zero [ chain]
すべてのチェインのパケットカウンタとバイトカウンタをゼロにする。クリアされる直前のカウンタを見るために、 -L, --list (一覧表示) オプションと同時に指定することもできる (上記を参照)。
-N, --new-chain chain
指定した名前でユーザー定義チェインを作成する。同じ名前のターゲットが既に存在してはならない。
-X, --delete-chain [ chain]
指定したユーザー定義チェインを削除する。そのチェインが参照されていてはならない。チェインを削除する前に、そのチェインを参照しているルールを削除するか置き換えるかしなければならない。引き数が与えられない場合、テーブルにあるチェインのうち組み込み済みチェインでないものを全て削除する。
-P, --policy chain target
チェインのポリシーを指定したターゲットに設定する。指定可能なターゲットは「 ターゲット」の章を参照すること。 (ユーザー定義ではない) 組み込み済みチェインにしかポリシーは設定できない。また、組み込み済みチェインもユーザー定義チェインもポリシーのターゲットに設定することはできない。
-E, --rename-chain old-chain new-chain
ユーザー定義チェインを指定した名前に変更する。これは見た目だけの変更なので、テーブルの構造には何も影響しない。
-h
ヘルプ。 (今のところはとても簡単な) コマンド書式の説明を表示する。

パラメータ

以下のパラメータは (add, delete, insert, replace, append コマンドで用いられて) ルールの仕様を決める。
-p, --protocol [!] protocol
ルールで使われるプロトコル、またはチェックされるパケットのプロトコル。指定できるプロトコルは、 tcp, udp, ipv6-icmp|icmpv6, all のいずれか 1 つか、数値である。数値は、これらのプロトコルの 1 つ、もしくは別のプロトコルを表す。 /etc/protocols にあるプロトコル名も指定できる。プロトコルの前に "!"を置くと、そのプロトコルを指定しないという意味になる。数値 0 は all と等しい。プロトコル all は全てのプロトコルとマッチし、このオプションが省略された際のデフォルトである。
-s, --source [!] address[/ mask]
送信元の指定。 address はホスト名 (DNS のようなリモートへの問い合わせで解決する名前を指定するのは非常に良くない)・ネットワーク IPv6 アドレス (/mask を指定する)・通常の IPv6 アドレス (今のところ、ネットワーク名はサポートされていない)、のいずれかである。 mask はネットワークマスクか、ネットワークマスクの左側にある 1 の数を指定する数値である。つまり、 64 という mask は ffff:ffff:ffff:ffff:0000:0000:0000:0000 に等しい。アドレス指定の前に "!"を置くと、そのアドレスを除外するという意味になる。フラグ --src は、このオプションの別名である。
-d, --destination [!] address[/ mask]
送信先の指定。書式の詳しい説明については、 -s (送信元) フラグの説明を参照すること。フラグ --dst は、このオプションの別名である。
-j, --jump target
ルールのターゲット、つまり、パケットがマッチした場合にどうするかを指定する。ターゲットはユーザー定義チェイン (そのルール自身が入っているチェイン以外) でも、パケットの行方を即時に決定する特別な組み込み済みターゲットでも、拡張されたターゲット (以下の「 ターゲットの拡張」を参照) でもよい。このオプションがルールの中で省略された場合、ルールにマッチしてもパケットの行方に何も影響しないが、ルールのカウンタは 1 つ加算される。
-i, --in-interface [!] name
パケットを受信することになるインターフェース名 ( INPUT, FORWARD, PREROUTING チェインに入るパケットのみ)。インターフェース名の前に "!"を置くと、そのインターフェースを除外するという意味になる。インターフェース名が "+"で終っている場合、その名前で始まる任意のインターフェース名にマッチする。このオプションが省略された場合、任意のインターフェース名にマッチする。
-o, --out-interface [!] name
( FORWARD, OUTPUT チェインに入る) パケットを送信するインターフェース名。インターフェース名の前に "!"を置くと、そのインターフェースを除外するという意味になる。インターフェース名が "+"で終っている場合、その名前で始まる任意のインターフェース名にマッチする。このオプションが省略された場合、任意のインターフェース名にマッチする。
-c, --set-counters PKTS BYTES
このオプションを使うと、 ( insert, append, replace 操作において) 管理者はパケットカウンタとバイトカウンタを初期化することができる。

その他のオプション

その他に以下のオプションを指定することができる:
-v, --verbose
詳細な出力を行う。 list コマンドの際に、インターフェース名・ (もしあれば) ルールのオプション・TOS マスクを表示させる。パケットとバイトカウンタも表示される。添字 'K', 'M', 'G' は、それぞれ 1000, 1,000,000, 1,000,000,000 倍を表す (これを変更する -x フラグも見よ)。このオプションを append, insert, delete, replace コマンドに適用すると、ルールについての詳細な情報を表示する。
-n, --numeric
数値による出力を行う。 IP アドレスやポート番号を数値によるフォーマットで表示する。デフォルトでは、iptables は (可能であれば) これらの情報をホスト名・ネットワーク名・サービス名で表示しようとする。
-x, --exact
厳密な数値で表示する。パケットカウンタとバイトカウンタを、 K (1000 の何倍か)・M (1000K の何倍か)・G (1000M の何倍か) ではなく、厳密な値で表示する。このオプションは、 -L コマンドとしか関係しない。
--line-numbers
ルールを一覧表示する際、そのルールがチェインのどの位置にあるかを表す行番号を各行の始めに付加する。
--modprobe=command
チェインにルールを追加または挿入する際に、 (ターゲットやマッチングの拡張などで) 必要なモジュールをロードするために使う command を指定する。

マッチングの拡張

ip6tables は拡張されたパケットマッチングモジュールを使うことができる。これらのモジュールは 2 種類の方法でロードされる: モジュールは、 -p または --protocol で暗黙のうちに指定されるか、 -m または --match の後にモジュール名を続けて指定される。これらのモジュールの後ろには、モジュールに応じて他のいろいろなコマンドラインオプションを指定することができる。複数の拡張マッチングモジュールを 1 行で指定することができる。また、モジュールに特有のヘルプを表示させるためには、モジュールを指定した後で -h または --help を指定すればよい。
 
以下の拡張がベースパッケージに含まれている。大部分のものは、 ! を前におくことによってマッチングの意味を逆にできる。

tcp

これらの拡張は `--protocol tcp' が指定され場合にロードされ、以下のオプションが提供される:
--source-port [!] port[: port]
送信元ポートまたはポート範囲の指定。サービス名またはポート番号を指定できる。 port: port という形式で、2 つの番号を含む範囲を指定することもできる。最初のポートを省略した場合、"0"を仮定する。最後のポートを省略した場合、"65535"を仮定する。最初のポートが最後のポートより大きい場合、2 つは入れ換えられる。フラグ --sport は、このオプションの便利な別名である。
--destination-port [!] port[: port]
送信先ポートまたはポート範囲の指定。フラグ --dport は、このオプションの便利な別名である。
--tcp-flags [!] mask comp
TCP フラグが指定されたものと等しい場合にマッチする。第 1 引き数は評価対象とするフラグで、コンマ区切りのリストである。第 2 引き数は必ず設定しなければならないフラグで、コンマ区切りのリストである。指定できるフラグは SYN ACK FIN RST URG PSH ALL NONE である。よって、コマンド
ip6tables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
は、SYN フラグが設定され ACK, FIN, RST フラグが設定されていないパケットにのみマッチする。
[!] --syn
SYN ビットが設定され ACK と RST ビットがクリアされている TCP パケットにのみマッチする。このようなパケットは TCP 接続の開始要求に使われる。例えば、あるインターフェースに入ってくるこのようなパケットをブロックすれば、内側への TCP 接続は禁止されるが、外側への TCP 接続には影響しない。これは --tcp-flags SYN,RST,ACK SYN と等しい。 "--syn"の前に "!"フラグを置くと、 SYN ビットがクリアされ ACK と RST ビットが設定されている TCP パケットにのみマッチする。
--tcp-option [!] number
TCP オプションが設定されている場合にマッチする。

udp

これらの拡張は `--protocol udp' が指定された場合にロードされ、以下のオプションが提供される:
--source-port [!] port[: port]
送信元ポートまたはポート範囲の指定。詳細は TCP 拡張の --source-port オプションの説明を参照すること。
--destination-port [!] port[: port]
送信先ポートまたはポート範囲の指定。詳細は TCP 拡張の --destination-port オプションの説明を参照すること。

ipv6-icmp

これらの拡張は `--protocol ipv6-icmp' または `--protocol icmpv6' が指定された場合にロードされ、以下のオプションが提供される:
--icmpv6-type [!] typename
ICMP タイプを指定できる。タイプ指定には、数値の IPv6-ICMP タイプ、または以下のコマンドで表示される IPv6-ICMP タイプ名を使用できる。
ip6tables -p ipv6-icmp -h

mac

--mac-source [!] address
送信元 MAC アドレスにマッチする。 address は XX:XX:XX:XX:XX:XX という形式でなければならない。イーサーネットデバイスから入ってくるパケットで、 PREROUTING, FORWARD, INPUT チェインに入るパケットにしか意味がない。

limit

このモジュールは、トークンバケツフィルタを使い、単位時間あたり制限された回数だけマッチする。この拡張を使ったルールは、(`!' フラグが指定されない限り) 制限に達するまでマッチする。例えば、このモジュールはログ記録を制限するために LOG ターゲットと組み合わせて使うことができる。
--limit rate
単位時間あたりの平均マッチ回数の最大値。数値で指定され、添字 `/second', `/minute', `/hour', `/day' を付けることもできる。デフォルトは 3/hour である。
--limit-burst number
パケットがマッチする回数の最大初期値: 上のオプションで指定した制限に達しなければ、その度ごとに、この数値になるまで 1 個ずつ増やされる。デフォルトは 5 である。

multiport

このモジュールは送信元や送信先のポートの集合にマッチする。ポートは 15 個まで指定できる。このモジュールは -p tcp または -p udp と組み合わせて使うことしかできない。
--source-ports port[, port[, port...]]
送信元ポートが指定されたポートのうちのいずれかであればマッチする。フラグ --sports は、このオプションの便利な別名である。
--destination-ports port[, port[, port...]]
宛先ポートが指定されたポートのうちのいずれかであればマッチする。フラグ --dports は、このオプションの便利な別名である。
--ports port[, port[, port...]]
送信元ポートと宛先ポートが等しく、かつそのポートが指定されたポートのうちのいずれかであればマッチする。

mark

このモジュールはパケットに関連づけられた netfilter の mark フィールドにマッチする (このフィールドは、以下の MARK ターゲットで設定される)。
--mark value[/ mask]
指定された符号なし mark 値のパケットにマッチする (mask が指定されると、比較の前に mask との論理積 (AND) がとられる)。

owner

このモジュールは、ローカルで生成されたパケットに付いて、パケット生成者のいろいろな特性とのマッチングをとる。これは OUTPUT チェインのみでしか有効でない。また、(ICMP ping 応答のような) パケットは、所有者がいないので絶対にマッチしない。これは実験的なものという扱いである。
--uid-owner userid
指定された実効ユーザー ID のプロセスによりパケットが生成されている場合にマッチする。
--gid-owner groupid
指定された実効グループ ID のプロセスによりパケットが生成されている場合にマッチする。
--pid-owner processid
指定されたプロセス ID のプロセスによりパケットが生成されている場合にマッチする。
--sid-owner sessionid
指定されたセッショングループのプロセスによりパケットが生成されている場合にマッチする。

ターゲットの拡張

iptables は拡張ターゲットモジュールを使うことができる: 以下のものが、標準的なディストリビューションに含まれている。

LOG

マッチしたパケットをカーネルログに記録する。このオプションがルールに対して設定されると、 Linux カーネルはマッチしたパケットについての (IPv6 における大部分の IPv6 ヘッダフィールドのような) 何らかの情報をカーネルログに表示する (カーネルログは dmesg または syslogd(8) で見ることができる)。これは「非終了ターゲット」である。すなわち、ルールの検討は、次のルールへと継続される。よって、拒否するパケットをログ記録したければ、同じマッチング判断基準を持つ 2 つのルールを使用し、最初のルールで LOG ターゲットを、次のルールで DROP (または REJECT) ターゲットを指定する。
--log-level level
ログ記録のレベル (数値て指定するか、(名前で指定する場合は) syslog.conf(5) を参照すること)。
--log-prefix prefix
指定したプレフィックスをログメッセージの前に付ける。プレフィックスは 29 文字までの長さで、ログの中でメッセージを区別するのに役立つ。
--log-tcp-sequence
TCP シーケンス番号をログに記録する。ログがユーザーから読める場合、セキュリティ上の危険がある。
--log-tcp-options
TCP パケットヘッダのオプションをログに記録する。
--log-ip-options
IPv6 パケットヘッダのオプションをログに記録する。

MARK

パケットに関連づけられた netfilter の mark 値を指定する。 mangle テーブルのみで有効である。
--set-mark mark

REJECT

マッチしたパケットの応答としてエラーパケットを送信するために使われる。エラーパケットを送らなければ、 DROP と同じであり、TARGET を終了し、ルールの検討を終了する。このターゲットは、 INPUT, FORWARD, OUTPUT チェインと、これらのチェインから呼ばれるユーザー定義チェインだけで有効である。以下のオプションは、返されるエラーパケットの特性を制御する。
--reject-with type
type として指定可能なものは
icmp6-no-route
no-route
icmp6-adm-prohibited
adm-prohibited
icmp6-addr-unreachable
addr-unreach
icmp6-port-unreachable
port-unreach
であり、適切な IPv6-ICMP エラーメッセージを返す ( port-unreach がデフォルトである)。さらに、TCP プロトコルにのみマッチするルールに対して、オプション tcp-reset を使うことができる。このオプションを使うと、TCP RST パケットが送り返される。主として ident (113/tcp) による探査を阻止するのに役立つ。 ident による探査は、壊れている (メールを受け取らない) メールホストにメールが送られる場合に頻繁に起こる。

返り値

いろいろなエラーメッセージが標準エラーに表示される。正しく機能した場合、終了コードは 0 である。不正なコマンドラインパラメータによりエラーが発生した場合は、終了コード 2 が返される。その他のエラーの場合は、終了コード 1 が返される。

バグ

バグ? バグって何? ;-) えーと…、sparc64 ではカウンター値が信頼できない。

IPCHAINS との互換性

ip6tables は、Rusty Russell の ipchains と非常によく似ている。大きな違いは、チェイン INPUTOUTPUT が、それぞれローカルホストに入ってくるパケットと、ローカルホストから出されるパケットのみしか調べないという点である。よって、全てのパケットは 3 つあるチェインのうち 1 つしか通らない (ループバックトラフィックは例外で、INPUT と OUTPUT チェインの両方を通る)。以前は (ipchains では)、フォワードされるパケットが 3 つのチェイン全てを通っていた。

その他の大きな違いは、 -i で入力インターフェース、 -o で出力インターフェースを指定し、ともに FORWARD チェインに入るパケットに対して指定可能な点である。 ip6tables では、その他にもいくつかの変更がある。

関連項目

ip6tables-save(8), ip6tables-restore(8), iptables(8), iptables-save(8), iptables-restore(8).

パケットフィルタリングについての詳細な iptables の使用法を説明している packet-filtering-HOWTO。 NAT について詳細に説明している NAT-HOWTO。標準的な配布には含まれない拡張の詳細を説明している netfilter-extensions-HOWTO。内部構造について詳細に説明している netfilter-hacking-HOWTO。

 

http://www.netfilter.org/ を参照。

作者

Rusty Russell は、初期の段階で Michael Neuling に相談して iptables を書いた。

Marc Boucher は Rusty に iptables の一般的なパケット選択の考え方を勧めて、 ipnatctl を止めさせた。そして、mangle テーブル・所有者マッチング・ mark 機能を書き、いたるところで使われている素晴らしいコードを書いた。

James Morris が TOS ターゲットと tos マッチングを書いた。

Jozsef Kadlecsik が REJECT ターゲットを書いた。

Harald Welte が ULOG ターゲット・TTL マッチングと TTL ターゲット・ libipulog を書いた。

Netfilter コアチームは、Marc Boucher, Martin Josefsson, Jozsef Kadlecsik, James Morris, Harald Welte, Rusty Russell である。

ip6tables の man ページは、Andras Kis-Szabo によって作成された。これは Herve Eychenne <rv@wallfire.org>によって書かれた iptables の man ページを元にしている。

March 9, 2002