概要  
ホストで送受信するIPv4のパケットのフィルタリングや,NAT(network address translation)を管理するためのコマンド。非常に多機能で複雑なコマンドのため,ここではfilterテーブルを使って自ホストあてに届くパケットをフィルタリングする場合の使い方についてのみ解説する。

iptablesの定義は「テーブル」単位で管理する。このテーブルは,パケットを制御する目的ごとにあり,iptablesコマンドではfilter,nat,mangleの三つのテーブルを用意している。このうち,filterテーブルはパケットの許可や破棄を設定するためのもので,パケットのフィルタリングのために使う。natテーブルは,パケットの送信元フィールドや,あて先フィールドを変更のために使う。mangleテーブルは,TTLの設定/変更やMARK付けなどパケットの内容を変更するために使う。つまり,パケットのフィルタリングにはfilterテーブルを使うことになる。

iptablesで設定したルールは,パケットが通過する途中のどこで適用するかという場所ごとに「チェーン」と呼ぶ単位でまとめておく。具体的にいうと,受信したパケットは,まず「PREROUTING」チェーンを通過してから,自分あてのパケットか他人あてパケットかを判断し,他人あての転送対象であるパケットならば「FORWARD」チェーンを通過してから,「POSTROUTING」チェーンを通過させて外部に転送する。一方,自分あてのパケットであれば,「INPUT」チェーンを通過させてからhttpデーモンやftpデーモンといった自分のプロセスに渡す。さらに,自分のプロセスで処理したあとに再び外部に送る必要があるパケットについては,「OUTPUT」チェーンを通過してから,やはり「POSTROUTING」チェーンを通過して外部に転送される。

ルールが,どのチェーンで適用されるかは,filter,nat,mangleの三つのテーブルごとに異なる。パケットをフィルタリングするfilterテーブルで設定した内容は,このうちのINPUT/OUTPUT/FORWARDの三つのチェーンを通過する際に適用される。つまり,パケットを転送するか,自分のプロセスに渡すか,自分のプロセスから出力するか,のいずれかの場合に,設定しておいたルールに適合するパケットがあった場合は,あらかじめ指定しておいたアクションをする。

ルールでは,対象パケットを判定する基準と,該当した対象パケットをどう取り扱うかといった動作(ターゲットと呼ぶ)を定義する。チェーンを通過するパケットが基準にマッチした場合はターゲットとして設定した動作が実行され,マッチしなかった場合は次のルールに渡される。ターゲットとして指定できる動作は,通過を許可,破棄,ログに記録,送信元に通知して破棄,次のルールに飛ばす,の5種類(これ以外にユーザー定義チェーン名も指定可能)。

なお,filter以外のテーブルについては,natテーブルで設定した内容はPREROUTING/OUTPUT/POSTROUTINGチェーンを,mangleテーブルで設定した内容はPREROUTING/INPUT/OUTPUT/FORWARD/POSTROUTINGチェーンを通過したときに適用される。


 構文  
iptables [-t filter|nat|mangle] -コマンド [-オプション]

 利用環境  
Red Hat Linux, ○ (iptables-1.2.3-1にて確認)

 共通オプション 
-t filter|nat|manglefilter,nat,mangleのいずれかのテーブル名を指定する。特に指定せずに省略した場合は,はfilterが指定されたものとして扱う。


 コマンド 
-A|--append filter|nat|mangle ルールの詳細指定したチェーンにルールを追加する。
-D|--delete filter|nat|mangle ルール番号|ルールの詳細指定したチェーンのルールを削除する。削除するルールはルール番号またはルールの詳細で指定する。
-I|--insert filter|nat|mangle [ルール番号] ルールの詳細指定したチェーンにルール番号を指定してルールを挿入する。ルール番号を省略した際にはルール番号は1に設定され,チェーンの先頭に挿入される。
-R|--replace filter|nat|mangle ルール番号 ルールの詳細指定したチェーンのルールを置換する。
-L|--list [filter|nat|mangle]指定したチェーンの全てのルールを表示する。チェーンの指定を省略した際には全てのチェーンのルールが表示される。
-F|--flush [filter|nat|mangle]指定したチェーンのルールを全て消去する。チェーンの指定を省略した際には全てのチェーンのルールを消去する。
-Z|--zero [filter|nat|mangle]全てのチェーンのパケット・バイトのカウントをゼロにクリアする。
-N|--new-chain filter|nat|mangle指定した名前のユーザー定義チェーンを作成する。
-X|--delete-chain [filter|nat|mangle]指定したユーザー定義チェーンを消去する。チェーンにルールを設定している場合は消去できない。チェーンの指定を省略した際には全てのユーザー定義チェーンを消去する。
-P|--policy filter|nat|mangle ターゲットチェーンのポリシーを,指定するターゲットの値に設定する。チェーン内でどのルールにもマッチしなかった場合にはターゲットの値が適用される。ユーザー定義チェーンでは無効。
-E|--rename-chain 旧チェーン名 新チェーン名ユーザー定義チェーンの名前を変更する。


 オプション 
-p|--protocol [!] tcp|udp|icmp|allルールで使われるプロトコルを指定する。指定できるプロトコルは,tcp(TCP), udp(UDP),icmp(ICMP),all(すべて)。指定を省略した際には,すべてのプロトコルが対象となる。プロトコルを指定した際に拡張されるオプションがある。詳しくは,下記を参照。

--sport|--source-port [!] ポート[:ポート]
送信元ポートまたはポート範囲を指定する。サービス名またはポート番号を指定できる。ポート:ポートという形式でポート範囲を指定することもできる。最初のポートを省略した場合は0が設定され,最後のポートを省略した場合は65535が設定される。tcpとudpのプロトコルを指定した場合に拡張されるオプション。

--dport|--destination-port [!] ポート[:ポート]
送信先ポートまたはポート範囲を指定する。tcpとudpのプロトコルを指定した場合に拡張されるオプション。

--tcp-flags [!] 対象フラグ 設定フラグ
チェックするTCPフラグを指定する。評価対象とするフラグと設定フラグの両方をコンマ区切りのリストで指定する。指定できるフラグは,SYN/ACK/FIN/RST/URG/PSH/ALL/NONE。tcpのプロトコルを指定した場合に拡張されるオプション。

[!] --syn
SYNフラグが設定されACKとRSTフラグが設定されていないパケットにのみマッチする。「--syn」 の前に 「!」 フラグを置くと,SYNフラグが設定されておらず,ACKとRSTフラグが設定されているパケットにのみマッチする。tcpのプロトコルを指定した場合に拡張されるオプション。

--tcp-option [!] 数値
TCPオプション(ヘッダの一部)が指定した数値と一致しているパケットをマッチする。tcpのプロトコルを指定した場合に拡張されるオプション。

--icmp-type [!] タイプネーム
「iptables -p icmp -h」と実行した際に表示するICMPタイプネームを指定する。icmpを指定した場合に拡張されるオプション。

-s|--source|--src [!] 送信元 [/ネットマスク] パケットの送信元をホスト名,ネットワーク・アドレス(/ネットマスクを付ける),IPアドレスのいずれかを指定する。/ネットマスクには,/24もしくは/255.255.255.0の形式で記述する。アドレス指定の前に「!」 を置くと,そのアドレスを除外するという意味になる。
-d|--destination|--dst [!] 送信先 [/ネットマスク] パケットの送信先を指定する。書式については,上の-s|--source|--srcと同様。
-j|--jump ターゲットパケットがルールにマッチした場合にどうするか(ターゲット)を指定する。ターゲットには,組み込み済みターゲットの場合は,ACCEPT(通過を許可),DROP(破棄),LOG(ログに記録),REJECT(送信元にICMPエラー・メッセージを返して破棄),RETURN(チェーンの次のルールから判定を再開し,チェーンの最後に達した場合はポリシーで定義されたターゲットの値が適用)のいずれかを指定する。それ以外に,ユーザー定義チェーンと組み込み済みターゲットも指定可能。指定を省略した際には,ルールにマッチしてもパケットの行方に影響はないが,カウンタは加算される。
-i|--in-interface [!] LANインタフェースパケットを受信するLANインタフェースを,インターフェース名(eth0など)で指定する(INPUT/FORWARD/PREROUTINGチェーンを通過するパケットのみ)。
-o|--out-interface [!] LANインタフェースパケットを送信するるLANインタフェースを,インターフェース名(eth0など)で指定する(FORWARD/OUTPUT/POSTROUTINGチェインを通過するパケットのみ)。
-v|--verbose詳細表示モードでルールを表示する。
-n|--numericホスト名を解決せず,IPアドレスでルールを表示する。
-x|--exactパケット・カウンタとバイト・カウンタを表示する際に,K/M/Gを使わずに細かい正確な値で表示する。
--line-numbersルールを表示する際に,ルール番号を表示する。
-h|--helpiptablesコマンドのヘルプを表示する。


 使用例1:全ての接続先からのICMPパケットを拒否する(クリックで詳細表示)  
iptables -A INPUT -p icmp -j DROP

 使用例2:外部からのFTPを拒否する(クリックで詳細表示)  
iptables -A INPUT -p tcp --dport 20 -j DROP
iptables -A INPUT -p tcp --dport 21 -j DROP

 使用例3:iptablesの設定内容を保存する(クリックで詳細表示)  
service iptables save