5

UDP 接続が確立されており、ポート (localhost) でリッスンしています。ローカルホストからも Scapy パケットを送信しようとしています。何らかの理由で、C コードが実際にパケットをキャプチャすることはありませんが、Wireshark でパケットが正常に表示されることは確認できます。ソケットを使用してからしばらく経ちましたが、設定する必要がある特別なソケット オプションがいくつかありますか、それとも Wireshark では問題なくパケットを表示できるのに、C ソケットでは表示できないのはなぜですか?

注: (localhost から) パケットを送信するための対応するソケット コードを記述したとき、パケットを正常にキャッチできましたが、別のコンピューターから送信されたときにパケットをキャッチするためのリッスン コードをまだ取得できません。

同様の質問を見つけましたが、(TCP の代わりに UDP を使用して) 彼らのアプローチを試みたとき、まだ 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;
}

スキャピースクリプト

# 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)
4

3 に答える 3

2

私は同じ問題を抱えています.udpソケットはscapyパケットを受信しません. Raw Socket Help: Why UDP packet created by raw sockets are not being received by kernel UDP? という投稿に関連するものがあると思います。 そして、私にとってうまくいくのはsocket.IP_HDRINCLオプションです。と送信者の両方の作業コードを次に示します。

差出人:

import socket
from scapy.all import *

rawudp=socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
rawudp.bind(('0.0.0.0',56789))
rawudp.setsockopt(socket.SOL_IP, socket.IP_HDRINCL,1)

pkt = IP()/UDP(sport=56789, dport=7890)/'hello'

rawudp.sendto(pkt.build(), ('127.0.0.1',7890))

受信機:

import socket
so = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
so.bind(('0.0.0.0',7890))
while True:
    print so.recv(1024)

私のMBPでは動作しませんが、Fedora 14で検証されました...

于 2014-07-11T20:22:39.113 に答える