是否可以在已经在使用的端口上侦听(不创建新连接)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>
但是这会在给定端口上创建一个新连接并捕获与之相关的数据包。我想在已经用于发送数据包的端口上捕获数据包。
答案 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中所实现的那样。