我想用 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";
Run Code Online (Sandbox Code Playgroud)
编辑 2(2020 年 6 月):我向 AVM 发送了一封电子邮件,描述了该问题并询问是否有办法让 FRITZ!Box 停止发送这些数据包。他们的回复(从德语翻译)如下:
对您提供的支持数据的评估未发现 FRITZ!Box 方面的任何错误。
我们没有计划添加禁用提到的协议的功能。您在我们的知识库中找到的指南描述了一个持久的解决方案,以避免未来的通知[关于未请求的包击中防火墙]。
这个问题仍然存在,而且看起来修复它并不在路线图上。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) 代码片段的小型 BPF 程序:
#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";
Run Code Online (Sandbox Code Playgroud)
将其另存为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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3136 次 |
| 最近记录: |