我正在运行 Archlinux 并且有一个使用 netctl 设置的工作 Wifi 接口:
Description='Automatically generated profile by wifi-menu'
Interface=wlp3s0
Connection=wireless
Security=wpa
ESSID=ZyXEL3C58C2
IP=dhcp
Key=XXXXXXXXXXXX
但是当我运行时ip link
,链接类型显示为link / ether:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
link/ether f0:de:f1:d4:7e:89 brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
link/ether 10:0b:a9:c0:3b:80 brd ff:ff:ff:ff:ff:ff
这通常不是问题,但我试图编写对不同链接类型敏感的网络软件,但系统返回的link/ether
不是预期的结果link/iee802.11
。
为什么会发生这种情况?
电脑是联想Thinkpad X220,使用iwlwifi和iwldvm模块进行无线网络连接。
答案1
这是正常的。默认情况下,Wi-Fi是旨在提供与以太网兼容(即 802.3 兼容)的 MAC 层。来自 IEEE 802.11-2016(通过 IEEE GET 免费):
4.2.5 与其他 IEEE 802® 层的交互
IEEE Std 802.11 需要作为通用 IEEE 802 LAN 出现在更高层 [逻辑链路控制 (LLC)] 中。
因此,高层协议将 Wi-Fi 视为以太网,操作系统透明地将 L2 标头重写为数据帧,这很正常。这甚至允许 AP(例如您的家用路由器)透明地将 Wi-Fi 桥接到以太网,而无需额外努力。
为了访问 Wi-Fi 特定功能(例如,通过 wpa_supplicant 进行 WPA 身份验证),Linux 提供了 Netlink API(nl80211)以及过时的 WEXT ioctls。请参阅iw
、wpa_supplicant
和的源代码iwd
以获取示例 - 或者实际上考虑是否可以使用 wpa_supplicant 自己的 API 来执行您想要的操作。
发送和接收真实的802.11帧,启用接口的监控模式:
iw phy phy0 interface add mon0 type monitor
iw dev mon0 set monitor control otherbss
iw dev mon0 set channel 11
ip link set mon0 up
结果:
8: mon0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ieee802.11/radiotap 48:5d:60:e8:65:8f brd ff:ff:ff:ff:ff:ff
看aircrack-ng 文档一个可能的数据包注入工具。
注意并非全部WLAN 适配器支持数据包注入,甚至一般支持监控模式。(使用“SoftMAC”设备(例如 ath9k)比使用“FullMAC”设备更幸运,因为它们在固件中处理所有事情。我还没有弄清楚如何让我的 iwlwifi 显示信标帧。)