简体   繁体   English

服务器未收到TCP SYN数据包

[英]Server not receiving TCP SYN packets

I am programming a TCP syn flooder (for educational purposes) using WinPcap, but when i send my crafted packets the server does not receive anything. 我正在使用WinPcap对TCP syn Flooder进行编程(出于教育目的),但是当我发送精心制作的数据包时,服务器未收到任何信息。 I am currently testing my program on localhost but i also have tried it on internet with Wireshark monitoring my network traffic, the packets are correct according to Wireshark but still the server does not receive anything. 我目前正在本地主机上测试我的程序,但我也在Internet上使用Wireshark监视我的网络流量来尝试了该程序,根据Wireshark数据包是正确的,但服务器仍未收到任何信息。

Here are my ethernet/IP/TCP header structures: 这是我的以太网/ IP / TCP标头结构:

#ifdef _MSC_VER
#pragma pack(push, 1)
#else
#pragma pack(1)
#endif
struct ethernet_header {
        u8 dst_mac[6];
        u8 src_mac[6];
        u16 type;
};

struct ipv4_header {
        u8 ver_ihl;
        u8 tos;
        u16 length;
        u16 id;
        u16 flags_fo;
        u8 ttl;
        u8 protocol;
        u16 checksum;
        u32 src_ip;
        u32 dst_ip;
};

struct tcp_header {
        u16 src_port;
        u16 dst_port;
        u32 seq_num;
        u32 ack_num;
        u16 off_flags;
        u16 window_size;
        u16 checksum;
        u16 urgent_ptr;
        struct {
                struct {
                        u8 id;      /* 0x02 = MSS */
                        u8 len;     /* 0x04 */
                        u16 data;   /* MSS value (1460) */
                } mss;
                u8 nop;         /* 0x01 */
                struct {
                        u8 id;      /* 0x03 = Window Scale */
                        u8 len;     /* 0x03 */
                        u8 data;    /* Window Scale value (8) */
                } window_scale;
                u8 nop2;        /* 0x01 */
                u8 nop3;        /* 0x01 */
                struct {
                        u8 id;      /* 0x04 = SACK */
                        u8 data;    /* 0x02 */
                } sack;
        } options;
};
#ifdef _MSC_VER
#pragma pack(pop)
#else
#pragma pack(0)
#endif

And this is how i initialize them: 这就是我初始化它们的方式:

    /* set ethernet header */
    memcpy(ethhdr.dst_mac, dst_mac_address, 6);
    memcpy(ethhdr.src_mac, src_mac_address, 6);
    ethhdr.type = htons(ETHERTYPE_IPV4);

    /* set ipv4 header */
    ipv4hdr.ver_ihl |= 0x40;    /* version is IPv4 */
    ipv4hdr.ver_ihl |= 0x5;     /* header size is 20 bytes */
    ipv4hdr.tos = 0;
    ipv4hdr.length = htons(sizeof(ipv4hdr) + sizeof(tcphdr));
    ipv4hdr.id = 0;
    ipv4hdr.flags_fo |= IP_CONTROL_FLAG_DF;
    ipv4hdr.ttl = 128;
    ipv4hdr.protocol = IPPROTOCOL_TCP;
    ipv4hdr.checksum = 0;
    ipv4hdr.src_ip = spoof_ip_address();
    ipv4hdr.dst_ip = inet_addr("127.0.0.1");

    /* calculate the checksum of a IP header */
    ipv4hdr.checksum = calculate_checksum(&ipv4hdr,
                        sizeof(ipv4hdr));

    /* set tcp header */
    tcphdr.src_port = htons(60450);
    tcphdr.dst_port = htons(32600);
    tcphdr.seq_num = 0;
    tcphdr.ack_num = 0;
    tcphdr.off_flags |= 0x80; /* header size is 32 bytes */
    tcphdr.off_flags |= TCP_CONTROL_FLAG_SYN;
    tcphdr.window_size = htons(8192);
    tcphdr.checksum = 0;
    tcphdr.urgent_ptr = 0;

    /* set TCP options */
    tcphdr.options.mss.id = 0x02;
    tcphdr.options.mss.len = 0x04;
    tcphdr.options.mss.data = htons(1460);
    tcphdr.options.nop = 0x01;
    tcphdr.options.window_scale.id = 0x03;
    tcphdr.options.window_scale.len = 0x03;
    tcphdr.options.window_scale.data = 2;
    tcphdr.options.nop2 = 0x01;
    tcphdr.options.nop3 = 0x01;
    tcphdr.options.sack.id = 0x04;
    tcphdr.options.sack.data = 0x02;

    /* calculate the checksum of a TCP header + options */
    tcphdr.checksum = calculate_checksum(&tcphdr, sizeof(tcphdr));

The src_mac_address and dst_mac_address are set to the same value, that is the MAC address of the network interface adapter i am using. src_mac_addressdst_mac_address设置为相同的值,即我正在使用的网络接口适配器的MAC地址。 The spoof_ip_address() function returns a random IPv4 address in network byte order. spoof_ip_address()函数以网络字节顺序返回随机的IPv4地址。 The other fields (checksum, TCP options etc.) seems to be correct according to Wireshark. 根据Wireshark,其他字段(校验和,TCP选项等)似乎是正确的。

I know that my router will overwrite MAC and IP address fields to its own MAC and IP address when sending packets destined to another network segment so that my IP spoofing is useless, but i am running a test TCP server with a backlog value of 1 on a loopback address, but it does not receive SYN packets. 我知道我的路由器在发送发往另一个网段的数据包时会将MAC和IP地址字段覆盖为其自己的MAC和IP地址,这样我的IP欺骗是无用的,但是我正在运行测试积压值为1的TCP服务器环回地址,但不接收SYN数据包。 What am i doing wrong? 我究竟做错了什么?

Thanks in advance. 提前致谢。

TCP握手完成后,用户空间服务器应用程序将仅接收新连接(TCP / IP堆栈不会仅从SYN数据包的accept()调用返回)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM