思路:目前国内的随身wifi基本上都是用的Ralink芯片的USB无线网卡而已,只不过不少无线网卡芯片不支持master模式,因此不能兼作ap,而Ralink出的几款芯片都是支持master模式的,在Linux下就能够经过hostapd这个软件包+iptables(NAT)+dhcpd(给设备动态分配IP)设置使手机等设备共享电脑上的有线链接实现上网。php
经查,小米wifi用的应该是mediatek(也就是之前的Ralink)的7601芯片。ArchLinuxer最喜欢作的一件事,先在AUR里搜搜看:linux
yaourt -Ss 7601
结果以下git
aur/dkms-mt7601u v3.0.0.4-1 (2) Driver for Ralink MT7601U chipset wireless adaptors aur/dkms-mt7601u-latest v3.0.0.4-5 (4) Driver for Ralink MT7601U chipset wireless adaptors aur/mt7601u-ap-dkms 3.0.0.3-1 [installed] (1) Kernel module for Ralink MT7601U chipset wireless adaptors with Access Point (AP / Master) support. aur/mt7601u-dkms 3.1-1 (1) Kernel module for MediaTek MT7601U USB dongles, written from scratch based on the vendor GPL-driver. Unlike the vendor driver this driver uses modern Linux WiFi infrastructure and should work flawlessly with NetworkManager, wicd, wpa_supplicant and such. aur/mt7601u-git 2015.04.30-1 (3) Driver for Mediatek MT7601U USB bgn WiFi dongle aur/test_mt7601u 0.1-2 (0) Test if mt7601u (wifi) is loaded. If not, it install it
心中窃喜呀!竟然有'mt7601u-ap-dkms'这个现成的包,直接开装!less
$ yaourt -S mt7601u-ap-dkms #此处省略一万字。。。 :: 进行安装吗? [Y/n] (1/1) 正在检查密钥环里的密钥 [######################] 100% (1/1) 正在检查软件包完整性 [######################] 100% (1/1) 正在加载软件包文件 [######################] 100% (1/1) 正在检查文件冲突 [######################] 100% (1/1) 正在检查可用硬盘空间 [######################] 100% (1/1) 正在安装 mt7601u-ap-dkms [######################] 100% Creating symlink /var/lib/dkms/mt7601u-ap/3.0.0.3/source -> /usr/src/mt7601u-ap-3.0.0.3 DKMS: add completed. Error! echo Your kernel headers for kernel 4.0.1-1-ARCH cannot be found at /usr/lib/modules/4.0.1-1-ARCH/build or /usr/lib/modules/4.0.1-1-ARCH/source. >>> You might need to modprobe mt7601Uap manually. >>> Also, you *must* change the default values (especially WPAPSK) >>> in /etc/Wireless/RT2870AP/RT2870AP.dat >>> Read the documentation in /usr/src/mt7601u-ap-3.0.0.3/doc.
WTF! 个人机器上居然没有linux header...(抱歉昨天刚装的新电脑,系统也是新的)。 赶忙装上!dom
$ yaourt -S linux-headers
以后就没有问题了,yaourt -S mt7601u-ap-dkms顺利安装并成功自动编译成功内核模块,注意后面的提示:ui
>>> You might need to modprobe mt7601Uap manually. >>> Also, you *must* change the default values (especially WPAPSK) >>> in /etc/Wireless/RT2870AP/RT2870AP.dat >>> Read the documentation in /usr/src/mt7601u-ap-3.0.0.3/doc.
嗯,按照给出的提示,先把新编译好的内核模块modprobe一下:this
# modprobe rtutil7601Uap # modprobe mt7601Uap # modprobe rtnet7601Uap
一样按照给出的提示,编辑/etc/Wireless/RT2870AP/RT2870AP.dat,把里面SSID(名称)和WPAPSK(密码)改为你本身的内容:spa
... SSID=RA_11_AP #AP对外显示的名称 ... WPAPSK=Chang_Me_Now #密码 ...
好!有了驱动,咱就能够安装须要的软件了:.net
$ yaourt -S hostapd
以后要写入这个文件,指定SSID名称和密码以及小米wifi的设备名(ra0):/etc/hostapd/hostapd.confcode
ssid=xiaomi_WIFI #设置AP接入点名称 wpa_passphrase=Somepassphrase #设置你的WIFI密码 interface=ra0 #小米随身wifi插入电脑后默认的interface名称就是ra0 bridge=br0 auth_algs=3 channel=7 driver=nl80211 hw_mode=g logger_stdout=-1 logger_stdout_level=2 max_num_sta=5 rsn_pairwise=CCMP wpa=2 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP CCMP
顺便说一下,在mt7601u-ap-dkms这个包里设置过一次SSID和密码了,在hostapd里也有一个设置SSID和密码的地方。我不知道到底哪一个才是真正管用的,因此两个地方都设成同样的了,省得麻烦。
为了NAT,须要软件包’iptables',多数发行版默认应该已经装好了。为了给联网的设备分配动态IP,须要软件包dhcp并作必定的配置:
yaourt -S iptables dhcp sudo mv /etc/dhcpd.conf /etc/dhcpd.conf.example #主要是默认的配置文件比较烦,咱们先把它备份一下,再本身建立一个 sudo vi /etc/dhcpd.conf
在/etc/dhcpd.conf中输入如下内容:
option domain-name-servers 114.114.114.114, 8.8.8.8; option subnet-mask 255.255.255.0; option routers 192.168.123.100; subnet 192.168.123.0 netmask 255.255.255.0 { range 192.168.123.150 192.168.123.250; }
默认状况下,dhcpd会对电脑上全部网卡都起做用,而咱们但愿它只做用于小米wifi,故能够借助systemctl让它成为只针对ra0这个interface的service。先要建立一个systemctl用的配置文件:
sudo vi /etc/systemd/system/dhcpd4@.service
输入如下内容:
[Unit] Description=IPv4 DHCP server on %I Wants=network.target After=network.target [Service] Type=forking PIDFile=/run/dhcpd4.pid ExecStart=/usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid %I KillSignal=SIGINT [Install] WantedBy=multi-user.target
准备好dhcpd后,就能够编辑脚本了:
vi ~/bin/ap.sh
输入如下内容:
#!/bin/sh #modprobe kernel modules for xiaomi Wireless card modprobe rtutil7601Uap modprobe mt7601Uap modprobe rtnet7601Uap #Set Static IP address on interface ra0 ip link set up dev ra0 ip addr add 192.168.123.100/24 dev ra0 #enable packet forwarding sysctl net.ipv4.ip_forward=1 #enable NAT iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i ra0 -o internet0 -j ACCEPT
#enable dhcpd
systemctl start dhcpd4@ra0
#enable hostapd
systemctl start hostapd
保存之后,设置其为可执行文件,再sudo运行,大功告成!
chmod 755 ~/bin/ap.sh sudo ~/bin/ap.sh
之后只要想用小米WIFI共享上网,只要sudo运行一遍这个脚本就行啦!
参考资料:
本文是受上面说的这篇文章的启发,我本身对照Arch Wiki设置好的,这样对整个设置的内部运行机制了解得深一些。那篇文章里提供了Github的源码,能够下载下来后直接编译运行,彷佛简单些。但我只编译了没运行,不肯定能不能直接用。