虚拟WiFi / 802.11接口类似于Linux上的VETH。

8

我正在寻找一种在单个设备上设置纯虚拟(即没有实际信号)802.11网络的方法 - 用于测试目的,以一种可以给我类似以下功能的方式:

  • 创建多个访问点接口(例如ap0ap1 ...)
    • 设置它们的基本参数(ssid等)
    • 在每个接口上设置dhcp服务器,
    • 使用shell命令(iw?)管理它们的信号强度
    • 允许加密管理(更改密码、加密方法等)
  • 创建单个访问点客户端接口(wifi0),该接口将
    • 看到特定的访问点(或所有访问点)
    • 允许我使用诸如NetworkManager之类的工具连接到特定的接口

实际上,这非常基础,看到veth驱动程序与ip link的工作原理给了我很多希望。

是否可能使用iw工具进行此操作?如果是,则如何实现?

如果不行,如果我需要实现这一点,我通常会如何追求这个问题?通过创建虚拟的wpa_supplicant驱动程序来提供数据吗?

我会非常感激有关这个问题的任何提示和指示。

2个回答

9

我尝试按照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 客户端,然后你就完成了。


0

我无法回答你所有的问题,但我可以给你一些提示。

你可以使用 iw 命令创建一个虚拟网络接口,但要小心,因为你的 wifi 网卡驱动程序可能会受到制造商的限制。

尝试使用类似以下命令(在选择正确的 "phy" 之前)检查“有效接口组合”:

iw phy phy0 info

检查接口的最大数量和这些接口的组合。

我不确定,但可能你可以直接使用wpa_supplicant创建虚拟接口(就像这个软件为Wi-Fi Direct所做的那样)。 如果你需要关于wpa_supplicant的帮助,我建议你参考这个邮件列表:http://lists.shmoo.com/pipermail/hostap/

还有一个小例子。我用Android和wpa_supplicant的Nexus 5进行了编译,结果是:

> 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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接