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

我正在寻找一种方法来在单个设备上设置纯粹的虚拟(即没有实际信号)802.11networking – 为了testing目的,可以给我类似的function:

  • 创build多个接入点接口(比如ap0ap1 ..)
    • 设置其基本参数( ssid …)
    • 在每一个上设置DHCP服务器,
    • 用shell命令pipe理信号强度( iw ?)
    • 允许密码pipe理(更改密码,encryption方法等)
  • 创build单一的接入点客户端接口( wifi0 ),这将
    • 看具体的接入点(或全部)
    • 允许我通过NetworkManager等工具连接到特定的界面

实际上,这是非常基本的,看看驱动程序如何与ip link给了我很多希望。

用iw工具可以吗? 如果是的话 – 我该怎么做?

如果没有,如果我需要实施这个,我通常会如何处理这个问题? 通过创build一个假的wpa_supplicant驱动程序来提供数据?

我很感激在这个问题上的任何提示和指针。

我试图按照Stefano Cappa发布的提示而不幸运。 我的界面一致地报告No valid interface combinations ,暗示我应该卡住(但不是)。

虚拟WIFI可以借助于

  • mac80211_hwsim内核模块
    • 模块可以用指示虚拟物理卡号( phy# )的radios参数进行配置。
    • 每个phy#可以模拟一个独立的无线电卡。
    • 每个phy#卡都有一个关联的lan接口( wlan# )。
    • 模块还带有一个hwsim#接口,可以用来窥探所有无线电卡之间发生的伪无线业务。
  • 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客户端,就完成了。

我不能回答你所有的问题,但我可以给你一个提示。

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

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

 iw phy phy0 info 

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

我不确定,但可能你可以直接用wpa_supplicant创建一个虚拟接口(就像这个软件可以直接使用wi-fi一样)。 如果你需要关于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的电脑,接口的数量可能会更多。 这是一个司机有限的智能手机。

最后要小心,因为正如wpa_supplicant的创建者向我解释的那样,如果你想要一个支持802.11的完整版本,你应该选择正确的类型,例如,使用驱动程序nl80211,而不是使用ipv6的macvtap。