2006年05月02日
パケットの,iptables の旅路を観察するときの注意点
前回の記事に関連して,IPsec を通るパケットの振る舞いを観察しようと,各テーブルのデフォルトチェインの先頭に,ログ出力するルールを組み込んでパケットを流していました.このようなものです.
iptables -t mangle -I POSTROUTING 1 -j LOG --log-prefix "/man POS/ "
iptables -t mangle -I PREROUTING 1 -j LOG --log-prefix "/man PRE/ "
iptables -t mangle -I FORWARD 1 -j LOG --log-prefix "/man FOR/ "
iptables -t mangle -I OUTPUT 1 -j LOG --log-prefix "/man OUT/ "
iptables -t mangle -I INPUT 1 -j LOG --log-prefix "/man INP/ "
iptables -t nat -I POSTROUTING 1 -j LOG --log-prefix "/nat POS/ "
iptables -t nat -I PREROUTING 1 -j LOG --log-prefix "/nat PRE/ "
iptables -t nat -I OUTPUT 1 -j LOG --log-prefix "/nat OUT/ "
iptables -t filter -I OUTPUT 1 -j LOG --log-prefix "/flt OUT/ "
iptables -t filter -I FORWARD 1 -j LOG --log-prefix "/flt FOR/ "
iptables -t filter -I INPUT 1 -j LOG --log-prefix "/flt INP/ "
これで,注意深くパケットを流してやれば,パケットの流れが一目瞭然になるはずでした.けれども,観察していると時々 nat テーブルを通っているはずなのに,そのログが出ないことがあることに気づきました.不思議に思いつつ,いろいろな種類のパケットを流していたのですが,何度かやって,その理由に気づきました.
NAT する場合,各 end point も,その方向も,種類も同じである場合,一度対象となるパケットとその仕方が決まってしまえば,後続のパケットに関しては都度テーブルを探索することなく NAT を適用して良いわけです.そのため,一番最初のパケットに関してはログが出力されるのですが,それ以後はログが出てこないのでした.どういう基準で"後続のパケット"と判断しているかは,確認はしていませんが,多分 conntrack (日本語)で同じ一つのコネクションと判断されるパケットがそれに当たるのだと思います.
ということで,毎度完全にパケットの旅路を観察したいのであれば,一度完全に iptables をリセットする = 関連するモジュールをアンロードする必要があります.
klab_gijutsu2 at 18:31│Comments(0)│TrackBack(0)