IPTABLES(8) | IPTABLES(8) |
名前
iptables - IPv4 のパケットフィルタと NAT を管理するツール書式
iptables [-t table] -[AD] チェインルールの詳細 [オプション]説明
iptables は Linux カーネルの IP パケットフィルタルールのテーブルを設定・管理・検査するために使われる。複数の異なるテーブルを定義できる。各テーブルにはたくさんの組み込み済みチェインが含まれており、さらにユーザー定義のチェインを加えることもできる。ターゲット
ファイアウォールのルールは、パケットを判断する基準とターゲットを指定する。パケットがマッチしない場合、チェイン内の次のルールが評価される。パケットがマッチした場合、ターゲットの値によって次のルールが指定される。ターゲットの値は、ユーザー定義チェインの名前、または特別な値 ACCEPT, DROP, QUEUE, RETURN のうちの 1 つである。ACCEPT はパケットを通すという意味である。 DROP はパケットを床に落す (捨てる) という意味である。 QUEUE はパケットをユーザー空間に渡すという意味である (カーネルがサポートしていればであるが)。 RETURN は、このチェインを辿るのを中止して、前の (呼び出し元) チェインの次のルールから再開するという意味である。組み込み済みチェインの最後に到達した場合、または組み込み済みチェインでターゲット RETURN を持つルールにマッチした場合、チェインポリシーで指定されたターゲットがパケットの行方を決定する。
テーブル
現在のところ 3 つの独立なテーブルが存在する (ある時点でどのテーブルが存在するかは、カーネルの設定やどういったモジュールが存在するかに依存する)。- -t, --table table
-
このオプションは、このコマンドが操作するパケットマッチングテーブルを指定する。カーネルに自動モジュールローディングが設定されている場合、そのテーブルに対する適切なモジュールがまだロードされていなければ、そのモジュールがロードされる。
- filter:
- (-t オプションが指定されていない場合は) これがデフォルトのテーブルである。これには INPUT (マシン自体に入ってくるパケットに対するチェイン)・ FORWARD (マシンを経由するパケットに対するチェイン)・ OUTPUT (ローカルマシンで生成されたパケットに対するチェイン) という組み込み済みチェインが含まれる。
- nat:
- このテーブルは新しい接続を開くようなパケットに対して参照される。これには PREROUTING (パケットが入ってきた場合、すぐにそのパケットを変換するためのチェイン)・ OUTPUT (ローカルで生成されたパケットをルーティングの前に変換するためのチェイン)・ POSTROUTING (パケットが出て行くときに変換するためのチェイン) という 3 つの組み込み済みチェインが含まれる。
- mangle:
- このテーブルは特別なパケット変換に使われる。カーネル 2.4.17 までは、 PREROUTING (パケットが入ってきた場合、すぐにそのパケットを変換するためのチェイン)・ OUTPUT (ローカルで生成されたパケットをルーティングの前に変換するためのチェイン) という 2 つの組み込み済みチェインが含まれていた。カーネル 2.4.18 からは、これらの他に INPUT (マシン自体に入ってくるパケットに対するチェイン)・ FORWARD (マシンを経由するパケットに対するチェイン)・ POSTROUTING (パケットが出て行くときに変換するためのチェイン)・という 3 つの組み込み済みチェインもサポートされる。
オプション
iptables で使えるオプションは、いくつかのグループに分けられる。コマンド
これらのオプションは、実行する特定の動作を指定する。以下の説明で注記されていない限り、コマンドラインで指定できるのはこの中の 1 つだけである。長いバージョンのコマンド名とオプション名は、 iptables が他のコマンド名やオプション名と区別できる範囲で (文字を省略して) 指定することもできる。- -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) に対して作用する。よって NAT ルールを表示するには以下のようにする。
iptables -t nat -n -L
DNS の逆引きを避けるために、よく -n オプションと共に使用される。 -Z (ゼロ化) オプションを同時に指定することもできる。この場合、チェインは要素毎にリストされて、 (訳註: パケットカウンタとバイトカウンタが) ゼロにされる。出力表示は同時に与えられた他の引き数に影響される。以下のように、 -v オプションを指定しない限り、実際のルールそのものは表示されない。
iptables -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, icmp, all のいずれか 1 つか、数値である。数値には、これらのプロトコルのどれかないし別のプロトコルを表す数値を指定することができる。 /etc/protocols にあるプロトコル名も指定できる。プロトコルの前に "!"を置くと、そのプロトコルを除外するという意味になる。数値 0 は all と等しい。プロトコル all は全てのプロトコルとマッチし、このオプションが省略された際のデフォルトである。
- -s, --source [!] address[/ mask]
- 送信元の指定。 address はホスト名 (DNS のようなリモートへの問い合わせで解決する名前を指定するのは非常に良くない) ・ネットワーク IP アドレス (/mask を指定する)・通常の IP アドレス、のいずれかである。 mask はネットワークマスクか、ネットワークマスクの左側にある 1 の数を指定する数値である。つまり、 24 という mask は 255.255.255.0 に等しい。アドレス指定の前に "!"を置くと、そのアドレスを除外するという意味になる。フラグ --src は、このオプションの別名である。
- -d, --destination [!] address[/ mask]
- 送信先の指定。書式の詳しい説明については、 -s (送信元) フラグの説明を参照すること。フラグ --dst は、このオプションの別名である。
- -j, --jump target
- ルールのターゲット、つまり、パケットがマッチした場合にどうするかを指定する。ターゲットはユーザー定義チェイン (そのルール自身が入っているチェイン以外) でも、パケットの行方を即時に決定する特別な組み込み済みターゲットでも、拡張されたターゲット (以下の「 ターゲットの拡張」を参照) でもよい。このオプションがルールの中で省略された場合、ルールにマッチしてもパケットの行方に何も影響しないが、ルールのカウンタは 1 つ加算される。
- -i, --in-interface [!] name
- パケットを受信することになるインターフェース名 ( INPUT, FORWARD, PREROUTING チェインに入るパケットのみ)。インターフェース名の前に "!"を置くと、そのインターフェースを除外するという意味になる。インターフェース名が "+"で終っている場合、その名前で始まる任意のインターフェース名にマッチする。このオプションが省略された場合、任意のインターフェース名にマッチする。
- -o, --out-interface [!] name
- パケットを送信することになるインターフェース名 ( FORWARD, OUTPUT, POSTROUTING チェインに入るパケットのみ)。インターフェース名の前に "!"を置くと、そのインターフェースを除外するという意味になる。インターフェース名が "+"で終っている場合、その名前で始まる任意のインターフェース名にマッチする。このオプションが省略された場合、任意のインターフェース名にマッチする。
- [!] -f, --fragment
- このオプションは、分割されたパケット (fragmented packet) のうち 2 番目以降のパケットだけを参照するルールであることを意味する。このようなパケット (または ICMP タイプのパケット) は送信元・送信先ポートを知る方法がないので、送信元や送信先を指定するようなルールにはマッチしない。 "-f"フラグの前に "!"を置くと、分割されたパケットのうち最初のものか、分割されていないパケットだけにマッチする。
- -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 を指定する。
マッチングの拡張
iptables は拡張されたパケットマッチングモジュールを使うことができる。これらのモジュールは 2 種類の方法でロードされる: モジュールは、 -p または --protocol で暗黙のうちに指定されるか、 -m または --match の後にモジュール名を続けて指定される。これらのモジュールの後ろには、モジュールに応じて他のいろいろなコマンドラインオプションを指定することができる。複数の拡張マッチングモジュールを一行で指定することができる。また、モジュールに特有のヘルプを表示させるためには、モジュールを指定した後で -h または --help を指定すればよい。ah
このモジュールは IPSec パケットの AH ヘッダーの SPI 値にマッチする。- --ahspi [!] spi[: spi]
conntrack
このモジュールは、接続追跡 (connection tracking) と組み合わせて用いると、 "state"マッチよりもさらに多くの、パケットについての接続追跡状態を知ることができる (この機能をサポートしたカーネルのもとで iptables がコンパイルされた場合にのみ、このモジュールは存在する)。- --ctstate state
- state は、マッチング対象となる、コンマ区切りの接続状態リストである。指定可能な state は以下の通り。 INVALID: メモリを使い果たした為や、既知の接続とは対応しない ICMP エラーなど、何らかの理由によりパケットが識別できない。 ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。 NEW: このパケットが新しい接続を開始したか、双方向にはパケットがやり取りされていない接続に属するパケットである。 RELATED: このパケットが新しい接続を開始しているが、 FTP データ転送や ICMP エラーのように、既存の接続に関係している。 SNAT: 仮想的な状態であり、書き換え前の送信元アドレスが応答の宛先アドレスと異なる場合にマッチする。 DNAT: 仮想的な状態であり、書き換え前の宛先アドレスが応答の送信元アドレスと異なる場合にマッチする。
- --ctproto proto
- (名前または数値で) 指定されたプロトコルにマッチする。
- --ctorigsrc [!] address[/mask]
- 書き換え前の送信元アドレスにマッチする。
- --ctorigdst [!] address[/mask]
- 書き換え前の宛先アドレスにマッチする。
- --ctreplsrc [!] address[/mask]
- 応答の送信元アドレスにマッチする。
- --ctrepldst [!] address [/ mask ]
- 応答の宛先アドレスにマッチする。
- --ctstatus [NONE|EXPECTED|SEEN_REPLY|ASSURED][,...]
- 接続追跡の内部的な状態にマッチする。
- --ctexpire time[:time]
- 有効期間の残り秒数、またはその範囲(両端を含む)にマッチする。
dscp
このモジュールは、IP ヘッダーの TOS フィールド内にある、 6 bit の DSCP フィールドにマッチする。 IETF では DSCP が TOS に取って代わった。- --dscp value
- (10 進または 16 進の) 数値 [0-63] にマッチする。
- --dscp-class DiffServ Class
- DiffServ クラスにマッチする。値は BE, EF, AFxx, CSx クラスのいずれかである。これらは、対応する数値で指定するのと同じである。
esp
このモジュールは IPSec パケットの ESP ヘッダーの SPI 値にマッチする。- --espspi [!] spi[: spi]
helper
このモジュールは、指定された接続追跡ヘルパーモジュールに関連するパケットにマッチする。- --helper string
- 指定された接続追跡ヘルパーモジュールに関連するパケットにマッチする。
デフォルトのポートを使った ftp-セッションに関連するパケットでは、 string に "ftp"と書ける。他のポートでは "-ポート番号"を値に付け加える。すなわち "ftp-2121"となる。
他の接続追跡ヘルパーでも同じルールが適用される。
icmp
この拡張は `--protocol icmp' が指定された場合にロードされ、以下のオプションが提供される:- --icmp-type [!] typename
-
ICMP タイプを指定できる。タイプ指定には、数値の ICMP タイプ、または以下のコマンドで表示される ICMP タイプ名を指定できる。
iptables -p icmp -h
length
このモジュールは、指定されたパケット長、またはその範囲にマッチする。- --length length[: length]
limit
このモジュールは、トークンバケツフィルタを使い、単位時間あたり制限された回数だけマッチする。この拡張を使ったルールは、(`!' フラグが指定されない限り) 制限に達するまでマッチする。例えば、このモジュールはログ記録を制限するために LOG ターゲットと組み合わせて使うことができる。- --limit rate
- 単位時間あたりの平均マッチ回数の最大値。数値で指定され、添字 `/second', `/minute', `/hour', `/day' を付けることもできる。デフォルトは 3/hour である。
- --limit-burst number
- パケットがマッチする回数の最大初期値: 上のオプションで指定した制限に達しなければ、その度ごとに、この数値になるまで 1 個ずつ増やされる。デフォルトは 5 である。
mac
- --mac-source [!] address
- 送信元 MAC アドレスにマッチする。 address は XX:XX:XX:XX:XX:XX という形式でなければならない。イーサーネットデバイスから入ってくるパケットで、 PREROUTING, FORWARD, INPUT チェインに入るパケットにしか意味がない。
mark
このモジュールはパケットに関連づけられた netfilter の mark フィールドにマッチする (このフィールドは、以下の MARK ターゲットで設定される)。- --mark value[/ mask]
- 指定された符号なし mark 値のパケットにマッチする (mask が指定されると、比較の前に mask との論理積 (AND) がとられる)。
multiport
このモジュールは送信元や送信先のポートの集合にマッチする。ポートは 15 個まで指定できる。このモジュールは -p tcp または -p udp と組み合わせて使うことしかできない。- --source-ports port[, port[, port...]]
- 送信元ポートが指定されたポートのうちのいずれかであればマッチする。フラグ --sports は、このオプションの便利な別名である。
- --destination-ports port[, port[, port...]]
- 宛先ポートが指定されたポートのうちのいずれかであればマッチする。フラグ --dports は、このオプションの便利な別名である。
- --ports port[, port[, port...]]
- 送信元ポートと宛先ポートが等しく、かつそのポートが指定されたポートのうちのいずれかであればマッチする。
owner
このモジュールは、ローカルで生成されたパケットに付いて、パケット生成者のいろいろな特性に対してマッチを行う。これは OUTPUT チェインのみでしか有効でない。また、(ICMP ping 応答のような) パケットは、所有者がいないので絶対にマッチしない。- --uid-owner userid
- 指定された実効ユーザー ID のプロセスによりパケットが生成されている場合にマッチする。
- --gid-owner groupid
- 指定された実効グループ ID のプロセスによりパケットが生成されている場合にマッチする。
- --pid-owner processid
- 指定されたプロセス ID のプロセスによりパケットが生成されている場合にマッチする。
- --sid-owner sessionid
- 指定されたセッショングループのプロセスによりパケットが生成されている場合にマッチする。
- --cmd-owner name
- 指定されたコマンド名を持つプロセスによりパケットが生成されている場合にマッチする (この機能をサポートしたカーネルのもとで iptables がコンパイルされた場合にのみ、このモジュールは存在する)。
physdev
このモジュールは、ブリッジデバイスのスレーブにされた、ブリッジポートの入出力デバイスにマッチする。このモジュールは、ブリッジによる透過的な IP ファイアウォールの基盤の一部であり、カーネルバージョン 2.5.44 以降でのみ有効である。- --physdev-in name
- パケットが受信されるブリッジのポート名 ( INPUT, FORWARD, PREROUTING チェインに入るパケットのみ)。インターフェース名が "+"で終っている場合、その名前で始まる任意のインターフェース名にマッチする。ブリッジデバイスを通して受け取られなかったパケットは、 '!' が指定されていない限り、このオプションにマッチしない。
- --physdev-out name
- パケットを送信することになるブリッジのポート名 ( FORWARD, OUTPUT, POSTROUTING チェインに入るパケットのみ)。インターフェース名が "+"で終っている場合、その名前で始まる任意のインターフェース名にマッチする。 nat と mangle テーブルの OUTPUT チェインではブリッジの出力ポートにマッチさせることができないが、 filter テーブルの OUPUT チェインではマッチ可能である。パケットがブリッジデバイスから送られなかった場合、またはパケットの出力デバイスが不明であった場合は、 '!' が指定されていない限り、パケットはこのオプションにマッチしない。
- --physdev-is-in
- パケットがブリッジインターフェースに入った場合にマッチする。
- --physdev-is-out
- パケットがブリッジインターフェースから出ようとした場合にマッチする。
- --physdev-is-bridged
- パケットがブリッジされることにより、ルーティングされなかった場合にマッチする。これは FORWARD, POSTROUTING チェインにおいてのみ役立つ。
pkttype
このモジュールは、リンク層のパケットタイプにマッチする。- --pkt-type [unicast|broadcast|multicast]
state
このモジュールは、接続追跡 (connection tracking) と組み合わせて用いると、パケットについての接続追跡状態を知ることができる。- --state state
- state は、マッチングを行うための、コンマで区切られた接続状態のリストである。指定可能な state は以下の通り。 INVALID: このパケットは既知の接続と関係していない。 ESTABLISHED: このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。 NEW: このパケットが新しい接続を開始したか、双方向にはパケットがやり取りされていない接続に属するパケットである。 RELATED: このパケットが新しい接続を開始しているが、 FTP データ転送や ICMP エラーのように、既存の接続に関係している。
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 である。よって、コマンド
iptables -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 オプションが設定されている場合にマッチする。
- --mss value[: value]
- 指定された MSS 値 (の範囲) を持つ TCP の SYN または SYN/ACK パケットにマッチする。 MSS は接続に対するパケットの最大サイズを制御する。
tos
このモジュールは IP ヘッダーの 8 ビットの (つまり上位ビットを含む) Type of Service フィールドにマッチする。- --tos tos
-
引き数は、マッチを行う標準的な名前でも数値でもよい (名前のリストを見るには
iptables -m tos -h
ttl
このモジュールは IP ヘッダーの time to live フィールドにマッチする。- --ttl ttl
- 指定された TTL 値にマッチする。
udp
これらの拡張は `--protocol udp' が指定された場合にロードされ、以下のオプションが提供される:- --source-port [!] port[: port]
- 送信元ポートまたはポート範囲の指定。詳細は TCP 拡張の --source-port オプションの説明を参照すること。
- --destination-port [!] port[: port]
- 送信先ポートまたはポート範囲の指定。詳細は TCP 拡張の --destination-port オプションの説明を参照すること。
unclean
このモジュールにはオプションがないが、おかしく正常でないように見えるパケットにマッチする。これは実験的なものとして扱われている。ターゲットの拡張
iptables は拡張ターゲットモジュールを使うことができる: 以下のものが、標準的なディストリビューションに含まれている。DNAT
このターゲットは nat テーブルの PREROUTING, OUTPUT チェイン、これらのチェインから呼び出されるユーザー定義チェインのみで有効である。このターゲットはパケットの送信先アドレスを修正する (この接続の以降のパケットも修正して分からなく (mangle) する)。さらに、ルールによるチェックを止めさせる。このターゲットにはオプションが 1 種類ある:- --to-destination ipaddr[- ipaddr][: port- port]
- 1 つの新しい送信先 IP アドレス、または IP アドレスの範囲が指定できる。ポートの範囲を指定することもできる (これはルールで -p tcp または -p udp を指定している場合にのみ有効)。ポートの範囲が指定されていない場合、送信先ポートは変更されない。
複数の--to-destination オプションを指定することができる。アドレスの範囲によって、もしくは複数の--to-destination オプションによって 2 つ以上の送信先アドレスを指定した場合、それらのアドレスを使った単純なラウンド・ロビン (順々に循環させる) がおこなわれる。
DSCP
このターゲットは、IPv4 パケットの TOS ヘッダーにある DSCP ビットの値の書き換えを可能にする。これはパケットを操作するので、mangle テーブルでのみ使用できる。- --set-dscp value
- DSCP フィールドの数値を設定する (10 進または 16 進)。
- --set-dscp-class class
- DSCP フィールドの DiffServ クラスを設定する。
ECN
このターゲットは ECN ブラックホール問題への対処を可能にする。 mangle テーブルでのみ使用できる。- --ecn-tcp-remove
- TCP ヘッダーから全ての ECN ビット (訳注: ECE/CWR フラグ) を取り除く。当然、 -p tcp オプションとの組合わせでのみ使用できる。
LOG
マッチしたパケットをカーネルログに記録する。このオプションがルールに対して設定されると、 Linux カーネルはマッチしたパケットについての (大部分の IP ヘッダーフィールドのような) 何らかの情報をカーネルログに表示する (カーネルログは 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
- IP パケットヘッダーのオプションをログに記録する。
MARK
パケットに関連づけられた netfilter の mark 値を設定する。 mangle テーブルのみで有効である。例えば、iproute2 と組み合わせて使うことができる。- --set-mark mark
MASQUERADE
このターゲットは nat テーブルの POSTROUTING チェインのみで有効である。動的割り当て IP (ダイヤルアップ) 接続の場合にのみ使うべきである。固定 IP アドレスならば、SNAT ターゲットを使うべきである。マスカレーディングは、パケットが送信されるインターフェースの IP アドレスへのマッピングを指定するのと同じであるが、インターフェースが停止した場合に接続を 忘れるという効果がある。次のダイヤルアップでは同じインターフェースアドレスになる可能性が低い (そのため、前回確立された接続は失われる) 場合、この動作は正しい。このターゲットにはオプションが 1 つある。- --to-ports port[- port]
- このオプションは、使用する送信元ポートの範囲を指定し、デフォルトの SNAT 送信元ポートの選択方法 (上記) よりも優先される。ルールが -p tcp または -p udp を指定している場合にのみ有効である。
MIRROR
実験的なデモンストレーション用のターゲットであり、 IP ヘッダーの送信元と送信先フィールドを入れ換え、パケットを再送信するものである。これは INPUT, FORWARD, PREROUTING チェインと、これらのチェインから呼び出されるユーザー定義チェインだけで有効である。ループ等の問題を回避するため、外部に送られるパケットはいかなるパケットフィルタリングチェイン・接続追跡・NAT からも監視 されない。REDIRECT
このターゲットは、 nat テーブル内の PREROUTING チェイン及び OUTPUT チェイン、そしてこれらチェインから呼び出されるユーザー定義チェインでのみ有効である。このターゲットはパケットの送信先 IP アドレスをマシン自身の IP アドレスに変換する。 (ローカルで生成されたパケットは、アドレス 127.0.0.1 にマップされる)。このターゲットにはオプションが 1 つある:- --to-ports port[- port]
- このオプションは使用される送信先ポート・ポート範囲・複数ポートを指定する。このオプションが指定されない場合、送信先ポートは変更されない。ルールが -p tcp または -p udp を指定している場合にのみ有効である。
REJECT
マッチしたパケットの応答としてエラーパケットを送信するために使われる。エラーパケットを送らなければ、 DROP と同じであり、TARGET を終了し、ルールの検討を終了する。このターゲットは、 INPUT, FORWARD, OUTPUT チェインと、これらのチェインから呼ばれるユーザー定義チェインだけで有効である。以下のオプションは、返されるエラーパケットの特性を制御する。- --reject-with type
-
type として指定可能なものは
icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-prohibited or
icmp-admin-prohibited (*)
であり、適切な ICMP エラーメッセージを返す ( port-unreachable がデフォルトである)。 TCP プロトコルにのみマッチするルールに対して、オプション tcp-reset を使うことができる。このオプションを使うと、TCP RST パケットが送り返される。主として ident (113/tcp) による探査を阻止するのに役立つ。 ident による探査は、壊れている (メールを受け取らない) メールホストにメールが送られる場合に頻繁に起こる。
(*) icmp-admin-prohibited をサポートしないカーネルで、 icmp-admin-prohibited を使用すると、 REJECT ではなく単なる DROP になる。
SNAT
このターゲットは nat テーブルの POSTROUTING チェインのみで有効である。このターゲットはパケットの送信元アドレスを修正させる (この接続の以降のパケットも修正して分からなく (mangle) する)。さらに、ルールが評価を中止するように指示する。このターゲットにはオプションが 1 種類ある:- --to-source ipaddr[- ipaddr][: port- port]
- 1 つの新しい送信元 IP アドレス、または IP アドレスの範囲が指定できる。ポートの範囲を指定することもできる (ルールが -p tcp または -p udp を指定している場合にのみ有効)。ポートの範囲が指定されていない場合、 512 未満の送信元ポートは、他の 512 未満のポートにマッピングされる。 512 〜 1023 までのポートは、1024 未満のポートにマッピングされる。それ以外のポートは、1024 以上のポートにマッピングされる。可能であれば、ポートの変換は起こらない。
複数の--to-source オプションを指定することができる。アドレスの範囲によって、もしくは複数の--to-source オプションによって 2 つ以上の送信元アドレスを指定した場合、それらのアドレスを使った単純なラウンド・ロビン (順々に循環させる) がおこなわれる。
TCPMSS
このターゲットを用いると、TCP の SYN パケットの MSS 値を書き換え、そのコネクションの最大サイズ (通常は、送信インターフェースの MTU から 40 引いた値) を制御できる。もちろん -p tcp と組み合わせてしか使えない。- 1)
- ウェブ・ブラウザで接続が、何のデータも受け取らずにハングする
- 2)
- 短いメールは問題ないが、長いメールがハングする
- 3)
- ssh は問題ないが、scp は最初のハンドシェーク後にハングする
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
- --set-mss value
- MSS オプションの値に指定した値を明示的に設定する。
- --clamp-mss-to-pmtu
- 自動的に、MSS 値を (path_MTU - 40) に強制する。
- これらのオプションはどちらか 1 つしか指定できない。
TOS
IP ヘッダーの 8 ビットの Type of Service フィールドを設定するために使われる。 mangle テーブルのみで有効である。- --set-tos tos
-
TOS を番号で指定することができる。また、
iptables -j TOS -h
を実行して得られる、使用可能な TOS 名の一覧にある TOS 名も指定できる。
ULOG
このターゲットは、マッチしたパケットをユーザー空間でログ記録する機能を提供する。このターゲットがルールに設定されると、 Linux カーネルは、そのパケットを netlink ソケットを用いてマルチキャストする。そして、1 つ以上のユーザー空間プロセスがいろいろなマルチキャストグループに登録をおこない、パケットを受信する。 LOG と同様、これは "非終了ターゲット"であり、ルールの検討は次のルールへと継続される。- --ulog-nlgroup nlgroup
- パケットを送信する netlink グループ (1-32) を指定する。デフォルトの値は 1 である。
- --ulog-prefix prefix
- 指定したプレフィックスをログメッセージの前に付ける。 32 文字までの指定できる。ログの中でメッセージを区別するのに便利である。
- --ulog-cprange size
- ユーザー空間にコピーするパケットのバイト数。値が 0 の場合、サイズに関係なく全パケットをコピーする。デフォルトは 0 である。
- --ulog-qthreshold size
-
カーネル内部のキューに入れられるパケットの数。例えば、この値を 10 にした場合、カーネル内部で 10 個のパケットをまとめ、 1 つの netlink マルチパートメッセージとしてユーザー空間に送る。 (過去のものとの互換性のため) デフォルトは 1 である。
返り値
いろいろなエラーメッセージが標準エラーに表示される。正しく機能した場合、終了コードは 0 である。不正なコマンドラインパラメータによりエラーが発生した場合は、終了コード 2 が返される。その他のエラーの場合は、終了コード 1 が返される。バグ
バグ? バグって何? ;-) えーと…、sparc64 ではカウンター値が信頼できない。IPCHAINS との互換性
iptables は、Rusty Russell の ipchains と非常によく似ている。大きな違いは、チェイン INPUT と OUTPUT が、それぞれローカルホストに入ってくるパケットと、ローカルホストから出されるパケットのみしか調べないという点である。よって、(INPUT と OUTPUT の両方のチェインを起動するループバックトラフィックを除く) 全てのパケットは 3 つあるチェインのうち 1 しか通らない。以前は (ipchains では)、フォワードされるパケットは 3 つのチェイン全てを通っていた。その他の大きな違いは、 -i で入力インターフェース、 -o で出力インターフェースを参照すること、そしてともに FORWARD チェインに入るパケットに対して指定可能な点である。
NAT のいろいろな形式が分割された。オプションの拡張モジュールとともにデフォルトの「フィルタ」テーブルを用いた場合、 iptables は純粋なパケットフィルタとなる。これは、以前みられた IP マスカレーディングとパケットフィルタリングの組合せによる混乱を簡略化する。よって、オプション
-j MASQ
-M -S
-M -L
は別のものとして扱われる。 iptables では、その他にもいくつかの変更がある。
関連項目
iptables-save(8), iptables-restore(8), ip6tables(8), ip6tables-save(8), ip6tables-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, DSCP, ECN のマッチ・ターゲットを書いた。
Netfilter コアチームは、Marc Boucher, Martin Josefsson, Jozsef Kadlecsik, James Morris, Harald Welte, Rusty Russell である。
man ページは Herve Eychenne <rv@wallfire.org>が書いた。
March 9, 2002 |