我的任务是在networking级别监视和debuggingSOAP Web服务。 我可以使用tcpdump来捕获来自80端口的客户的整个stream量,但是我不能将每个请求的捕获限制在第一个接收到的应用层数据包(这种情况下最重要的数据包,它包含HTTP请求头文件和SOAP XML文档的开头)。 我想知道使用哪个tcpdump交换机(或其他linux命令的组合)来获取每个TCP连接的第一个数据包,并丢弃为同一个连接接收到的数据包的其余部分。
如果可能的话,从服务器发送给客户的第一个响应数据包(可能是唯一的,因为在这个应用程序中,响应XML文档很小)也是很好的。
tcpdump -i any -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'从tcpdump手册页tcpdump -i any -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'例子,所以我没有得到TCP握手数据包。
而-c开关的问题是tcpdump在捕获数据包后退出,而我需要它继续运行,并继续显示新连接的相同信息。 理想情况下,我需要类似于尾随apache访问日志文件,以及第一批有意义的请求和响应。
所以你的请求实际上比标题暗示的要窄 – 你正在寻找HTTP请求。
我使用ngrep这个,它结合了tcpdump和greptypes的function。 例如:
sudo ngrep -d eth0 '^(GET|POST) ' port 80
这会给你的文字输出。 如果需要,可以使用-w选项将匹配的数据包以tcpdump格式写入文件。
如上所述,使用-d来指定接口,因为-i在grep中用作不区分大小写。
以上内容还包括您可能不想要的传出请求等等。 根据需要附加tcpdumptypes选项。
如果您正在debugging对特定url的请求,则可能需要使用它来使正则expression式更加具体。 例如
sudo ngrep '^(GET|POST) /my/soap/interface .*Host: myhost.example.com' 'dst port 80 and dst host myhost.example.com'
在这种不寻常的情况下,请求被第二个数据包中的主机头分割成多个数据包,上面可能无法捕捉到一些请求。 大多数情况并不重要,但是您可以使用tcpdump获取比您需要的更多的内容,使用chaosreader将其分解为文件,然后开始刷新文件。
您可能不仅仅需要第一个数据包 – TCP会话的第一个数据包是首先将会话设置为三方的握手。 但是, tcpdump确实具有-c标志,它允许您捕获定义数量的数据包。
将捕获转储到文件( -w选项)。
你可以用wireshark它,它有一个强大的过滤引擎。 您将可以访问所有您需要的信息:标头,SOAP有效载荷等…