思路:目前國內的隨身wifi基本上都是用的Ralink芯片的USB無線網卡而已,只不過很多無線網卡芯片不支持master模式,所以不能兼做ap,而Ralink出的幾款芯片都是支持master模式的,在Linux下就可以通過hostapd這個軟件包+iptables(NAT)+dhcpd(給設備動態分配IP)設置使手機等設備共享電腦上的有線連接實現上網。
經查,小米wifi用的應該是mediatek(也就是以前的Ralink)的7601芯片。ArchLinuxer最喜歡做的一件事,先在AUR里搜搜看:
yaourt -Ss 7601 
        結果如下
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'這個現成的包,直接開裝!
$ 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...(抱歉昨天剛裝的新電腦,系統也是新的)。 趕緊裝上!
$ yaourt -S linux-headers
之后就沒有問題了,yaourt -S mt7601u-ap-dkms順利安裝並成功自動編譯成功內核模塊,注意后面的提示:
>>> 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一下:
# modprobe rtutil7601Uap # modprobe mt7601Uap # modprobe rtnet7601Uap
同樣按照給出的提示,編輯/etc/Wireless/RT2870AP/RT2870AP.dat,把里面SSID(名稱)和WPAPSK(密碼)改成你自己的內容:
... SSID=RA_11_AP #AP對外顯示的名稱 ... WPAPSK=Chang_Me_Now #密碼 ...
好!有了驅動,咱就可以安裝需要的軟件了:
$ yaourt -S hostapd
之后要寫入這個文件,指定SSID名稱和密碼以及小米wifi的設備名(ra0):/etc/hostapd/hostapd.conf
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的源碼,可以下載下來后直接編譯運行,似乎簡單些。但我只編譯了沒運行,不確定能不能直接用。
2、Arch Wiki: Software access point
