Linux 上类似于 VETH 的虚拟 WiFi / 802.11 接口
Virtual WiFi / 802.11 interface similar to VETH on Linux
我正在寻找一种在单个设备上设置纯虚拟(即没有实际信号)802.11 网络的方法 - 出于测试目的,其功能与此类似:
- 创建多个接入点接口(例如,
ap0
、ap1
..)
- 设置他们的基本参数(
ssid
...)
- 在每一个上设置 dhcp 服务器,
- 使用 shell 命令管理他们的信号强度 (
iw
?)
- 允许密码管理(更改密码、加密方法等)
- 创建单一接入点客户端界面 (
wifi0
),这将
- 查看特定访问点(或所有访问点)
- 允许我在 NetworkManager
等工具的帮助下 连接 到特定接口
实际上,它非常基础,看到 veth
驱动程序如何与 ip link
一起工作给了我很多希望。
iw 工具是否可行?如果是 - 我该怎么做?
如果没有,如果我需要实施这个,我通常会如何处理此事?通过创建一个提供数据的假 wpa_supplicant 驱动程序?
对于此事的任何提示和指示,我将不胜感激。
我不能回答你所有的问题,但我可以给你一个提示。
你可以使用iw创建一个虚拟网络接口,但是要小心,因为你的wifi网卡的驱动可能会被制造商限制。
尝试使用如下命令检查 "valid interface combinations"(之前选择正确的 "phy"):
iw phy phy0 info
并检查接口的最大数量和它们的组合。
我不确定,但也许您可以直接使用 wpa_supplicant 创建一个虚拟接口(就像这个软件对 wi-fi direct 所做的一样)。
如果您需要有关 wpa_supplicant 的帮助,我建议您使用此邮件列表:http://lists.shmoo.com/pipermail/hostap/
还有一个小例子。我使用了 Android 和 wpa_supplicant 的 Nexus 5。我为 Android 编译了 iw,结果是:
> iw phy phy0 info
Supported interface modes:
* IBSS
* managed
* AP
* P2P-client
* P2P-GO
software interface modes (can always be added):
valid interface combinations:
* #{ managed } <= 2, #{ P2P-client, P2P-GO } <= 2, #{ IBSS } <= 1,
total <= 3, #channels <= 2
>iw dev
phy#0
Interface p2p1
ifindex 24
type managed
Interface wlan0
ifindex 21
type managed
Interface p2p0
ifindex 20
type managed
显然,如果您使用带有 linux 的 PC,接口数量可能会更多。这是一款驱动程序有限的智能手机。
最后,要小心,因为正如 wpa_supplicant 的创建者向我解释的那样,如果你想要一个完全支持 802.11 的 veth,你应该选择正确的类型,例如,使用驱动程序 nl80211 和不是带有 ip link.
的 macvtap
我试图遵循 Stefano Cappa 发布的提示,但没有成功。我的界面一直报告 No valid interface combinations
,这表明我应该卡住(但不是)。
可以借助
调出虚拟WIFI
- mac80211_hwsim 内核模块
- 模块可配置为
radios
参数指示虚拟物理卡的数量 (phy#
)。
- 每个
phy#
可以模拟一个独立的无线网卡
- 每个
phy#
网卡都有一个关联的 LAN 接口 (wlan#
)。
- 模块还带来了一个
hwsim#
接口,可用于监听所有无线电卡之间发生的 伪 wifi 流量。
hostapd
能够将任何无线电(包括模拟无线电)变成接入点的工具,
wpa_supplicant
可用于扫描区域中的接入点或连接到这些区域的工具。
我最终想出了一个解决方案(花了我一段时间,因为我试图用 Android 实现它)仅依赖于这三件事。这些工具将使用 nl80211
驱动程序与伪硬件通信。
我的简单配置文件如下所示:
hostapd.conf(注意,这个文件的设置比要求的多,但我在这里发布了我的所有设置)
interface=wlan1
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ctrl_interface_group=0
ssid=Vamonos Pest
country_code=US
hw_mode=g
channel=1
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346
macaddr_acl=0
auth_algs=3
ignore_broadcast_ssid=0
wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
eapol_key_index_workaround=0
eap_server=0
own_ip_addr=127.0.0.1
wpa_supplicant.conf
network={
ssid="Vamonos Pest"
key_mgmt=NONE
priority=16
}
终于推出了两款:
hostapd -d hostapd.conf
wpa_supplicant -Dnl80211 -iwlan0 -d -csupplicant.conf
成功了。 wpa_supplicant
能够扫描网络区域并找到所有虚拟 wifi 接入点。如果 hwsim 模块使用两个以上的无线电,则可以创建更多无线电。从这里开始,剩下的就很简单了——在 wlan1 上启动 dhcp 服务器,在 wlan0 上启动 dhcp 客户端,你就完成了。
我正在寻找一种在单个设备上设置纯虚拟(即没有实际信号)802.11 网络的方法 - 出于测试目的,其功能与此类似:
- 创建多个接入点接口(例如,
ap0
、ap1
..)- 设置他们的基本参数(
ssid
...) - 在每一个上设置 dhcp 服务器,
- 使用 shell 命令管理他们的信号强度 (
iw
?) - 允许密码管理(更改密码、加密方法等)
- 设置他们的基本参数(
- 创建单一接入点客户端界面 (
wifi0
),这将- 查看特定访问点(或所有访问点)
- 允许我在 NetworkManager 等工具的帮助下 连接 到特定接口
实际上,它非常基础,看到 veth
驱动程序如何与 ip link
一起工作给了我很多希望。
iw 工具是否可行?如果是 - 我该怎么做?
如果没有,如果我需要实施这个,我通常会如何处理此事?通过创建一个提供数据的假 wpa_supplicant 驱动程序?
对于此事的任何提示和指示,我将不胜感激。
我不能回答你所有的问题,但我可以给你一个提示。
你可以使用iw创建一个虚拟网络接口,但是要小心,因为你的wifi网卡的驱动可能会被制造商限制。
尝试使用如下命令检查 "valid interface combinations"(之前选择正确的 "phy"):
iw phy phy0 info
并检查接口的最大数量和它们的组合。
我不确定,但也许您可以直接使用 wpa_supplicant 创建一个虚拟接口(就像这个软件对 wi-fi direct 所做的一样)。 如果您需要有关 wpa_supplicant 的帮助,我建议您使用此邮件列表:http://lists.shmoo.com/pipermail/hostap/
还有一个小例子。我使用了 Android 和 wpa_supplicant 的 Nexus 5。我为 Android 编译了 iw,结果是:
> iw phy phy0 info
Supported interface modes:
* IBSS
* managed
* AP
* P2P-client
* P2P-GO
software interface modes (can always be added):
valid interface combinations:
* #{ managed } <= 2, #{ P2P-client, P2P-GO } <= 2, #{ IBSS } <= 1,
total <= 3, #channels <= 2
>iw dev
phy#0
Interface p2p1
ifindex 24
type managed
Interface wlan0
ifindex 21
type managed
Interface p2p0
ifindex 20
type managed
显然,如果您使用带有 linux 的 PC,接口数量可能会更多。这是一款驱动程序有限的智能手机。
最后,要小心,因为正如 wpa_supplicant 的创建者向我解释的那样,如果你想要一个完全支持 802.11 的 veth,你应该选择正确的类型,例如,使用驱动程序 nl80211 和不是带有 ip link.
的 macvtap我试图遵循 Stefano Cappa 发布的提示,但没有成功。我的界面一直报告 No valid interface combinations
,这表明我应该卡住(但不是)。
可以借助
调出虚拟WIFI- mac80211_hwsim 内核模块
- 模块可配置为
radios
参数指示虚拟物理卡的数量 (phy#
)。 - 每个
phy#
可以模拟一个独立的无线网卡 - 每个
phy#
网卡都有一个关联的 LAN 接口 (wlan#
)。 - 模块还带来了一个
hwsim#
接口,可用于监听所有无线电卡之间发生的 伪 wifi 流量。
- 模块可配置为
hostapd
能够将任何无线电(包括模拟无线电)变成接入点的工具,wpa_supplicant
可用于扫描区域中的接入点或连接到这些区域的工具。
我最终想出了一个解决方案(花了我一段时间,因为我试图用 Android 实现它)仅依赖于这三件事。这些工具将使用 nl80211
驱动程序与伪硬件通信。
我的简单配置文件如下所示:
hostapd.conf(注意,这个文件的设置比要求的多,但我在这里发布了我的所有设置)
interface=wlan1
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ctrl_interface_group=0
ssid=Vamonos Pest
country_code=US
hw_mode=g
channel=1
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=2347
fragm_threshold=2346
macaddr_acl=0
auth_algs=3
ignore_broadcast_ssid=0
wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
eapol_key_index_workaround=0
eap_server=0
own_ip_addr=127.0.0.1
wpa_supplicant.conf
network={
ssid="Vamonos Pest"
key_mgmt=NONE
priority=16
}
终于推出了两款:
hostapd -d hostapd.conf
wpa_supplicant -Dnl80211 -iwlan0 -d -csupplicant.conf
成功了。 wpa_supplicant
能够扫描网络区域并找到所有虚拟 wifi 接入点。如果 hwsim 模块使用两个以上的无线电,则可以创建更多无线电。从这里开始,剩下的就很简单了——在 wlan1 上启动 dhcp 服务器,在 wlan0 上启动 dhcp 客户端,你就完成了。