簡體   English   中英

綁定到設備的原始套接字未收到所有數據包

[英]Raw socket bound to device not receiving all packets

我有一個綁定到已經處於混雜模式的設備的原始套接字設置:

int sock = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
if(sock == -1)
{
   return -1;
}

struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_ifrn.ifrn_name, "eth0", IFNAMSIZ);
if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) < 0)
{
    close(sock);
    return -2;
}

while(1) {
  packet_size = recvfrom(sock , buffer , 65536 , 0 , NULL, NULL);
  // packet processing...
}

我的問題是我只在套接字上接收到IP目標與綁定到的設備的IP(eth0)匹配的數據包。 如何接收設備正在接收的所有TCP數據包? 我可以在Wireshark中看到設備上的所有TCP數據包,但是我在原始套接字中看到的唯一數據包是那些尋址到設備IP的數據包。

接收僅定向到設備IP的數據包的原因是您正在使用PF_INET原始套接字。 使用PF_INET原始套接字時- skb堆棧時skb面臨不同的健全性檢查(請參閱下文)。

int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{
    /*...*/

    /* When the interface is in promisc. mode, drop all the crap
     * that it receives, do not try to analyse it.
     */
    if (skb->pkt_type == PACKET_OTHERHOST)
        goto drop;

因此呼叫跟蹤類似於: __netif_receive_skb_core() -> ip_rcv() -> ...-> ip_local_deliver() -> ...-> raw_local_deliver() -> raw_rcv() -> ...-> tcp_rcv() (您可以通過trace-cmd檢查trace)。

但是tcpdump / Wireshark在__netif_receive_skb_core()周圍__netif_receive_skb_core()即在進行一些完整性檢查之前__netif_receive_skb_core()獲取了數據包。 因此,差異會讓您感到困惑。

因此,如果您希望skb繞過Linux內核網絡堆棧的大部分-您應該使用PF_PACKET原始套接字。

有用的鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM