Debianでtcpdump
さくらのVPSでDebianサーバーを構築しました。VPSで重要な事はファイアウォールの設定なのですが、IPsecを使っていたりすると設定が複雑になりがちです。なぜ繋がらないのか、逆に繋がってしまうのか、確認するために疎通テストをしながら設定します。
その際、パケットキャプチャのツールとしてtcpdumpを使うと便利です。ここではその使い方を記しておきます。
インストール
インストールはaptで行います。特に設定ファイル等は不要です。
$ su - ... # apt update ... # apt install tcpdump ...
起動オプション
tcpdumpの主な起動オプションは次の通りです。
- c
指定した個数のパケットを受信した後に終了します
- F <filename>
フィルタの条件式が書かれたファイルを指定します
- i
インターフェース指定を指定します。省略時は最も「ip a」で表示される際の左側のインデックス番号のもっとも小さい番号で有効になっているものが選択されます。この時、lo(ループバックインターフェース)は対象となりません。
- p
プロミスキャスモードを利用しません。プロミスキャスモードは自分がつながっているネットワークに流れるデータをすべて取得するモードです。サーバーが通常稼働している際は自分宛のデータしか取得しないことで負荷を軽減させます。tcpdumpのようなパケットキャプチャにおいては自分宛ではないデータも取得したいことが多いためtcpdumpは通常プロミスキャスモードで動きます。それが不要な場合はpオプションを付けてプロミスキャスモードを外します。ただし、このプロミスキャスモードはインターフェスに対して指示するものなので、他のアプリからプロミスキャスがインターフェースに指定されている場合は効果がありません。
- q
簡易的な出力をします
- w <filename>
ファイルに結果を保存します
tcpdumpのフィルタ
tcpdumpには起動オプションとは別にフィルタという機能が備わっています。これは、オプションの後につなげて記述することで、指定した条件式に一致したものだけ抽出するものです。
フィルタの書式はいろいろありますので基本的なことだけ説明していきます。詳細はman tcp-filterを確認してください。
フィルターにはtype、dir、protoの要素が存在します。許容される組み合わなら複数の指定も可能です。
type要素にはhost、net、portがあります。hostではIPアドレス、netではネットワーク、portではポートを指定します。
dir要素は方向(direct)を指定します。src(送信元)とdst(宛先)があります。「src or dst」、「src and dst」という風な記述もできます。
たとえば、送信元が192.168ネットワークだけに限定したい場合は、先のtype要素と組み合わせて次のように使います。
proto要素はプロトコルの制限です。ether、ip、ip6、icmp、icmp6、tcp、udp、arpあたりがよく使うものだと思います。
先ほどの条件に、tcpプロトコルであることを加えると次のようになります。
特殊な要素
フィルターを構成する要素には先述のほかに、gateway、broadcast、less、greaterという特別な要素もあります。
getewayはゲートウェイを指定します。たとえば「gateway 192.168.1.30」とすると192.168.1.30をゲートウェイとしている際に対象となります。
broadcastではブロードキャストを指定します。「ether broadcast」とするとブロードキャストのみ抽出します。
lessとgreaterはパケットの大きさを指定します。lessでは指定したサイズと同じがそれより小さいとき、greaterでは指定したサイズと同じかそれより大きい時に対象となります。
複雑な条件式
上記の要素で構成される条件式は、and、orで連結させることができます。またnotを使って条件を反転させることもできます。
複雑な条件式を利用する場合は、ファイルに記述し、Fオプションで利用すると毎回条件式を入力せずにすむので便利です。この時注意が必要なのは、Fオプションを指定した際はファイル内の記述以外に条件式が与えられていたとしてもその記述は無視されるという事です。