為什么socket可以監(jiān)聽(tīng)到對(duì)應(yīng)數(shù)據(jù),但是tcpdump監(jiān)聽(tīng)不到
#! /usr/bin/python
import socket
HOST = ''
PORT = 1111
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind((HOST, PORT))
#s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL, 1)
#s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
while 1:
???data, addr = s.recvfrom(65536)
???print('Connected by', addr)
print("Received:", data)
查看當(dāng)前網(wǎng)卡信息
ifconfig | grep -A 6 vEth
運(yùn)行Python接收程序枕荞,使之處在監(jiān)聽(tīng)狀態(tài)饵沧。
啟動(dòng)tcpdump眷蜈,使tcpdump處在監(jiān)聽(tīng)狀態(tài)。
tcpdump -i lo udp --buffer-size=40960-n? -nn -vv -X dst port 1111
利用nc向UDP 1111端口自發(fā)自收,查看Python接收程序與tcpdump程序的響應(yīng):
Python腳本有響應(yīng)建炫,tcpdump無(wú)響應(yīng)
疑問(wèn),按理來(lái)說(shuō)疼蛾,最多是tcpdump有響應(yīng)肛跌,python socket無(wú)響應(yīng)。因?yàn)閠cpdump默認(rèn)是啟用了混雜模式的,會(huì)接收到所有的包惋砂,但是socket是經(jīng)過(guò)系統(tǒng)過(guò)濾的妒挎,如果目的地址不是自己就會(huì)丟棄了,這里為了避免這種情況西饵,在代碼里面寫(xiě)Host是’’酝掩。不過(guò)想了一下就明白了,tcpdump抓不到對(duì)應(yīng)的包是因?yàn)榫烊幔@個(gè)包是nc自發(fā)自收的期虾,而tcpdump監(jiān)聽(tīng)的網(wǎng)卡是vEth0_0,將網(wǎng)卡直接換成lo就可以了驯嘱。驗(yàn)證如下: