名前


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 (ゼロ化) オプションを同時に指定することもできる。 この場合、チェインは要素毎にリストされて、 (訳註: パケットカウンタとバイトカウンタが) ゼロにされる。 どのように出力するかは、与えられる他の引き数に影響される。 ip6tables -L -v を使わない限り、(訳註: -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 アドレスやポート番号を数値によるフォーマットで表示する。 デフォルトでは、このプログラムは (可能であれば) これらの情報を ホスト名・ネットワーク名・サービス名で表示しようとする。
-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 と FIN ビットが設定されている 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
 数値の IPv6-ICMP タイプ、またはコマンド ip6tables -p ipv6-icmp -h で表示される IPv6-ICMP タイプ名を指定できる。

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 ページを元にしている。

openSUSE Logo

コンテンツ