Tcpdumpでackまたはsynパケットをキャプチャする方法は?


48

フィルタルールを使用して、ackまたはsynパケットのみをキャプチャしたい。どうすればいいですか?


個人的に私はこれをしません。すべてのパケットをキャプチャし、後でSYNフラグとACKフラグでフィルタリングします。TCPのトラブルシューティングを行う場合、ほとんどの場合、ハンドシェイクやACKだけでなく、会話全体を確認する必要があります。実際のデータペイロードに関心がない場合は、でパケットサイズを制限できますtcpdump -s SIZE。TCPヘッダーは可変長である可能性があるため、キャプチャー-s 128はおそらくすべての可能なヘッダーとおそらく少しのデータを取得します。
suprjami 14

4
たぶん、TCPのトラブルシューティングを行っていないのかもしれません。たぶん、あなたはプログラムがどれほどおしゃべりであるかを見たいと思うでしょう、そして、あなたはそのアウトバウンド接続を数えたいでしょう。私のように、今。
ダンプリッツ16

回答:


81

PCAPフィルタの構文 tcpdumpのために使用さは、Wiresharkのキャプチャフィルタでまったく同じように動作するはずです。

tcpdumpでは、このようなフィルターを使用します。

tcpdump "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"

tcpdumpのmanページをチェックして、tcpflagsに細心の注意を払ってください

Wireshark Wikiのキャプチャおよび表示フィルターに関するセクションも確認してください。残念ながら、2種類のフィルターはまったく異なる構文を使用し、同じものに異なる名前を使用します。

キャプチャフィルターの代わりにディスプレイフィルターが必要な場合は、おそらくtcp.flags.ackとtcp.flags.synを組み合わせた式を作成する必要があります。ただし、キャプチャフィルターにははるかに精通しているので、自分で解決する必要があります。


1
私はあなたの反応が好きです。努力したようです。あなたのために賛成票を投じてください。
アブルー

4
これは良い参考資料としてはすばらしい答えですが、この構文は、他のフラグも設定されている場合でも、SYNまたはACKフラグが設定されているパケットをキャプチャすることに注意してください。これは、OPが意図したものである場合とそうでない場合があります。TCP SYNまたはACKパケットのみが必要な場合のより厳密なフィルターについては、以下の回答を参照してください。乾杯。
JJC

14

@Zoredacheの答えは素晴らしく、完全ですが、構文はTCP SYNまたはTCP ACKフラグが設定されたパケットを生成することに注意してください。また、他のフラグが設定されています。これは、あなた(または将来の読者)が意図したものである場合とそうでない場合があります。たとえば、その構文はTCP SYN-ACKパケット、TCP FIN-ACKなどもキャプチャします。TCPSYN またはTCP ACKパケットのみが必要な場合(つまり、これらのフラグセットの1つのみ)、適切なキャプチャフィルタ構文は次のとおりです。

'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'

同等:

'tcp[13] == 2 or tcp[13] == 16'

乾杯!


9

トップの「シンナー」を見るためのスクリプトを作成しました。そのため、最初のsynパケット(3パケットハンドシェイクの最初のパケット)のみを検討します。つまり、syn = 1、ack = 0

while :; do
  date; 
  tcpdump -i eth1 -n -c 100 \
  'tcp[tcpflags] & (tcp-syn) != 0' and 
  'tcp[tcpflags] & (tcp-ack) == 0' 2> /dev/null \
  | awk '{ print $3}' \
  | sort | uniq -c | sort | tail -5;
  echo;
  sleep 1
done

5
それは良い例です。「 'tcp [tcpflags]&(tcp-syn)!= 0'および 'tcp [tcpflags]&(tcp-ack)== 0' "を単に 'tcp [tcpflags]に置き換えることで、tcpdumpキャプチャフィルターをさらに簡素化できます。 ] == tcp-syn '。これにより、ACKが設定されたパケットが自動的に除外されます。乾杯!
JJC

9
tcpdump 'tcp[13] = 3'

http://danielmiessler.com/study/tcpdump/

高度な

また、パケットの特定の部分に基づいてフィルタリングしたり、複数の条件をグループにまとめることもできます。たとえば、前者はSYNsまたはRSTs のみを検索する場合に役立ち、後者はさらに高度なトラフィック分離に役立ちます。

UAP RSF

[ヒント:TCPフラグのアナグラム:スキルのない攻撃者が本物のセキュリティフォークをせがむ]

あなたのメモ:...

すべての緊急(URG)パケットを表示...

tcpdump 'tcp[13] & 32 != 0'

すべてのACKNOWLEDGE(ACK)パケットを表示...

tcpdump 'tcp[13] & 16 != 0'

すべてのプッシュ(PSH)パケットを表示...

tcpdump 'tcp[13] & 8 != 0'

すべてのリセット(RST)パケットを表示...

tcpdump 'tcp[13] & 4 != 0'

すべてのSYNCHRONIZE(SYN)パケットを表示...

tcpdump 'tcp[13] & 2 != 0'

すべてのFINISH(FIN)パケットを表示...

tcpdump 'tcp[13] & 1 != 0'

すべてのSYNCHRONIZE / ACKNOWLEDGE(SYNACK)パケットを表示...

tcpdump 'tcp[13] = 18'

[ 注:のみPSHRSTSYN、およびFINフラグがtcpdumpののフラグフィールドの出力に表示されます。URGsとACKsは表示されますが、フラグフィールドではなく出力の別の場所に表示されます]


2
Stack ExchangeではPlagarismを使用できません。この投稿を編集して、リンク先サイトからコンテンツをコピーしたことを明確にしてください。ありがとうございました。
クリスS

4

自分でSYNパケットだけを取得したかったので、次のコマンドを使用しました。

tcpdump -i eth7 'tcp[13] & 2 != 0'

これはすぐに動作するはずです。


3
これにより、SYN、SYN-ACKなど、SYNフラグが設定されたパケットがキャプチャされます。SYNパケットのみが必要な場合は、代わりに「tcp [13] == 2」を使用します。乾杯!
JJC

1

フィルタや引数なしで表示する必要があります。


あなたの答えは技術的には正しいですが、OPはおそらく彼の質問に「のみ」という言葉を含めるつもりでした。;-)乾杯!
-JJC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.