はじめに、フィルタリングのルールを設定する iptables のコマンド書式を解説します。iptables は以下の書式で実行します。
iptables COMMANDS chain rule-specification target |
chain に指定したチェインにルールを追加するのか、それとも削除するのかといった処理を指定します。
ルールを設定するチェインを指定します。
チェインに入ってきたパケットが満たすべき条件を指定します。
rule-specification で指定した条件とマッチしたパケットに対する処理を指定します。
例えば、以下のように実行されます。
# iptables -A INPUT -s 192.168.0.0/24 -p icmp -j DROP |
この例では、COMMANDS が -A 、chain が INPUT、rule-specification が -s 192.168.0.0/24 -p icmp、target が -j DROP になります。-A INPUT は、INPUT チェインにルールを追加する指定です。-s はパケットの送信元の指定で、この例では 192.168.0.0/24 を指定しています。-p はプロトコルの指定で、icmp を指定しています。-j はターゲットの指定で DROP を指定しています。したがって、このルールは、192.168.0.0/24 からの ICMP パケットをすべて DROP(破棄)する設定となります。
チェインに設定したルールを確認するには -L オプションを使用します。-L のあとにチェインを指定すると、そのチェインのルールだけが表示されます。なお、--line-numbers はルール番号を表示するためのオプションです。
# iptables -L INPUT --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP icmp -- 192.168.0.0/24 anywhere |
チェインからルールを削除するは COMMANDS に -D オプションを使用します。INPUT の後の 1 は INPUT チェインに設定された 1 番目のルールを指します。
# iptables -D INPUT 1 |
上記例は iptables コマンドの簡単な実行例ですが、COMMANDS、rule-specification、target には、他にも様々な指定があります。以下では、代表的なオプションについて解説します。
チェインの操作を指定する COMMANDS は以下の通りです。
表 22-2. チェインの操作
| オプション | 意味 | 説明 |
|---|---|---|
| -A chain | Append | chain に新しいルールを追加します。 |
| -D chain rulenum | Delete | chain のルールを削除します。rulenum にルール番号を指定して削除することも可能です。 |
| -R chain rulenum | Replace | chain の rulenum (ルール番号)のルールを指定したルールと置き換えます。 |
| -I chain rulenum | Insert | chain の rulenum (ルール番号)にルールを挿入します。ルール番号を省略すると 1 番目に挿入します。 |
| -L chain [-n] [-v] [--line-numbers] | List | chain のルールを表示します。chain を指定しなければ全てのルールが表示されます。-n を指定するとホスト情報が IP アドレスで表示されます。-v を指定するとパケット数などの詳細情報が表示されます。--line-numbers を指定するとルール番号が表示されます。 |
| -F chain | Flush | chain のルールをすべて削除します。 |
| -N chain | New Chain | 新たにユーザー定義チェインを作成します。 |
| -X chain | Delete Chain | ユーザー定義チェインを削除します。 |
| -P chain target | Policy | chain のデフォルトポリシーを target に設定します。 |
| -E old-chain new-chain | Rename Chain | old-chain に指定をしたユーザー定義チェインの名前を new-chain に変更します。 |
フィルタリングするパケットを特定するために rule-specification に指定可能な代表的なオプションは以下の通りです。
表 22-3. パケットの指定
| オプション | 意味 | 説明 |
|---|---|---|
| -s [!] address[/mask] | Source | パケットの送信元を指定します。IP アドレス(192.168.0.3)やネットワークアドレス(192.168.0.0/24、192.168.0.0/255.255.255.0)での指定が可能です。送信元の前に ! を指定することで否定の設定も可能です。例えば -s ! localhost と指定すれば、localhost 以外のパケットとマッチします。 |
| -d [!] address[/mask] | Destination | パケットの宛先を指定します。指定の方法は送信元 -s と同じです。 |
| -p [i] protocol | Protocol | プロトコルを指定します。指定できるプロトコルは、tcp、udp、icmp、all などがあります。/etc/protocols を参照してください。 |
| -i [i]name | In Interface | パケットが入ってくるインターフェース名を name に指定します。OUTPUT チェインには指定できないことに注意してください。FORWORD チェインだけが -i と -o の両方を指定することができます。インターフェース名は ifconfig コマンドで表示される名前(eth0、eth1など)を指定します。インタフェース名を特定できない場合、例えば PPP 接続を使用していて、実際接続するまで ppp0 なのか ppp1 なのかわからないときなどは + を使って ppp+ などと指定することも可能です。インターフェース名の前に ! を指定することで否定の設定も可能です。 |
| -o [i]name | Out Interface | パケットが出ていくインターフェース名を指定します。INPUT チェインには指定できないことに注意してください。FORWORD チェインだけが -i と -o の両方を指定することができます。指定方法は -i と同じです。 |
| -j terget | Jump | terget にターゲット(ACCEPT、DROP、REJECT)を指定します。または、-N で作成したユーザー定義チェインを指定します。ターゲットについては後述します。 |
パケットを特定する代表的なオプションは上記の通りですが、iptables は他にも様々なオプションを指定できる拡張性を持っています。拡張オプションの代表的なものには TCP 拡張、UDP 拡張、ICMP 拡張があります。これらの拡張は -p オプションでプロトコルを指定することで有効になり、-p オプションの後に指定できるようになります。例えば、TCP 拡張と UDP 拡張には --sport や --dport などの拡張オプションが存在し、以下のような指定ができるようになります。
# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT |
-p tcp や -p udp で TCP、UDP パケットを指定した場合は、以下の拡張オプションを指定できます。
表 22-4. 拡張オプション
| オプション | 意味 | 説明 |
|---|---|---|
| --sport [!] port | Source Port | -p tcp か -p udp の後に指定することができ、port に送信元のポートやポートの範囲を指定することができます。/etc/services ファイルに記述されたポート番号、サービス名どちらでも指定することができます。範囲を指定するにはポート番号を : で区切ります。例えば 32769:65535 とした場合、ポート番号 32769 から 65535 までを指定したことになります。: の前を省略した場合は 0、後を省略した場合は 65535 を意味します。 |
| --dport [!] port | Destination Port | -p tcp か -p udp の後に指定することができ、port に宛先のポートやポートの範囲を指定することができます。指定方法は --sport と同じです。 |
| --tcp-flags [!] mask comp | このオプションは、TCP のときだけ指定することができます。第1引数 mask に評価される TCP フラグを指定し、第2引数 comp に設定されていなければならないフラグを指定します。指定可能なフラグは、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 | このオプションは、TCP のときだけ指定することができます。SYN ビットがセットされ、ACK と RST ビットがクリアされた TCP パケットにマッチします。--tcp-flags SYN,RST,ACK SYN の指定と同じです。このようなパケットは、TCP 接続の開始要求に使われます。 |
-p icmp で ICMP パケットを指定した場合は、以下の拡張オプションを指定できます。
上記の TCP 拡張、UDP 拡張、ICMP 拡張以外に -m オプションを指定して他の拡張を有効にすることも可能です。その他の拡張には、mac、limit、owner、state などが存在します。これらの拡張を有効にするには -m state のように -m の後に拡張モジュールを指定して任意の拡張を呼び出します。ここでは、limit と state 拡張で指定可能なオプションについて解説します。その他の拡張については、man iptables(8)を参照してください。または、以下のようにコマンドを実行して拡張オプションのヘルプを参照することができます(state 拡張のヘルプを参照する場合)。
# iptables -m state --help |
-m limit を指定して limit 拡張をロードした場合は、以下の拡張オプションを指定できます。limit 拡張は、パケットがマッチする頻度を制限するために使用されます。例えば、不正なパケットによるログの肥大化や Ping of Death によるサーバーへの攻撃を防ぐ目的で使用できます。
表 22-6. limit 拡張オプション
| オプション | 説明 |
|---|---|
| --limit rate | rate には、単位時間あたりに許されるマッチ回数を指定します。単位時間には second(秒)、minute(分)、hour(時)、day(日)を指定することができます。--limit の初期値は 3/hour です。 |
| --limit-burst number | 上記 --limit が作動し始める最大バースト値(回数)を number に指定します。初期値は 5 です。 |
例えば、以下は同じ ICMP ECHO REQUEST に対するログ出力を制限するためのルールです。
# iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j LOG |
--limit-burst の初期値は 5 なので、最初の 5 パケットはログに出力されます。しかし、--limit-burst に達すると --limit が作動しますので、以降はマッチするパケットをいくつ着信しても 1 秒間に 1 回の間隔でログを出力します。また、--limit に指定した単位時間内にマッチするパケットがなければ、--limit-burst の値は 1 づつ減っていきます。つまり、この例では 5 秒間ルールにマッチするパケットを着信しなければ、バーストは完全に回復してはじめと同じ状態に戻ります。もし、5 秒以内に同じパケットを着信した場合は、そのときのバーストの値からカウントを開始し、--limit-burst の値になると再び --limit の間隔でログの出力を制限します。
-m state を指定して state 拡張をロードした場合は、以下の拡張オプションを指定できます。state 拡張を使用するとコネクションを追跡しパケット情報を記憶するため、パケットの接続状態をフィルタリングの条件として指定できるようになります。
表 22-7. state 拡張オプション
| オプション | 説明 |
|---|---|
| --state state | state にパケットの接続状態を NEW、ESTABLISHED、RELATED、INVALID から指定可能です。複数の接続状態を指定する場合はカンマ(,)で区切ります。NEW は ACK フラグがセットされていないパケットや ICMP Echo Request など接続開始パケット、ESTABLISHED は ACK フラグがセットされた既存コネクションの継続パケット、RELATED は ICMP エラーメッセージなど既存コネクションに関連するパケットの指定です。INVALID は NEW、ESTABLISHED、RELATED のどれにも該当しないパケットの指定です。 |
例えば、以下は eth0 に着信した新規の接続パケット(NEW)と継続パケット(ESTABLISHED)、関連パケット(RELATED)を許可するルールです。
# iptables -A INPUT -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT |
条件にマッチしたパケットをどう処理するかを指定するものです。前述した -j オプションの後に指定します。ターゲットの代表的なものは以下の通りです。
表 22-8. ターゲット
| ACCEPT | パケットを通過させます。 |
| DROP | パケットを破棄します。 |
| REJECT | 通常、破棄するパケットは DROP ターゲットを指定しますが、REJECT を使用するとパケットを破棄した旨の ICMP メッセージを送信元に返します。REJECT を指定するときには注意してください。例えば、外部からの不正アクセスに対してメッセージを送ると言うことは悪意のあるクラッカーに対してよけいな情報を与えることになります。しかし、信頼できるユーザーからの通信要求をあえて破棄する場合などは、クライアントプログラムがタイムアウト待ちにならないなどのメリットもあります。 |
| LOG | マッチしたパケットのログを記録します。 |
| RETURN | INPUT、OUTPUT、FORWARD チェインの場合はチェインの最後へ処理が移り、そのチェインのポリシーが適用されます。ユーザ定義チェインの場合は、呼び出したルールに戻り、引き続き次のルールから調べ始めます。 |