|
|
前段时间需要在嵌入式板子上实现 wifi 的 repeater 模式,同一个无线网卡既做 AP 又做 client。下面介绍一下如何实现:
1. 确认网卡是否支持 AP 模式
iw list 命令将输出 AP 是否支持 AP 模式
Supported interface modes:
IBSS
managed
AP
AP/VLAN
monitor
如果输出的 supported interface modes 中有 AP,说明此网卡支持 AP 模式。如果没有,接下来的工作就不需要做了。
2. 将无线网卡分成两个虚拟网卡
如果一个系统有两个无线网卡,暂且命名为 wlan0 和 wlan1. 如果想让这个设备既可以做 AP,又可以连接外网。做法应该是这样的,将 wlan0 作为client,连接一个路由器;将 wlan1 作 AP,产生一个热点,其他设备来连接这个热点。然后再将 wlan0 和 wlan1 桥接或者 NAT 方式打通。这样连接在 AP 上的设备就可以上网了。
同理,如果(只有)一个网卡,也可以这么做,通过 iw 命令可以实现:
#!/usr/rootdirs/bin/bash
ifconfig wlan0 down
sleep 1
iw dev wlan0 interface add wlan0_sta type managed addr 04:f0:21:35:d7:24
sleep 1
iw dev wlan0 interface add wlan0_ap type managed addr 12:34:56:78:ab:ce
3. 用其中一个网卡连接外部路由
通过 命令 wpa_supplicant -B -Dnl80211 -i wlan0_sta -c wpa_supplicant.conf
wpa_supplicant.conf 文件是需要连接到路由的配置信息,如 SSID,password 等,这里就不贴出来了。
当上面的命令执行成功,即 wlan0_sta 连接到了外部路由器,需要将此时的 channel 获取到。为什么呢?因为用同一个无线网卡虚拟出来的两个无线网卡,如要实现 repeater 模式,必须在同一个 channel 上,而且必须和外部路由处于同一个 channel 上。所以接下来的 wlan0_ap 的 channel 就要以现在获取的为准。如何获取通道,执行如下命令:
iw dev wlan0_sta info | grep channel | awk '{print $2}'
4. 用剩下的那个网卡启动 AP 模式
根据步骤 3 的 channel 设置 hostapd.conf 文件,然后执行:
hostapd -B hostapd.conf
5. 将 wlan0_sta 和 wlan0_ap 关联起来
iptables -t nat -A POSTROUTING -o wlan0_sta -j MASQUERADE
iptables -A FORWARD -i wlan0_sta -o wlan0_ap -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0_ap -o wlan0_sta -j ACCEPT
【转贴者注】由于使用了 iptables, 因此,可能需要设置 /proc/sys/net/ipv4/ip_forward 为 1 才行.
|
|