以 notebook 上的無線網卡來當 ap ,讓其他行動裝置可以透過 notebook 上網
wireless ap 伺服器使用 hostapd 。
而自動配發 ip 的 dhcp server 使用 dnsmasq ,比較簡單設定。
步驟如下:
1. 設定 hostapd
2. 設定 dhcp server
3. 設定網路及 nat
4. 啟動
5. 以行動裝置連線測試
1. hostapd:
安裝 hostapd:
$ sudo pacman -S hostapd設定 hostapd:
$ sudo vi /etc/hostapd/hostapd.conf
interface=wlan0
ssid=天氣很好喲
hw_mode=g
channel=1
wpa=2
wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
只要注意以上這幾個選項,其他的可以暫時不用管,基本上 hostapd 可以很複雜,配合 radius server 可以讓使用者先連上,再開啟瀏覽器來做認證的方式,這裡不使用那種方式。
#1 - wpa only
#2 - wpa2 only
#3 - both
wpa=3
允許的話,直接用 wpa2 是最好的,若是某些行動裝置並不支援 wpa2,可以將 wpa 也打開或甚至是用 wep,不過,你知道的,鄰居也可以跟你一起用。
wep_default_key=0
wep_key0=123456789a
ssid 可以使用中文耶。這裡設定認證方式為 WPA2,而密碼可以用 wpa_psk 或 wpa_passphrase 來設定,建議以 wpa_psk 的方式,因為有編碼過,無法從設定檔裡直接看到。
wpa_passphrase=this is a passphrase
或
以 wpa_passphrase 指令來產生 wpa_psk,以 ssid 加上密碼產生出的一段文字
$ wpa_passphrase 天氣很好喲 123456789a
network={
ssid="天氣很好喲"
#psk="123456789a"
}
因此,取出 psk= 後面的這串文字放到設定檔中即可
wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
2. dhcp server 設定:
dhcp server 這裡是使用 dnsmasq,因為比較簡單,若要改用 isc dhcp server 當然也行,請自行設定。
安裝 dnsmasq:
$ sudo pacman -S dnsmasq
設定 dnsmasq:
$ grep -v -e ^# -e ^$ /etc/dnsmasq.conf
port=0
dhcp-option=6,168.95.192.1,168.95.1.1
interface=wlan0
listen-address=192.168.199.254
dhcp-range=192.168.199.101,192.168.199.150,12h
port=0
dns server listen 的埠,預設是 53,設為 0 表示將 dns server 關閉,dnsmasq 有 dns server 及 dhcp server 的功能,而我們只要用到 dhcp server。
dhcp-option=6,168.95.192.1,168.95.1.1
將 dns server 設成 168.95.192.1 及 168.95.1.1 (hinet dns server) 並送給 dhcp client
3.網路設定及 nat 功能:
新增一個設定檔,內容如下:
$ sudo vi /etc/network.d/hostapd
CONNECTION='ethernet'
DESCRIPTION="wireless ap in master mode with hostapd"
IP="static"
ADDR="192.168.199.254"
INTERFACE=wlan0
SKIPNOCARRIER="yes"
SKIPNOCARRIER="yes"
POST_UP="iptables -I FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -I FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -I POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=1; iptables -I INPUT -i wlan0 -p udp --dport 67 -j ACCEPT; systemctl start hostapd; systemctl start dnsmasq"
POST_DOWN="systemctl stop hostapd; systemctl stop dnsmasq; iptables -D FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -D FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -D POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=0; iptables -D INPUT -i wlan0 -p udp --dport 67 -j ACCEPT"
由於我們 wireless 的設定在 hostapd 中,所以在 netcfg 這邊,完全不要動 wireless 的部份,設成 CONNECTION='none',而系統預設沒有 none 這種 connections,所以我們自己手動建立。
因此設成 CONNECTION='ethernet',將 wlan0 當做 ethernet 來啟動就好,不要套一些 wireless 的設定,如設定 essid 的東西。但由於 ethernet 的 script 中會去偵測網路線是否有插上,可是 wlan0 是無法取得目前狀態是否有插網路線,因此會失敗,無法完成,所以設定檔中要加上 SKIPNOCARRIER 來跳過偵測。
這裡範例對外介面為 ppp0,對內介面為 wlan0,表示在啟動 wlan0 介面後,再將 hostapd 及 dnsmasq 啟動,並設定好 firewall(包含打開 nat 功能、 kernel ip_forward 功能及 dhcp server listen udp port 67);於 wlan0 停止後,自動關閉 dnsmasq 及 hostapd,並關閉 nat 及相關功能。
這裡範例對外介面為 ppp0,對內介面為 wlan0,表示在啟動 wlan0 介面後,再將 hostapd 及 dnsmasq 啟動,並設定好 firewall(包含打開 nat 功能、 kernel ip_forward 功能及 dhcp server listen udp port 67);於 wlan0 停止後,自動關閉 dnsmasq 及 hostapd,並關閉 nat 及相關功能。
4. 啟動及關閉:
啟動:
$ sudo netcfg hostapd
或
$ sudo systemctl start netcfg@hostapd
關閉:
$ sudo netcfg down hostapd
或
$ sudo systemctl stop netcfg@hostapd
開機時啟動:
$ sudo systemctl enable netcfg@hostapd
若無錯誤訊息,此時 wlan0 介面已經起來,hostapd 及 dnsmasq daemon 已在背景跑。
5. 連線測試:
這時以手機、平板或另一個無線裝置來連看看,若沒問題的話,應該就可以上網了。
基本上,只有幾個步驟而已,不過要注意的是,若同時有 network-manager 之類的工具,可能會來搶 wlan0,因此要注意將 network-manager 先關閉再進行測試比較不會出狀況。
總結:
arch linux 的 netcfg 功能非常強大且完整,在設定寫了一堆指令,看起來滿亂的,其實可以寫成另外的 script,再由設定檔中呼叫。這裡是為了解說方便,因此全部擠在一起。
原本是直接使用 wireless ad-hoc mode,不用額外裝 daemon,但是後來發現 android 不支援 ad-hoc
mode,根本掃描不到 ap,無法使用。因此才改用 hostapd。結果用了 hostapd 後,才發現 hostapd
好強大,不過目前還沒用到其他功能就是。