禁用 Fritzbox 上的 Homeplug 功能?

禁用 Fritzbox 上的 Homeplug 功能?

我想用 Wireshark 测试一些东西,启动它后,我注意到某个名为“AvmAudio”的设备不断广播一些“SW 版本请求”(HomePlug AV 协议),尽管我们的电源线不支持此功能。我猜这是我这里的 FritzBox 7530 的一个功能,但我在管理面板中找不到禁用此功能的选项。甚至可以禁用它吗?

Homeplug AV 数据包的屏幕截图


编辑:感谢@wsd 提供 Lorenzo Fontana 的 UDP 数据包过滤器的修改版本。我对它做了一些修改,因为我不喜欢那里的空指针算法。

/*
* File:    homeplug_av_drop.c
* Compile: clang -I /usr/include/x86_64-linux-gnu -O2 -target bpf -c homeplug_av_drop.c -o homeplug_av_drop.o
* Load:    ip link set dev <devname> xdp obj homeplug_av_drop.o sec .text
* Unload:  ip link set dev <devname> xdp off
*/

#include <linux/bpf.h>
#include <linux/in.h>
#include <linux/if_ether.h>

#define SEC(NAME) __attribute__((section(NAME), used))

#define htons(x) ((__be16)___constant_swab16((x)))

#define ETH_P_HOMEPLUG     0x88e1
#define ETH_P_MEDIAXSTREAM 0x8912



int dropper (struct xdp_md* ctx) {
    long ethhdr_addr = (long)ctx->data;
    long ethhdr_end_addr = ethhdr_addr + sizeof(struct ethhdr);

    if (ethhdr_end_addr > (long)ctx->data_end) {
        return XDP_PASS;
    }

    struct ethhdr* eth = (struct ethhdr*)ethhdr_addr;

    if (eth->h_proto == htons(ETH_P_HOMEPLUG) || eth->h_proto == htons(ETH_P_MEDIAXSTREAM)) {
        return XDP_DROP;
    } else {
        return XDP_PASS;
    }
}

char _license[] SEC("license") = "GPL";

编辑2(2020 年 6 月)我给 AVM 发了一封电子邮件,描述了这个问题,并询问是否有办法让 FRITZ!Box 停止发送这些数据包。他们的回复(德语翻译)如下:

您提供的支持数据的评估未发现 FRITZ!Box 存在任何错误。

我们没有计划添加禁用上述协议的功能。您在我们的知识库中找到的指南描述了一种持久的解决方案,以避免将来收到 [有关未经请求的包到达防火墙] 的通知。

答案1

这个问题仍然存在,而且似乎没有计划修复它。AVM 中最相关的信息是一篇知识库文章,介绍了如果您的防火墙报告 0x88e1 类型数据包的“攻击”。遗憾的是,该页面没有英文版本,因此这里提供一份摘要:

防火墙或用于分析网络活动的程序(例如 Wireshark)每 5 秒报告一次类型为 0x88e1 的数据包。

传入连接不是来自互联网,而是来自 FRITZ!Box,并且不存在安全问题。

类型 0x88e1:FRITZ!Box 定期使用类型 0x88e1 的数据包来检测网络中是否存在 FRITZ!Powerline 适配器。检测到的适配器显示在 FRITZ!Box 用户界面的“本地网络 > 网格”选项卡中。

如果您不想收到这些通知,请配置设备防火墙以允许数据包类型 0x88e1 的传入连接。

根据您的使用情况,这里有一些解决方法(请注意,我处理 0x88e1 和 0x8912,因为它们似乎是一致的):

  • 如果数据包遮挡了你的 wireshark 输出,请按如下方式过滤它们:

    ! ether proto 0x88E1 and ! ether proto 0x8912

  • 如果你想阻止它们到达任何程序(例如带有ETH_P_ALL的RAW套接字),那么使用XDP进行过滤,使用基于摘录自 Lorenzo Fontana (GPL)

    #include <linux/bpf.h>
    #include <linux/in.h>
    #include <linux/if_ether.h>
    
    #define SEC(NAME) __attribute__((section(NAME), used))
    
    #define htons(x) ((__be16)___constant_swab16((x)))
    
    int homeplug_av_drop(struct xdp_md *ctx) {
      void *data = (void *)(long)ctx->data;
      void *data_end = (void *)(long)ctx->data_end;
    
      struct ethhdr *eth = data;
    
      if (data + sizeof(*eth) > data_end) {
          return XDP_PASS;
      }
    
      if (eth->h_proto == htons(0x88e1) || eth->h_proto == htons(0x8912)) {
          return XDP_DROP;
      }
      else {
          return XDP_PASS;
      }
    }
    
    char _license[] SEC("license") = "GPL";
    

    将其保存为filter.c,然后编译、加载和卸载(完成后):

    clang -I/usr/include/x86_64-linux-gnu -O2 -target bpf -c filter.c -o filter.o
    sudo ip link set dev eth0 xdp obj filter.o sec .text
    sudo ip link set dev eth0 xdp off
    

相关内容