ebtables规则是否会作用于AF_PACKET类型RAW Socket程序?
问题描述
我正在开发一个使用AF_PACKET RAW Socket的C程序,代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/if_ether.h> int main() { int sockfd; char buffer[ETH_FRAME_LEN]; struct sockaddr saddr; socklen_t saddr_len = sizeof(saddr); // Create a raw socket sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sockfd < 0) { perror("socket"); exit(EXIT_FAILURE); } // Receive a packet int packet_len = recvfrom(sockfd, buffer, ETH_FRAME_LEN, 0, &saddr, &saddr_len); if (packet_len < 0) { perror("recvfrom"); close(sockfd); exit(EXIT_FAILURE); } printf("Received a packet\n"); close(sockfd); return 0; }
若我在ebtables中配置规则(例如根据MAC地址丢弃帧),该RAW Socket程序是否会受到这些规则的影响?是Socket仍能接收所有帧,还是帧在被Socket获取前就被过滤?
解答
你的AF_PACKET RAW Socket程序不会受ebtables过滤规则影响,仍然能接收到所有到达网卡的链路层帧,哪怕是被ebtables标记为丢弃的帧,也不会提前被过滤掉。
这是因为Linux网络栈的处理顺序:AF_PACKET类型的RAW套接字是直接从网卡驱动的接收队列里抓取原始帧,这个操作发生在netfilter(ebtables属于netfilter框架的链路层组件)的过滤逻辑之前。ebtables的规则只对那些要进入上层协议栈(比如IP、TCP层)或者需要转发、输出的帧生效,而你的RAW Socket绕过了这个处理路径,直接拿到了最原始的链路层数据。
再加上你代码里用了htons(ETH_P_ALL)参数,这个套接字会捕获网卡收到的所有类型的帧,不管ebtables有没有设置丢弃规则,这些帧都会被你的程序接收到。
内容的提问来源于stack exchange,提问作者Klickmann
相关产品推荐
相关产品推荐

