tcpdumpとiptablesの関係

追記 2009-04-03

まったくもってブコメでいただいた指摘の通りです><

h2onda linux, tcpdump tcpdump(というかlibpcap)は、データリンク層(OSI layer2)レベルでパケットを取得する packet プロトコルを使ってるので、そうなります。参照: man packet(7) 2009/04/02

はてなブックマーク - h2ondaのブックマーク / 2009年4月2日

tt_clown network 細かいけど,図は逆(NIC が下)のが良いかなと思った./ "ip"tables と言う位だから,IP層でパケットをフィルタしてるて事だろうな.tcpdumpはEthernet Frameも見えるので,後は分かるな?・・・てとこか. 2009/04/02

はてなブックマーク - tt_clownのブックマーク / 2009年4月2日


packet(7)によれば、

packet ソケットは、デバイスドライバ (OSI レイヤ 2) レベルで 生のパケット (raw packet) を送受信するために用いられる。 packet ソケットを使うと、ユーザー空間で物理層の上に プロトコルモジュールを実装することができる。
...
ocket_type には SOCK_RAW と SOCK_DGRAM のいずれかを指定する。 SOCK_RAW はリンクレベルヘッダを含む raw パケットを、
...
SOCK_RAW パケットでは、パケットをデバイスドライバと受け渡しする際、パケットデータに変更が行われることはない。パケットの受信時には、アドレスの解析だけは行われ、標準的な sockaddr_ll アドレス構造体に渡される。

http://www.linux.or.jp/JM/html/LDP_man-pages/man7/packet.7.html

とのことなので、((SOCK_RAWを使っている)libpcapを使っている)tcpdumpは、L2の中でもデバイスからいちばん近いところでピチピチのパケットを観測できるわけですね。で、次のステップとして、OSI的により上位のL3に渡され、そこでiptablesでフィルタリングなどが行える、と。

あとこれは裏を取ってないんですが、L2のEthernetフレームをフィルタリングできる ebtables は、同じL2でもSOCK_RAWより上位に位置してるんですかねー L2:{SOCK_RAW→ebtables} → L3:{iptables} → L4:... みたいな。


とにかく、id:h2onda さん、id:tt_clown さんはじめブクマしてくださったみなさん、ありがとうございました!

追記 あわせて読みたい



本文

Linuxでiptables、ipvs、ip routeとかそのへんのネットワーク系の設定をする際に、パケットの到達確認をするのにtcpdumpは非常に有益なわけですが、tcpdumpのレイヤとiptablesなどのレイヤの関係を把握していないと混乱することが年に数回はあります。

例えば「INPUTチェインでDROPしているのにtcpdumpで見るとパケットが届いてるわ…」とか。

コードレベルでなくて挙動観察レベルですが、tcpdumpとiptablesの世界の関係はこんな感じっぽいです。

この階層構造を意識してパケットの気持ちになると、

  • INPUTでDROPしてても、tcpdumpでは(DROP前の)パケットが観測できる
  • tcpdumpで観測する限り、INPUTでDROPしているのとOUTPUTでDROPしているのとは見分けられない
  • PREROUTINGでDNATしてアドレス変換している場合、変換後のアドレスはtcpdumpでは観測できない
  • POSTROUTINGでSNATしてアドレス変換している場合、変換後のアドレスはtcpdumpで観測できる
  • PREROUTINGでREDIRECTしている場合、tcpdumpで観測できるdestinationアドレスは元々のものである

というのも理解できるでしょう。

あわせて見たい

さっきの図の元ネタはこのへんです:

特に後者のLVS-HOWTOは、iptables(netfilter)の世界のどのへんにipvsが食い込んでいるかわかるので、パケットをマングル!マングル!する方には必見の図と思います。