Linux中使用hostapd創建無線AP及相關問題的處理方法
原創【51CTO專稿】無線AP可以為傳統的有線局域網提供無線擴展接入,而一般的無線網卡只能作為客戶端連接到無線AP。目前市面上很多無線網卡都具有模擬AP功能,不單可以作為無線客戶端連接上無線網絡,也可以切換為模擬AP,供其他無線客戶端連接。而筆記本上的模擬AP其典型應用場景如下:在沒有無線路由器的情況下,電腦通過有線連接到寬帶線路已經可以上網。電腦上安裝具有模擬AP功能的無線網卡,并設置共享可以訪問有線網絡的網絡連接,模擬AP與可以訪問有線網絡的網絡連接就虛擬出一個"無線路由器"。
隨著個人越來越多的其他的無線設備如手機、PAD以及很多類似平板設備的普及,我們發現很多時候我們的外出等特殊情況下讓我們的其他設備接入有線網絡已經成為了一個現實問題,那么我們可以充分發揮我們的隨身筆記本的功能,將其通過軟件設置成為模擬AP,這樣就可以解決很多特殊情況下其他設備上網的問題了,如果您是一位WINDONS的用戶,那么在win7下面用"承載網絡"這一功能來模擬AP。當然,在LINUX系統下我們也可以通過軟件配置來實現這樣的功能。下面筆者將以FEDORA18下使用無線AP功能為例,講述在LINUX系統下實現自定義無線AP的過程及升級帶來的問題及解決辦法。
一、實驗環境:
- 操作系統:FEDORA18
- 內核版本:3.11.4-101.fc18.i686.PAE
- 無線網卡型號:tp-link TL-WN310G
二、無線AP創建過程:
1、在終端下分別使用命令yum install hostapd、yum install dnsmasq安裝hostapd及dnsmasq軟件組件包。其中hostapd 是 Host Access Point 守護進程,提供對基于 Linux 的無線接入點的強 WPA2 加密和身份驗證。配置 hostapd 非常簡單,它支持 WPA2-Personal 和 Enterprise,提供了對 WPA2-Personal 的獨特修改,可讓管理它變得更復雜或更簡單,隨后我們可以通過/etc/hostapd/hostapd.conf配置文件詳細的配置hostapd的各種參數,讓其將無線網卡模擬成為無線AP。而Dnsmasq 提供 DNS 緩存和 DHCP 服務功能。作為域名解析服務器(DNS),dnsmasq可以通過緩存 DNS 請求來提高對訪問過的網址的連接速度。作為DHCP 服務器,dnsmasq 可以為局域網電腦提供內網ip地址和路由。DNS和DHCP兩個功能可以同時或分別單獨實現。dnsmasq輕量且易配置,適用于個人用戶或少于50臺主機的網絡,我們將通過它來為我們接入后的客戶端設備提供DHCP以及DNS服務。這樣客戶端就可以通過無線模擬AP順利訪問網絡。
2、在系統中使用vi命令編輯hostapd配置文件/etc/hostapd/hostapd.conf(該在安裝hostapd軟件組件包時自動創建完成),內容如下:
- ctrl_interface=/var/run/hostapd
- ctrl_interface_group=wheel
- # Some usable default settings...
- macaddr_acl=0
- auth_algs=1
- ignore_broadcast_ssid=0
- # Uncomment these for base WPA & WPA2 support with a pre-shared key
- wpa=2
- wpa_key_mgmt=WPA-PSK
- wpa_pairwise=TKIP
- rsn_pairwise=CCMP
- # DO NOT FORGET TO SET A WPA PASSPHRASE!!
- wpa_passphrase=******
- # Most modern wireless drivers in the kernel need driver=nl80211
- #ieee80211n=1
- # Customize these for your local configuration...
- interface=wlan0
- hw_mode=g
- channel=7
- ssid=HOSTAP
- logger_stdout=-1
- logger_stdout_level=2
- max_num_sta=5
在該配置文件中SSID其實指的就是無線AP的訪問名,用戶可以隨意定義自己喜歡的名字。而wpa_passphrase等號后的字符其實就是無線AP的連接密碼,用戶同樣需要根據自己的需求進行修改。
3、在系統中使用vi命令編輯dnsmasq配置文件/etc/dnsmasq.conf,對如下行進行修改,內容如下:
- interface=wlan0
- listen-address=192.168.0.1
- #no-dhcp-interface=
- dhcp-range=192.168.0.50,192.168.0.150,12h
- dhcp-option=3,192.168.0.1
- dhcp-option=6,8.8.8.8
其中dhcp=ranage參數為dhcp地址范圍,即租借時間12小時,dhcp-option=3,192.168.0.1為客戶端配置網關,該地址其實就是模擬為無線AP無線網卡的IP地址。
dhcp-option=6,8.8.8.8為客戶端配置dns,用戶應該自己修改為外網的dns地址。
4、修改網絡設置,打開Linux主機網絡數據轉發功能,命令模式如下:
- echo 1 >/proc/sys/net/ipv4/ip_forward
5、設置無線接入點IP地址,命令模式如下:
- ifconfig wlan0 192.168.0.1 netmask 255.255.255.0
6、使用命令systemctl啟動hostapd及dnsmasq網絡服務,命令模式如下:
- systemctl start hostapd.service
- systemctl start dnsmasq.service
7、如果該linux系統開啟了防火墻需要使用iptables開啟數據轉發功能,命令模式如下:
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o em1 -j MASQUERADE
- iptables -A FORWARD -s 192.168.0.0/24 -o em1 -j ACCEPT
- iptables -A FORWARD -d 192.168.0.0/24 -m conntrack --ctstate ESTABLISHED, RELATED -i em1 -j ACCEPT
通過以上配置,在FEDORA18初次安裝后作為無線AP使用是沒有問題的。
三、問題及解決辦法
FEDORA18內核升級到3.11.4-101.fc18.i686.PAE后,啟動hostapd系統會報類似如下錯誤:
- nl80211: Failed to set interface wlan0 into AP mode
- nl80211 driver initialization failed.
導致LINUX系統無法創建模擬無線AP,終于用GOOGLE在:
- https://wiki.archlinux.org/index.php/Software_Access_Point#NetworkManager_is_interfering
帖子中找到了解決辦法。其實后來發現只需要將netmanager網絡管理器中無線網卡設置為"設備未托管"狀態,之后hostapd就可以正常啟動。
使用sed -i '/\[keyfile\]/a unmanaged-devices=mac:00:23:cd:10:3e:0b' /etc/NetworkManager/NetworkManager.conf;
在/etc/NetworkManager/NetworkManager.conf文件中的[keyfile]字段之后添加內容為:
unmanaged-devices=mac:00:23:cd:10:3e:0b的一行,其中"00:23:cd:10:3e:0b"為無線網卡MAC地址。這樣該網卡就已經不再受NetworkManager管理了,在NetworkManager管理器中無線網絡狀態將更改為“設備未托管”狀態。
使用sed -i '/^unmanaged-devices=mac:00:23:cd:10:3e:0b/d' /etc/NetworkManager/NetworkManager.conf命令,在文件中刪除 unmanaged-devices=mac:00:23:cd:10:3e:0b這一行內容,可將無線網絡重新托管在NetworkManager管理器中。
客戶端使用HOSTAPD無線AP時,網速不穩定,導致某些時刻無法打開網頁或者其它因為網絡超時導致的網絡不可訪問故障。
該問題主要是因為無線數據傳輸校驗中隨機種子數較少導致的無線網絡數據傳輸時延過大導致的,用戶可以通過命令cat /proc/sys/kernel/random/entropy_avail來查看具體數值,該值一般小于1000,用戶需要通過在終端中執行yum install haveged命令安裝隨機數生成器(haveged),并使用systemctl enable haveged.servce命令來啟動隨機數生成器(haveged)已提高entropy_avail數值。這樣無線網絡時延將恢復到正常狀態。網絡不在出現以上描述的問題。