パケットをフィルタリングする規則は、iptablesコマンドを使用して定められます。 iptablesコマンドを使用するときには、 以下のようなパケットの観点が基準としてよく使用されます。
パケットタイプ — コマンドがフィルタするパケットのタイプを指定します。
パケットの送信元/送信先 — パケットの送信元、 又は送信先に基づいてコマンドがフィルタするパケットを指定します。
ターゲット — 上記の基準に適合するパケットに対して実行されるアクションを指定します。
このようなパケットを扱う特定のオプションに関する詳細は、 項17.3.4及び項17.3.5を参照してください。
特定のiptables規則で使用されるオプションは、 規則を有効にする為に、規則全体の目的と条件を元にして論理的にグループ化する 必要があります。ここからは、iptablesコマンドに よく使われるオプションを説明していきます。
多くのiptablesコマンドの構成は、次のようになります。
iptables [-t <table-name>] <command> <chain-name> <parameter-1> \ <option-1> <parameter-n> <option-n> |
<table-name>オプションは、 コマンドで使用するために、ユーザーがデフォルトのfilter テーブル以外のテーブルを選択することができます。 <command>オプションは、 <chain-name>オプションで指定される 規則を追加する/削除するなど、実行する特定のアクションを指示します。 以下の<chain-name>は、 パケットが規則と合致したときに何を行なうか(アクション)を定義する パラメータとオプションの組み合わせです。
iptablesコマンドの構成を見てみると、他の殆どのコマンドとは異なり、 iptablesコマンドの長さと複雑性はその目的に基づいて変更出来ることを 認識しておくことが大切です。チェーンから規則の1つを削除するコマンドは、とても 短くできますが、特定のサブネットから送信されたさまざまな特定パラメータとオプションを使用するパケットをフィルタするように設計したコマンドは、かなり長くなります。iptables コマンドを作成する時、幾つかのパラメータとオプションは、さらに以前のオプションの 要求を指定するために、他のパラメータとオプションを必要とする可能性があることを認識して おくと役に立ちます。有効な規則を構成するには、他のオプションセットを要求するパラメータと オプションがすべて満足されるまで継続する必要があります。
iptables -hと入力すると、iptablesコマンドの構成の総合一覧が表示されます。
コマンドオプションは、iptablesが特定の動作を行なうよう 指示します。 1つのiptablesコマンドにつき使用できるコマンドオプションは 1つだけです。ヘルプコマンドを除くすべてのコマンドは大文字で作成します。
iptablesのコマンドには、次のようなものがあります:
-A—指定したチェーンの終わりにiptables規則を追加します。これは、チェーン内の規則の順序が問題にならない場合に 単純に規則を追加するためのコマンドです。
-C—指定したチェーンに追加する前に特定の規則をチェックします。このコマンドは、パラメータとオプションを追加するときにプロンプトが表示されるので、複雑なiptables規則を作成する場合に便利です。
-D—番号で指定した規則を特定のチェーンから削除します(チェーン内の5番目の規則は5など)。 また、規則全体を入力すると、iptablesはそれに一致する 規則をチェーンから削除します。
-E — ユーザーが定義したチェーンの名前を変更します。テーブルの構成にはまったく影響を与えません。
-F—選択したチェーンからすべての規則を削除します。チェーンを指定しない場合は、すべてのチェーンのすべての規則が削除されます。
-h — コマンドの構成の一覧とコマンドパラメータ、オプションの簡単な説明などが表示されます。
-I — チェーン内のユーザー定義の数値で指定された位置に規則を挿入します。数値が指定されていない場合、iptablesはそのコマンドをチェーンの最上部に置きます。
![]() | 注意 |
---|---|
-Aオプションまたは-Iオプションを使用する際は、 注意してください。チェーン内にある規則の順序は、どの規則をどのパケットに適用するか 決定するのに重要です。 |
-L—コマンドの後で指定するチェーン内にあるすべての規則を一覧表示します。チェーンとテーブルを指定しない場合は、デフォルトのfilterテーブル内にあるすべてのチェーンのすべての規則が一覧表示されます。それ以外の場合は、次の構文を使用して、規則を一覧するチェーンとテーブルを指定します。
iptables -L <chain-name> -t <table-name> |
規則の番号を提供したり、冗長な規則の詳細を可能にする-Lコマンドの 追加オプションは、項17.3.6で説明されています。
-N—指定した名前で新しいチェーンを作成します。
-P—指定したチェーンについてデフォルトのポリシーを設定します。これによって、パケットがチェーン内にあるすべての規則を満たさない場合に、ACCEPTやDROPなど指定されたターゲットに送ることができます。
-R — 指定されたチェーンの規則を置き換えます。 規則の番号はチェーン名の後に指定する必要があります。チェーン内の最初の規則が、 規則番号「1」になります。
-X—指定したチェーンを削除します。どのテーブルについても、あらかじめ組み込まれているチェーンは削除できません。
-Z—テーブルについてすべてのチェーンのバイトとパケットカウンタを0にします。
特定のチェーンにおける規則の追加、削除、挿入、交換などの規則を含む一定のiptablesコマンドを 指定すると、パケットフィルタリング規則を構築するためのパラメータが必要になります。
-c—特定の規則のカウンタをリセットします。このパラメータでは、PKTSオプションか、BYTESオプションを使用してリセットするカウンタを指定できます。
-d — 規則を満たすパケットの送信先ホスト名、IPアドレス、ネットワークの どれかを設定します。ネットワークと一致する場合、以下のようなIPアドレス/ネットマスク形式がサポートされます。
N.N.N.N/M.M.M.M — ここでN.N.N.Nは IPアドレスの範囲であり、 M.M.M.Mはネットマスクです。
N.N.N.N/M — ここで N.N.N.Nは IPアドレスの範囲であり、 Mはネットマスクです。
-f—断片化されたパケットのみに規則を適用します。
このパラメータの後に!オプションを使用すると、断片化されていないパケットのみに規則が適用されます。
-i — eth0やppp0などの着信ネットワーク インターフェースを設定します。iptablesでは、このオプションパラメータを使用できるのは、 filterテーブルの場合はINPUTチェーンとFORWARDチェーンと共に、またnatテーブルと mangleテーブルの場合はPREROUTINGチェーンと共に、使用する時だけです。
このパラメータはまた、以下のような特殊オプションもサポートします:
!—ディレクティブをリバースします、 つまり指定されたインターフェースをこの規則から除外します。
+ — 指定された文字列に一致するすべてのインターフェースを 一致の対象とするワイルドカード文字です。たとえば、-i eth+というパラメータを指定すると、すべてのイーサネットインターフェースに この規則が適用されますが、ppp0などの他のインターフェースには 適用されません。
-i—パラメータを使用する場合にインターフェースを指定しないと、すべてのインターフェースが対象となります。
-j — パケットが特定の規則を満たした場合に、 指定されたターゲットにジャンプするよう指定します。-j オプションの後に使用できるターゲットには、標準オプション(ACCEPT、 DROP、QUEUE、RETURN) の他に、LOG、MARK、REJECT など、Red Hat Enterprise Linux iptables RPM パッケージにデフォルトでロード されているモジュールを経由して利用可能な拡張オプションもあります。 これらオプションと他のターゲットに関する詳細は、 iptablesの manページを参照してください。
また、現在のチェーン外にあるユーザー定義のチェーンに、 この規則を満たすパケットを送ることもできます。 これにより、他の規則がそのパケットに適用できます。
ターゲットを指定しない場合、いかなる動作も行わずにパケットが通過します。しかし、その規則のカウンタには1つ加えられます。
-o — 1つの規則の為に発信ネットワークを設定します。 filterテーブルの場合はOUTPUTチェーンとFORWARDチェーン、 natテーブルとmangleテーブルの場合はPOSTROUTINGチェーン のみで使用できます。このパラメータのオプションは、着信ネットワークインターフェースパラメータ (-i)の場合と同じです。
-p — 規則についてIPプロトコルを設定します。icmp、 tcp、udp、allのどれか、サポートしているプロトコルを 指定できます。さらには、/etc/protocolsに一覧表示してあるプロトコルも使用できます。 規則を作成している時点にこのオプションが省略されていると、allオプションがデフォルトに なります。
-s — 送信先パラメータ(-d)と同じ構文を使用して、 特定のパケットの送信元を設定します。
異なるネットワークプロトコルは、特別な比較オプションを用意して、 そのプロトコルを使用して特定のパケットと一致するように設定できます。ただし、このプロトコルは最初に、iptablesコマンドに指定される 必要があります。-p tcp <protocol-name>で、指定されたプロトコル用のオプションを利用できるように します(ここで <protocol-name>はターゲット プロトコルです)。
TCPプロトコル(-p tcp)では、以下の比較オプションを使用できます。
--dport — パケットの送信先ポートを設定します。ネットワークサービス名 (wwwやsmtpなど)、ポート番号、ポート番号の範囲のいずれかを 使用できます。ネットワークサービスの名前や、エイリアスとそのネットワークサービスが使用する ポート番号を閲覧するには、/etc/servicesファイルを参照してください。 --destination-portの比較オプションは、--dportと同義と なります。
ポート番号の範囲を指定するには、-p tcp --dport 3000:3200のように2つの番号を コロン(:)で区切ります。最大の有効範囲は、0:65535です。
--dportオプションの後で感嘆符(!)を使用して、そのネットワークサービスあるいはポートを使用しない すべてのパケットを比較します。
--sport — --dportと同じオプションを使用して、パケットの 送信元ポートを設定します。--source-portの比較オプションは--sportと 同義です。
--syn—一般にSYNパケットと呼ばれる、通信を開始するよう設計された すべてのTCPパケットを規則の対象にします。データを伝送するパケットは影響を受けません。--syn オプションの後で感嘆符(!)をフラグとして使用すると、SYNパケット以外のすべてのパケットが対象になります。
--tcp-flags — 特定のビットやフラグを持つTCPパケットを規則と比較される様に設定します。 --tcp-flagsの比較オプションは2つのパラメータを受け付けます。1番目のパラメータはマスクで、 パケット内でフラグが検査されるようにします。2番目のパラメータでは、一致するように設定する必要のあるフラグを指定します。
使用できるフラグは以下のようになります:
ACK
FIN
PSH
RST
SYN
URG
ALL
NONE
たとえば、-p tcp --tcp-flags ACK,FIN,SYN SYNと指定されている iptables規則は、SYNフラグが設定されていてACKフラグとFINフラグ は設定されていないTCPパケットのみを比較します。
感嘆符(!)を--tcp-flagsの後で使用すると、比較オプションの 対応が逆転されます。
--tcp-option—特定のパケットで設定できるTCP特有のオプションを比較しようとします。感嘆符(!)を使用すると、意味を反対にすることができます。
UDPプロトコル(-p udp)では、以下のオプションを使用できます。
--dport — サービス名、ポート番号、ポート番号の範囲のどれかを使用して、 UDPパケットの送信先ポートを指定します。--destination-portの比較オプションは --dportと同義となります。このオプションのさまざまな使用法については、 項17.3.4.1の--dport比較オプションを 参照してください。
--sport — サービス名、ポート番号、ポート番号の範囲のどれかを使用して、 UDPパケットの送信元ポートを指定します。--source-portの比較オプションと同義です。 このオプションのさまざまな使用法については、項17.3.4.1の --sport比較オプションを参照してください。
ICMP(Internet Control Message Protocol)には(-p icmp)、次の比較オプションが使用できます。
--icmp-type—規則を満たすICMPタイプの番号か名前を設定します。有効なICMP名の一覧は、iptables -p icmp -hというコマンドを実行すると表示されます。
その他の比較オプションもiptablesコマンドによってロードされる モジュールで利用できます。比較オプションモジュールを使用するには、-m <module-name> などの-mオプションを 使用して、名前の指定でモジュールをロードする必要があります(<module-name>は モジュールの名前で入れ換えます)。
デフォルトで多くのモジュールが利用できるようになっています。 追加機能を提供するモジュールを作成することもできます。
以下に、よく使われるモジュールのいくつかを挙げてみました。
limitモジュール — 特定の規則を満たすパケットの数に 制限を設けます。大量の一致パケットが繰り返しのメッセージでシステムログを一杯にしたり、システムのリソースを使いきってしまうことがないようにすることができるため、 LOGターゲットと共に使用するとき特に便利です。
limitモジュールは以下のようなオプションを有効にします:
--limit—特定の時間帯に比較する回数を設定します。<number>/<time>という形式で回数と時間モディファイアを配置して指定します。たとえば、 --limit 5/hourと指定すると、1時間に5回だけ規則が比較されます。
回数と時間を指定しない場合は、デフォルト値の3/hourが使用されます。
--limit-burst—同時に比較できるパケットの数を制限します。このオプションは、--limitオプションとともに使用してください。このオプションでは、同時に比較できるパケットの最大数を指定します。
値を指定しない場合、5つのパケットだけが規則を満たすことができます。
stateモジュール — 接続状態について比較を有効にします。
stateモジュールは以下のようなオプションを有効にします:
--state — 以下の接続状態についてパケットを比較します:
ESTABLISHED—確立された接続内にある他のパケットに関係があるパケットが規則を満たします。
INVALID—既知の接続に結び付けられないパケットが規則を満たします。
NEW—新しい接続を作成しているパケットか、あるいはそれまでになかった双方向接続の一部となっているパケットが規則を満たします。
RELATED—既存の接続と何らかの関係がある新しい接続を開始するパケットが規則を満たします。
これらの接続状態を複数組み合わせて使用するには、-m state --state INVALID,NEWのようにカンマで区切ります。
macモジュール — ハードウェアMACアドレスの比較を有効にします。
macモジュールは以下のようなモジュールを有効にします:
--mac-source — パケットの送信元であるネットワークインターフェースカードの MACアドレスを比較します。この規則からMACアドレスを除外するには、--mac-source比較 オプションの後に感嘆符(!)を付けます。
他のモジュールで使用できる比較オプションを確認するには、 iptablesの manページを参照して下さい。
パケットが特定の規則を満たすと、規則はそのパケットのさまざまな行方を決定し場合によっては追加動作を させることも可能です。各チェーンにはデフォルトのターゲットがあり、そのチェーンの規則を満たすパケットが ない場合か、あるいはパケットが満たした規則のいずれもがターゲットを指定していない場合に使用されます。
標準(デフォルト)のターゲットには以下のようなものがあります:
<user-defined-chain> — <user-defined-chain>はテーブル内の ユーザー定義のチェーンの名前で入れ換えます。このターゲットはパケットを ターゲットチェーンに渡します。
ACCEPT—パケットが送信先または別のチェーンに移動することを許可します。
DROP — パケットを送信したシステムには何も通知せずに パケットをドロップします。パケットを送信したシステムは不具合の報告も受けません。
QUEUE — ユーザースペースのアプリケーションで処理されるように パケットをキューに登録します。
RETURN — 現在のチェーン内の規則に対するパケットのチェックを停止します。 RETURNターゲットのパケットが別のチェーンから呼び出されたチェーンの規則を満たす場合、 そのパケットは最初のチェーンに戻され、そこで規則チェックが再開されます。組み込み型のチェーンで RETURN規則を使用していてパケットが前のチェーンに戻れない場合は、現在のチェーンの デフォルトターゲットによって処理が決定されます。
これらの標準ターゲットのほかに、ターゲットモジュール と呼ばれる拡張機能で各種のターゲットを使用できます。比較オプションモジュールの 詳細については、項17.3.4.4を 参照してください。
多くの拡張ターゲットモジュールがありますが、ほとんどは特定のテーブルか状況のみに適用されます。デフォルトでRed Hat Enterprise Linuxに含まれているターゲットモジュールでよく使用されるものには、次のようなものがあります。
LOG — 規則を満たすすべてのパケットを記録します。パケットを記録するのは カーネルなので、出力先は/etc/syslog.confファイルによって決定されます。 デフォルトの出力先は、/var/log/messagesファイルです。
ログが行なわれる方法を指定するために、LOGターゲットの後に 追加オプションを使用できます。
--log-level — イベントを記録する優先レベルを設定します。優先レベルの一覧は、syslog.confのmanページを 参照してください。
--log-ip-options—IPパケットのヘッダーで設定されているオプションを記録します。
--log-prefix — ログを記録するときに、行の先頭に29文字までの 文字列を設置します。これは、パケットの記録とともに使用するsyslogフィルタを作成する 場合にも便利です。
--log-tcp-options — TCPパケットのヘッダーで設定されている オプションを記録します。
--log-tcp-sequence—パケットのTCPシーケンス番号を記録します。
REJECT — パケットを送信したシステムにエラーパケットを送り返して、 パケットをドロップします。
REJECTターゲットでは、--reject-with <type>(<type>は 拒絶のタイプ)を受け、エラーパケットと共に返送される 詳細情報を指定できます。他のオプションが使用されていない場合、メッセージport-unreachableがデフォルトで与えられる<type>のエラーです。 <type>オプションの総合一覧は iptablesのmanページを参照してください。
natテーブルを使用したIPマスカレード、又はmangleテーブルを使用した パケット変更で役にたつものなど、その他のターゲット拡張の幾つかは、iptablesの manページを参照してください。
デフォルトのリストコマンドiptables -Lは、デフォルトのフィルタテーブルの現在の チェーンについて非常に基本的な概要情報を提供します。追加のオプションは更に詳細情報を提供します:
-v—各チェーンがチェックしたパケット数とバイト数、各規則を満たしたパケット数とバイト数、特定の規則に適用されるインターフェースなど、冗長な出力を表示します。
-x—数値の正確な値を出力します。負荷が大きいシステムでは、特定のチェーンか、あるいは規則がチェックしたパケット数とバイト数の終わりにK(キロ)、M(メガ)、G(ギガ)を付けて表現を省略する場合があります。このオプションを指定すると、正確な値が出力されます。
-n—IPアドレスとポート番号を、デフォルトのホスト名とネットワークサービスの形式ではなく数値形式で出力します。
--line-numbers—各チェーンの規則の横にチェーン内の順序番号を出力します。このオプションは、特定の規則を削除する場合や規則を挿入する場所を探す場合に便利です。
-t — テーブル名を指定します。