我有一個UDP連接並監聽端口(本地主機),我也想從本地主機發送Scapy數據包。出於某種原因,我的C代碼從來沒有實際捕獲數據包,但是我可以看到Wireshark中顯示的數據包很好。我已經使用套接字已經有一段時間了,但是有一些特殊的套接字選項需要設置,或者爲什麼我能夠在Wireshark中看到數據包,但不能使用C套接字?與Scapy交談的C socket
注意:當我編寫相應的套接字代碼來發送數據包(來自本地主機)時,我能夠成功捕獲數據包,但是我仍然無法從其他計算機發送數據包時聽到代碼。
我發現了一個similar question但是當我嘗試他們的方法(使用UDP而不是TCP)時,我仍然無法使用netcat來捕獲Scapy數據包。
C代碼(冷凝爲了清楚起見)
int main() {
int sock, dataLen, inLen;
struct sockaddr_in inAddr;
short listen_port = 8080;
char buffer[2048];
if (sock = socket(AF_INET,SOCK_DGRAM,0) < 0) {
printf("ERROR: unable to establish socket\n");
return -1;
}
// zero out address structure
memset(&inAddr, 0, sizeof(inAddr));
inAddr.sin_family = AF_INET;
inAddr.sin_addr.s_addr = htonl(INADDR_ANY);
inAddr.sin_port = htons(listen_port);
if (bind(sock, (struct sockaddr*)&inAddr, sizeof(inAddr)) < 0) {
printf("ERROR: unable to bind\n");
return -1;
}
inLen = sizeof(inAddr);
printf("Now listening on port %d\n", listen_port);
while(1) {
dataLen = recvfrom(sock, buffer, 1500, 0, (struct sockaddr*)&inAddr, &inLen);
if (dataLen < 0)
printf("Error receiving datagram\n");
else
printf("Received packet of length %d\n", dataLen);
}
return 0;
}
Scapy的腳本
# set interface
conf.iface="lo0"
# create IP packet
ip_pkt = IP()/UDP()
ip_pkt.payload = "payload test message"
ip_pkt.dport = 8080
ip_pkt.dst = "127.0.0.1"
ip_pkt.src = "127.0.0.1"
# send out packet
send(ip_pkt)
你的本地主機上監聽器將永遠無法捕捉到另一臺計算機發送的數據包,因爲這些數據包將不會穿越的loopback您監聽器 – jxh
@jxh監聽器綁定到'INADDR_ANY';它依賴於系統,但從另一個地址發送數據包到127.0.0.1可能會被過濾 – bbonev
@bbonev:'Scapy腳本'指定本地主機的目標IP地址。如果該腳本在另一臺機器上運行,則它無法到達偵聽器的機器。 – jxh