Wireshark/tcpdump/libpcap 在 Linux 内核中的什么地方截获数据包?
Where did Wireshark/tcpdump/libpcap intercept packet inside Linux kernel?
根据,wireshark能够在数据包被丢弃之前获取数据包(因此我无法自己获取此类数据包)。而且我仍然想知道 linux 内核中 wireshark 获取数据包的确切位置。
答案是"On UN*Xes, it uses libpcap, which, on Linux, uses AF_PACKET sockets."有没有人有更具体的例子可以使用"AF_PACKET sockets"?如果我正确理解 wireshark,网络接口卡 (NIC) 将复制所有传入的数据包并将其发送到用户定义的过滤器(berkeley 数据包过滤器)。但这发生在哪里?还是我的理解有误,我是否遗漏了什么?
提前致谢!
在 Linux 上,您应该能够简单地使用 tcpdump(利用 libpcap 库)来执行此操作。这可以通过文件或 STDOUT 完成,您可以在 tcpdump 命令末尾指定过滤器..
But where does this happen?
如果我没理解错的话——你想知道,这样的套接字是在哪里初始化的。
pcap_create
function 试图确定源接口的类型,创建它的副本并激活它。
对于网络,请参阅 pcap_create_interface
function => pcap_create_common
function => pcap_activate_linux
function。
所有初始化都发生在 pcap_activate_linux
=> activate_new
function => iface_bind
function
( 设备的复制描述符 handlep->device = strdup(device);
,
使用 socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))
、
创建套接字
使用 bind(fd, (struct sockaddr *) &sll, sizeof(sll))
).
将套接字绑定到设备
有关更多详细信息,请阅读所提及函数的源文件中的注释 - 它们非常详细。
初始化后,所有工作都发生在一组 functions 中,例如 pcap_read_linux
,等等
根据
答案是"On UN*Xes, it uses libpcap, which, on Linux, uses AF_PACKET sockets."有没有人有更具体的例子可以使用"AF_PACKET sockets"?如果我正确理解 wireshark,网络接口卡 (NIC) 将复制所有传入的数据包并将其发送到用户定义的过滤器(berkeley 数据包过滤器)。但这发生在哪里?还是我的理解有误,我是否遗漏了什么?
提前致谢!
在 Linux 上,您应该能够简单地使用 tcpdump(利用 libpcap 库)来执行此操作。这可以通过文件或 STDOUT 完成,您可以在 tcpdump 命令末尾指定过滤器..
But where does this happen?
如果我没理解错的话——你想知道,这样的套接字是在哪里初始化的。
pcap_create
function 试图确定源接口的类型,创建它的副本并激活它。
对于网络,请参阅 pcap_create_interface
function => pcap_create_common
function => pcap_activate_linux
function。
所有初始化都发生在 pcap_activate_linux
=> activate_new
function => iface_bind
function
( 设备的复制描述符 handlep->device = strdup(device);
,
使用 socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))
、
创建套接字
使用 bind(fd, (struct sockaddr *) &sll, sizeof(sll))
).
将套接字绑定到设备
有关更多详细信息,请阅读所提及函数的源文件中的注释 - 它们非常详细。
初始化后,所有工作都发生在一组 functions 中,例如 pcap_read_linux
,等等