Linux机器可以使用单个物理WLAN接口同时充当无线客户端和接入点吗?


12

如果我只有1个物理WLAN接口,是否可以做一些黑客操作,使其既可以成为现有接入点的客户端,又可以充当其他客户端的接入点?

我有一个现有的802.11g ADSL路由器,并且我将要构建一个具有802.11n的HTPC。我的笔记本电脑也具有802.11n,但目前只能以54Mbps的速度连接,因为那是AP所支持的。我希望能够使HTPC成为我的ADSL路由器的客户端,但是让我的笔记本电脑成为HTPC的客户端,因此将文件复制到它的速度更快。

可能?

编辑:很明显,我可以使用以太网将HTPC连接到ADSL路由器,并禁用路由器上的wifi,但是让我们忽略该选项。:-)

Answers:


9

我以前没有亲自做过,但是这里有一些信息可以帮助您朝正确的方向前进。

从协议的角度来看,绝对有可能让单个无线电同时充当AP和客户端STA。如果您要创建的AP和您作为客户端加入的AP在同一频道上,则效果最佳(或几乎是强制性的)。让无线电卡必须保持将频道切换到服务请求,这是丢帧和糟糕性能的秘诀。

从软件角度来看,这已成为可能。Linux上的多个802.11卡驱动程序支持VAP(虚拟AP)的概念,该概念允许单个卡同时充当多个AP(多个SSID,甚至BSSID)。与直觉相反,术语VAP表示同一802.11卡上的任何类型的虚拟接口,无论该虚拟接口是否处于AP模式。因此,在这些卡/驱动程序组合上,您可以创建两个VAP-STA模式VAP

用于基于Atheros的卡的MadWifi驱动程序是一种支持VAP的驱动程序。如果您的802.11卡使用Atheros芯片组,并且安装了正确版本的MadWifi驱动程序,则可以将卡配置为同时STA + AP模式,如下所示:

wlanconfig ath0 create wlandev wifi0 wlanmode sta
wlanconfig ath1 create wlandev wifi0 wlanmode ap

请注意,这些并不是有关设置所有内容的完整说明,而只是一种使您入门的尝试。

您可能需要向Google购买“ wifi vap ”之类的详细信息。我从这里复制了以上命令。

哦,还有一个神话破灭:Atheros卡在消费类计算机中并不罕见。它们是Broadcom,Marvell,Intel和Ralink等802.11芯片组的主要参与者。仅仅因为我使用了MadWifi / Atheros的示例,并不意味着没有其他主要竞争对手的芯片可以使用类似功能的Linux驱动程序。另外,802.11s中是不是需要这个。说您必须执行802.11s就像说您必须支持生成树协议一样,只是要将帧从一个接口转发到另一个接口。


看来我所获得的主板确实具有Atheros芯片组,所以我可能很幸运。我正在等待交付组件,然后可以进行构建和测试。
ThatGraemeGuy 2010年

我还没有机会和MadWifi一起玩。我接受,因为答案是正确的,似乎没有其他芯片组/家族可以提供此功能。
ThatGraemeGuy 2010年

Spiff,我正在使用Atheros芯片和madwifi,正在尝试在sta中建立一个VAP,在ap中建立一个VAP。我可以在ap模式下设置多个VAP,但是当我在sta中设置第一个VAP,然后尝试在ap中设置另一个VAP时,出现wlanconfig:ioctl:输入/输出错误。您对如何处理有任何想法吗?
sachinr 2013年

1
@sachinr作为一个问题来提问,这样每个人都可以看到,而不仅仅是对一个已有三年历史的对他人问题的答案的评论。
Spiff 2013年

嘿,我在这里添加了我的问题-superuser.com/questions/649742/…。你可以看看吗?谢谢:)
sachinr

4

nl80211驱动程序具有一种称为“托管”接口模式的东西。您可以使用“ iw”实用程序对其进行配置,如下所示:

iw phy phy0接口添加托管的wlan1类型

有关更多信息,请访问https://wireless.wiki.kernel.org/en/users/documentation/iw。Phy0指的是您在/ sys / class / ieee80211 /中看到的内容。

我还看到rPI3做了类似的事情,但是具有更暗的“ __ap”界面模式。这样,用户可以创建仅在AP模式下运行的第二个接口,并将初始接口用作客户端模式。

无论您以何种方式实现它(驱动程序显然必须支持它),都将需要两个接口(来自同一物理设备)。一个接口可以简单地将wpa_supplicant作为客户端模式运行,另一个接口(AP模式)通常使用hostapd播放访问点。

[编辑:]

iw工具的源代码使有关__ap的阴暗模式更加清楚:

..
} else if (strcmp(tpstr, "__ap") == 0) {
    *type = NL80211_IFTYPE_AP;
    return 0;
} else if (strcmp(tpstr, "__ap_vlan") == 0) {
    *type = NL80211_IFTYPE_AP_VLAN;
    return 0;
} else if (strcmp(tpstr, "wds") == 0) {
    *type = NL80211_IFTYPE_WDS;
    return 0;
} else if (strcmp(tpstr, "managed") == 0 ||
       strcmp(tpstr, "mgd") == 0 ||
       strcmp(tpstr, "station") == 0) {
    *type = NL80211_IFTYPE_STATION;
    return 0;
} 
..

__ap模式转换为网络链接类型NL80211_IFTYPE_AP。我也对此进行了测试,并且效果很好。奇怪的是,内核文档维基没有提及它。


4

来源和更多信息:

https://wiki.archlinux.org/index.php/Software_access_point

简短答案

sudo iw dev wlan0 interface add wlan0_ap type managed
sudo create_ap wlan0_ap wlan0 createap mypassword

Wi-Fi设备必须支持AP模式

您需要兼容nl80211的无线设备,该设备支持AP操作模式。可以通过运行iw list命令来验证这一点,在“支持的接口模式”块下应列出AP:

...
    Supported interface modes:
         * IBSS
         * managed
         * AP
         * AP/VLAN
         * WDS
         * monitor
         * mesh point
...

带有单个Wi-Fi设备的无线客户端和软件AP

创建软件AP独立于您自己的网络连接(以太网,无线等)。许多无线设备甚至支持同时作为AP和作为无线“客户端”同时运行。使用该功能,您可以使用单个无线设备来创建充当现有网络的“无线转发器”的软件AP。iw list的输出的以下部分列出了该功能:

有效的接口组合:

$ iw list
...
valid interface combinations:
     * #{ managed } <= 1, #{ AP, P2P-client, P2P-GO } <= 1, #{ P2P-device } <= 1,
       total <= 3, #channels <= 2
...

约束#channels <= 1表示您的软件AP必须在与Wi-Fi客户端连接相同的信道上运行;请参阅下面的hostapd.conf中的频道设置。

如果您想使用功能/特性,可能是因为以太网连接不可用,您需要创建两个单独的虚拟接口来使用它。可以如下创建物理设备wlan0的虚拟接口:为网络连接本身(wlan0_sta)和软件AP / hostapd“无线转发器”创建具有唯一MAC地址的虚拟接口:

# iw dev wlan0 interface add wlan0_sta type managed 
# iw dev wlan0 interface add wlan0_ap  type managed

组态

设置访问点包括两个主要部分:

  1. 设置Wi-Fi链路层,以便无线客户端可以关联到计算机的软件访问点并与其交换IP数据包。
  2. 在您的计算机上设置网络配置,以使其在其自己的Internet连接和无线客户端之间正确中继IP数据包。

工具类

create_ap

create_ap软件包提供了一个脚本,该脚本可以创建桥接或NATed访问点以进行Internet共享。它结合了hostapd,dnsmasq和iptables,以实现访问点的良好功能。创建NATed虚拟网络的基本语法如下:

# create_ap wlan0 eth0 MyAccessPoint MyPassPhrase

好答案,谢谢!
伊曼·阿克巴里

我认为这是一个很好的答案,尤其是有关渠道约束的问题
crazystick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.