You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:48:22