netcat:侦听和捕获TCP数据包

时间:2018-02-20 20:51:55

标签: pcap tcpdump netcat

是否可以在已经在使用的端口上侦听(不创建新连接)TCP数据包,即通过数据从路由器发送到服务器。

我知道以下内容启动了上述端口的监听过程,并将其保存在pcap文件中:

服务器端:nc -l -p <port> > file_name.pcap

客户端:sudo tcpdump -s 0 -U -n -i eth0 not host <server_ip> -w file_name.pcap | nc <server_ip> <port>

但是这会在给定端口上创建一个新连接并捕获与之相关的数据包。我想在已经用于发送数据包的端口上捕获数据包。

1 个答案:

答案 0 :(得分:2)

目前

Netcat似乎没有这种能力(根据手册页)。

当监听netcat时,通常打开socket个系列SOCK_STREAM(网络层,即TCP / UDP)并键入AF_PACKET(双向连接)。相反,要转储数据包,tcpdump会打开一个家庭SOCK_RAW(设备驱动程序层)的套接字并键入socket(直接访问收到的数据包)。

您可以使用strace来跟踪系统调用(此处为bind及后续$ sudo strace -e trace=socket,bind nc -l 8888 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3 bind(3, {sa_family=AF_INET, sin_port=htons(8888), sin_addr=inet_addr("0.0.0.0")}, 16) = 0 $ $ sudo strace -e trace=socket,bind tcpdump -w tmp.pcap [...] socket(PF_PACKET, SOCK_RAW, 768) = 3 bind(3, {sa_family=AF_PACKET, proto=0x03, if2, pkttype=PACKET_HOST, addr(0)={0, }, 20) = 0 [...] )及其参数:

SOCK_RAW

您可以使用类型为AF_INET的套接字在设备驱动程序级别(如tcpdump)或网络层转储流量。也就是说,你可以通过打开一个家庭SOCK_RAW的套接字并输入{ "_id" : "c6b8S5Rx8xZiL42WS", "rows" : [ [ { "row" : 1, "col" : 1, "reserved" : false }, { "row" : 1, "col" : 2, "reserved" : false }, ], [ { "row" : 2, "col" : 1, "reserved" : true }, { "row" : 2, "col" : 2, "reserved" : false }, ], ] } 来检索通过netcat发送的文件,如this blog post中所实现的那样。