【问题标题】:Recreate and send packet captured by nfqueue重新创建并发送 nfqueue 捕获的数据包
【发布时间】:2015-12-01 18:38:10
【问题描述】:

我在 nfqueue 的帮助下捕获一侧的所有数据包,使用 nfq_get_payload “记录”它们(所有数据:ip 信息、下一个协议信息等)和在 udp 的帮助下将它们传送到另一端。如何在另一端恢复此数据包,然后像之间没有 udp 封装一样发送给我自己(2 端)?我应该使用一些 nfqueue API 还是必须实现所有协议数据包创建(UDP、ICMP、TCP 等)?我应该如何发送这个恢复的数据包?

【问题讨论】:

    标签: c++ c linux network-programming netfilter


    【解决方案1】:

    好的,我成功地重新创建并转发了封装在 UDP 中的数据包。娱乐后,我需要将此数据包发送到另一个 IP,但您可以使用原始目标地址。所以代码sn-p:

    char *full_packet;
    int size;
    // some actions to get full_packet and size from UDP packet
    // assume you recreated this: int size = nfq_get_payload(nfa, &full_packet);
    
    
    int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
    // also optional string needed in my case:
    setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, "wlan0", strlen("wlan0")); 
    if (sock == -1) {
        perror("socket() failed");
        return 1;
    }
    
    struct sockaddr_in to;
    struct ip *iph = (struct ip *)full_packet;
    
    to.sin_addr.s_addr = inet_addr("192.168.0.107"); // here you can set IP address where you need send this packet
    to.sin_family = AF_INET;
    
    int bytes = sendto(sock, full_packet, size, 0, (struct sockaddr*) &to, sizeof(to));
    if (bytes == -1) {
        perror("send() failed");
        return 1;
    }
    

    我希望这会对某人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 2015-07-27
      • 2017-05-25
      相关资源
      最近更新 更多