[英]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.