Deprecated : The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Stray Penguin - Linux Memo (iptables)
このサイトは、もともと作者の自分用メモとして書き始めたものです。書いてあることが全て正しいとは限りません。他の文献、オフィシャルなサイトも確認して、自己責任にて利用してください。
iptables
非常に役に立つ HOWTO に、 Oskar Andreasson の Iptables
tutorial がある。日本語訳が存在しなかったので翻訳した (2006/01 本家にも掲載されました - Thank you, Oskar !)。
iptables は、カーネルが利用するIPパケットフィルタのルールを、操作するためのユーティリティ。カーネルそのものと密接に関係しており、kernel-2.2 では ipchains
が使われていた。kernel-2.4 以降、 iptables が標準となる。ipchains とは比べものにならないほど、膨大な種類の操作オプションが用意されている。ipchains
との最も大きな違いは、パケットを既存のコネクションとの関係性によって識別できる「コネクショントラッキング (接続追跡)」 というメカニズムを実装していること。この conntrack
機構のおかげで、いわゆる「ステートフルファイヤーウォール」が実現でき、主接続の他にも不特定ポートの子接続を張りたがる FTP や IRC などといった通信に対しても、1024 より上のポートを全部開けておくというような危なっかしい設定をする必要は無くなった。最低限のポートを開放するだけ
(FTP なら 21 だけ) で、必要な通信を阻害することなく、厳格な規制が掛けられる。
RedHat 7.x では、kernel は 2.4 でありながら、言いなりでセットアップすると iptables と ipchains が両方ともインストールされてしまう。ipchains
が動いている限り、iptables は働かないので、ipchains を rc から外すなどして止めなくてはならない (さっさとアンインストールすべし)。
テーブルの階層構造
テーブル
チェーンのまとまり。filter, nat, mangle の3種がある。組み込まれているチェーンは、テーブルの種類によって少し異なる。
チェーン
ルールのまとまりによるフィルタリングアルゴリズム。PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING 及び、ユーザ定義チェーンがある。
ルール
「パケットがこれこれだったら、そいつをこう操作せよ」 という指示。操作は ACCEPT, DROP, REJECT, LOG, RETURN, TOS, TTL, MARK,
DNAT, SNAT, MASQUERADE, QUEUE, REDIRECT などか、その他拡張ターゲットのうちいずれか。テーブル-チェーンの種類によって、指定できる動作は異なる。
PRE とはいつか、POST とはどの時点か、など、知っておいたほうがいいが、とても語り尽くせない。Iptables
Tutorial (FrozenTux - Oskar Andreasson) がものすごく役に立つ。読んでいるうちに、どこにも日本語訳がないことがわかったので全文訳した -
Iptables チュートリアル 全文訳 (翻訳ミスを見つけたら指摘 をお願いします)。
ルールの書式
基本書式:
iptables [-t table ] command rule
大文字と小文字は区別される。以下、command 部、rule 部に分けて説明。
コマンド部
ルール操作に関する主なコマンド
"-t table
" を省略した場合、filter テーブルを指定したのと同じ意味となる。
[-t table ] -A chain
rule
[-t table ] -D chain
(rule |rule_No. )
[-t table ] -I chain
[rule_No. ] rule
[-t table ] -R chain
rule_No. new_rule
チェーン操作に関する主なコマンド
"-t table " を省略した場合、-N ,
-P では上記と同じ、-F , -Z ,
-L , -X はすべてのテーブルが対象となる。
[-t table ] -N new_chain_name
[-t table ] -P chain
policy
[-t table ] -F [chain ]
[-t table ] -X [chain ]
[-t table ] -Z [chain ]
[-t table ] -L [chain ]
[options ]
ルール部
ルール部の基本書式:
条件 -j 動作または他のユーザ定義チェーン[オプション]
パケットの一致条件に使用する主なパラメータ
"!" を挟むと意味を反転 (否定) できる。
-p [!] protocol
-s [!] address [/mask ]
-d [!] address [/mask ]
-i [!] interface [+]
-o [!] interface [+]
条件の拡張
-m module
を使ってカーネルモジュールをロードすると、さらに様々なパケットマッチが行える。ある種のモジュールはパラメータに応じて自動的にロードされるので、"-m module
" は省略可能なこともある。RedHat系では、デフォルトでかなりの種類のパケットマッチカーネルモジュールがコンパイルされているため、カーネルのリビルドは滅多に必要とならない。どうしても動かない場合や、モジュールのロード状態を確認したいときは、lsmod
してみるとよい。
以下が、主なモジュールとその機能の超抜粋。マッチ拡張はこの他にも山のようにある。
tcp モジュール
--sport [!] port [:port_end ]
--dport [!] port [:port_end ]
--tcp-flags [!] test [,test ..]
set
[!] --syn
udp モジュール
--sport [!] port [:port_end ]
--dport [!] port [:port_end ]
icmp モジュール
state, conntrack モジュール
パケットが既存のコネクションと関連性があるか、あればどういった関連性かによって、パケットのマッチを行う。state モジュールをロードすると conntrack (コネクション追跡)
モジュールもロードされる (OS や ディストリビューション、設定方法によっては、あらかじめ conntrack モジュールを modprobe しておかなくてはならない場合もある)。
STATE には以下の種類がある:
ESTABLISHED
RELATED
NEW
INVALID
multiport モジュール
飛び飛びのポートやポート範囲を一度に指定 (最大15個) できる。 -p tcp または
-p udp と組み合わせないと働かない。
--sports port ,port [,port ..]
--dports port ,port [,port ..]
--ports port ,port [,port ..]
動作 (ジャンプターゲット) の主なもの
ACCEPT
DROP
REJECT [--reject-with reply_type ]
DNAT --to-destination address [:port ]
SNAT --to-source address [:portA -portB ]
MASQUERADE [--to-ports port [-port ]]
LOG [--option ]
RETURN
user_defined_chain