![禁用 Fritzbox 上的 Homeplug 功能?](https://linux22.com/image/1587271/%E7%A6%81%E7%94%A8%20Fritzbox%20%E4%B8%8A%E7%9A%84%20Homeplug%20%E5%8A%9F%E8%83%BD%EF%BC%9F.png)
我想用 Wireshark 测试一些东西,启动它后,我注意到某个名为“AvmAudio”的设备不断广播一些“SW 版本请求”(HomePlug AV 协议),尽管我们的电源线不支持此功能。我猜这是我这里的 FritzBox 7530 的一个功能,但我在管理面板中找不到禁用此功能的选项。甚至可以禁用它吗?
编辑:感谢@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