让无线网卡同时工作在 AP 和 STA 模式
这个帖子里的方法有点过时了,不推荐继续使用。
有的时候会碰到这么一种情况,带着电脑和手机出去蹭网,无奈只有一个账号,手机上了电脑就没得用了,电脑用了手机就上不了网。如果能用电脑连接 Wifi 然后再开热点给手机用该多好。一般情况下,每台笔记本里面只有一张无线网卡,按照常规的思路要一边作为 STA 连接在别的热点上,一边又要做 AP 给手机用的话似乎就非得再买一张 USB 的无线网卡了。不过现在有一种方法可以让一张无线网卡同时处于 STA 和 AP 的状态,一边作为客户端连在别的 AP 上,一边又自己作为 AP 让别的客户端来连接。
这种特殊的“一卡两用”的状态需要 WDS 的支持。WDS 是一个复杂的东西,现在只讲特定情况下的应用。一般来讲,采用 ath9k 驱动的无线网卡都是支持 WDS 的(其它基于 mac80211 的驱动不详,不过值得一试)。另外,为了能使用 WDS ,还要求 hostapd 的版本在 0.7.x 以上。
下面是一个小脚本,它将在 wlan0 上启动一个 AP ,同时生成一个新的接口 wds0 ,可供 NetworkManager 直接作为 STA 使用。
#!/bin/sh
WIFI=wlan0 # NOTE 1
PHY=phy0 # NOTE 2
WAN=wds0 # NOTE 3 # Extra NAT Module
modprobe nf_nat_pptp
modprobe nf_nat_ftp
# NOTE 4 # Config Wireless
ifconfig $WIFI up
ifconfig $WIFI 172.16.1.1/24
ifconfig $WIFI mtu 1500 # Configure dnsmasq
cat > /etc/dnsmasq.conf << EOF
dhcp-range=172.16.1.100,172.16.1.150,255.255.255.0,24h
port=0
dhcp-option=option:dns-server,8.8.8.8,8.8.4.4
interface=$WIFI
EOF
# NOTE 5 # DHCP server
service dnsmasq stop
service dnsmasq start # AP and WDS STA
hostapd -B ./hostapd-wds.conf
iw phy $PHY interface add $WAN type wds
ifconfig $WAN hw ether b4:82:fe:54:c8:3e # NOTE 6
ifconfig $WAN up # Enable IPv4 Forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P FORWARD ACCEPT # NAT with iptables
iptables -t nat -A POSTROUTING -o $WAN -s 172.16.1.1/24 -j MASQUERADE
NOTES:
- wlan0 是无线网卡默认的接口名称。使用时请根据实际情况设定。对于使用基于 mac80211 架构驱动的网卡,其接口名一般是 wlanx ,系统中的第一张网卡一般是 wlan0 。稍后这个接口会被作为 AP 使用;
- 这是对应的无线网卡的 PHY 的名称,一般为 phy0 ,可以这样找出:先 lspci 找出无线网卡的 PCI 地址,然后 ls /sys/bus/pci/devices/[对应的完整 PCI 地址]/ieee80211 即可找出;
- 期望的 WDS STA 接口名称,完全依个人喜好填写,不要和已有的接口冲突即可;
- 加载这些额外的 module 是为了保证在 NAT 后面的 PPTP 客户端和 FTP 服务器能正常工作;
- dnsmasq 的配置请参考 http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq.conf.example ,本例中 dnsmasq 只做 DHCP 服务器,IP 地址范围 172.16.1.100 – 172.16.1.150 ,租期 24 小时,DNS 服务器默认为 8.8.8.8 和 8.8.4.4 ;
- 这里的 MAC 地址也是按照个人喜好设定的,不过不要和系统已有的任何网卡地址相同(包括无线网卡的 AP 接口)。
有关的 hostapd-wds.conf 的内容如下,请放置在该脚本的工作目录下:
auth_algs=1
beacon_int=300
channel=6 # NOTE 1
country_code=CN
ctrl_interface_group=adm
ctrl_interface=/var/run/hostapd
driver=nl80211 # NOTE 2
dtim_period=2
dump_file=/tmp/hostapd.dump
eapol_key_index_workaround=0
eap_server=0
fragm_threshold=2346
hw_mode=g #NOTE 3
ieee80211d=1
ieee80211n=1 #NOTE 4
ignore_broadcast_ssid=0
interface=wlan0 #NOTE 5
logger_stdout=-1
logger_stdout_level=2
logger_syslog=-1
logger_syslog_level=2
macaddr_acl=0
max_num_sta=16
own_ip_addr=127.0.0.1
preamble=1
rsn_pairwise=CCMP
rts_threshold=2347
ssid=dword-relay # NOTE 6
wds_sta=1
wmm_ac_be_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmax=10
wmm_ac_be_cwmin=4
wmm_ac_be_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_bk_aifs=7
wmm_ac_bk_cwmax=10
wmm_ac_bk_cwmin=4
wmm_ac_bk_txop_limit=0
wmm_ac_vi_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmax=4
wmm_ac_vi_cwmin=3
wmm_ac_vi_txop_limit=94
wmm_ac_vo_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_cwmin=2
wmm_ac_vo_txop_limit=47
wmm_enabled=1
wpa=2
wpa_gmk_rekey=7200
wpa_group_rekey=1200
wpa_passphrase=qwertyuiop #NOTE 7
wpa_ptk_rekey=600
wpa_strict_rekey=1
wps_state=0
NOTES:
- 在这里设置新生成的 AP 的信道,最好和 STA 界面要连接的 AP 的信道保持一致;
- 驱动视网卡而定,如果网卡的驱动是 ath9k 这样基于 mac80211 的驱动的话,这里选 nl80211 就可以了;
- 模式有 a/b/g 可选,视网卡的情况和需求而定;
- 是否打开 802.11n ,视网卡的情况和需求而定;
- 网卡 AP 界面名称;
- 新 AP 的 ESSID ;
- 新 AP 的 WPA2 密码句;
- 其余关于 hostapd 的配置可参考:http://hostap.epitest.fi/gitweb/gitweb.cgi?p=hostap-07.git;a=blob_plain;f=hostapd/hostapd.conf;hb=HEAD ;
- 关键是把 wds_sta 设置为“ 1 ”。
最后,sudo 执行脚本,然后通过 NetworkManager 让 wds0 (或者其他你设置的名字)连接上一个热点,即可一边蹭网一边共享热点了。
有图有真相:
参考:
- http://en.wikipedia.org/wiki/Wireless_distribution_system
- http://www.tummy.com/journals/entries/jafo_20041220_000528 (适用于老机器上过时的 madwifi 驱动)
- http://wireless.kernel.org/en/users/Documentation/iw#Setting_up_a_WDS_peer
让无线网卡同时工作在 AP 和 STA 模式的更多相关文章
- WIFI模块AP和STA模式分别是什么意思
无线AP(Access Point):即无线接入点,它用于无线网络的无线交换机,也是无线网络的核心.无线AP是移动计算机用户进入有线网络的接入点,主要用于宽带家庭.大楼内部以及园区内部,可以覆盖几十米 ...
- 基于H7的串口WIFI模块ESP8266的TCP客户端例子和操作说明(AP兼STA模式)
说明: 1.如果不熟悉网络的话,等我这几天更新V7用户手册的ESP8266章节,如果熟悉的话,直接操作即可,这里将操作说明发出来. 2.串口WIFI是采用的AT指令操作,简单易用,指令手册在这个帖子里 ...
- WIFI的AP/Sta模式简单介绍
AP模式: Access Point,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式下.AP和AP之间允许相互连接 Sta模式: Station, 类似于无线终 ...
- 使用wifi网卡笔记3---工具wpa_supplicant(STA模式)
1. wpa_supplicant介绍 supplicant是恳求者的意思,是wpa的发起者,是发送认证请求的设备(手机),手机--AP--认证服务器,可用于上述4种"认证/加密" ...
- CC3200作为STA模式连接路由器sl_WlanConnect出现exception occured at:0xa72fcf6
1. 先看下出错的提示 2. 出错的代码部分,现在问题是定位不到哪一行代码出问题,反正运行一段时间就进入了 lRetVal = sl_WlanConnect((signed , &secPar ...
- 选择目录,选择文件夹的COM组件问题。在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。
异常: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 只有将调试器附加到该进程才会引发此异常. ...
- Spark基本工作流程及YARN cluster模式原理(读书笔记)
Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式 转载自:http://blog.163.com/smhily_min/blog/static/75206226201092011 ...
- c# Clipboard.SetDataObject(bmp1) 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常
c# Clipboard.SetDataObject(bmp1) 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttri ...
随机推荐
- 决定如何开发你的WordPress主题框架
在本系列教程的第一部分,我介绍了不同类型的主题框架并解释了它们是如何工作的. 在你开始建立你的主题框架之前,你需要考虑它是如何工作的,以及它将会被用来做什么,这样你才能从一开始就找到最合适的开发途径. ...
- Vieta定理
一元$n$次方程$$P(x)=a_{n}x^{n}+a_{n-1}x^{n-1}+\cdots+a_{a}x+a_{0}=a_{n}(x-x_{1})(x-x_{2})\cdots (x-x_{n}) ...
- Ehcache(03)——Ehcache中储存缓存的方式
http://haohaoxuexi.iteye.com/blog/2114769 Ehcache中储存缓存的方式 目录 1 堆内存(MemoryStore) 1.1 指定可用内存 1 ...
- php 处理高并发的思路
1.nginx 服务器,提高网站服务器并发性能 2.控制大文件的下载,减少CPU的消耗. 3.对于sql查询做缓存. 4.静态页面文件缓存. 5.CND缓存静态文件, 6.反向代理到多个服务器,用来分 ...
- 算法效果AB测试中的PV-UV不对称性
(转载请注明原创于潘多拉盒子) 算法效果的AB测试,是指在相同的应用场景下,对比不同算法的效果.通常的做法是,按照PV或UV随机分配流量到算法上,计算算法的CTR或转化率进行对比.为了表述简单,我们假 ...
- 极限编程(XP)基本原则与规范
1. 坐在一起(Sitting Together) 尽可能让团队成员坐在一起,Kent Block在一次芝加哥的某个濒临困境的项目中发现,虽然这个团队都是由程序 精英组成,但是却陷入困境,后来他发现, ...
- 禁止Android的StatusBar下拉
Android中有许多隐藏的Service,StatusBarManager就是其中一个,在Context.java中可以看到: /** * Use with {@link #getSystemSer ...
- android开发之Fragment加载到一个Activity中
Fragments 是android3.0以后添加的.主要是为了方便android平板端的开发.方便适应不同大小的屏幕.此代码是为了最简单的Fragment的使用,往一个Activity中添加Frag ...
- 让你的PHP程序真正的实现多线程(PHP多线程类)(转)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- 详解C/C++函数指针声明 ( *( void(*)())0)();
( *( void(*)())0)(); float *pf; 这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针. float *g() , (*h)(); 表示*g()与( ...