2013年3月12日 星期二

使用 notebook 上的無線網卡來當無線 AP - debian wheezy 篇


以 notebook 上的無線網卡來當 ap ,讓其他行動裝置可以透過 notebook 上網
wireless ap 伺服器使用 hostapd 。
而自動配發 ip 的 dhcp server 使用 dnsmasq ,比較簡單設定。

步驟如下:
1. 設定 hostapd
2. 設定 dhcp server
3. 設定網路及 nat
4. 啟動
5. 以行動裝置連線測試


1. hostapd:


安裝 hostapd:

$ sudo apt-get install hostapd
$ sudo cp -p /usr/share/doc/hostapd/examples/hostapd.conf.gz /etc/hostapd/
$ sudo gzip -d /etc/hostapd/hostapd.conf.gz

debian wheezy上 hostapd 預設是不會啟動,要修改 /etc/default/hostapd 指定設定檔位置才行。
DAEMON_CONF="/etc/hostapd/hostapd.conf"

設定 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=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
}
因此,取出 psk= 後面的這串文字放到設定檔中即可

wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3


2. dhcp server 設定:

dhcp server 這裡是使用 dnsmasq,因為比較簡單,若要改用 isc dhcp server 當然也行,請自行設定。

安裝 dnsmasq:

$ sudo apt-get install 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 功能:

debian 本身有很完整的網路設定機制。
直接編輯 /etc/network/interfaces 檔案,然後以 ifupdown 來啟動或關閉介面即可。

$ sudo vi /etc/network/interfaces
iface wlan0 inet static
    address 192.168.199.254
netmask 255.255.255.0

post-up /etc/init.d/hostapd start
post-up /etc/init.d/dnsmasq start
    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

post-down /etc/init.d/dnsmasq stop
    post-down /etc/init.d/hostapd start
post-down 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

這裡範例對外介面為 ppp0,對內介面為 wlan0,表示在啟動 wlan0 介面後,再將 hostapd 及 dnsmasq 啟動,並設定好 firewall(包含打開 nat 功能、 kernel ip_forward 功能及 dhcp server listen udp port 67);於 wlan0 停止後,自動關閉 dnsmasq 及 hostapd,並關閉 nat 及相關功能。


4. 啟動及關閉:

啟動:
$ sudo ifup wlan0

關閉:
$ sudo ifdown wlan0

若要開機啟動,在 /etc/network/interfaces 中加上:
auto wlan0

若無錯誤訊息,此時 wlan0 介面已經起來,hostapd 及 dnsmasq daemon 已在背景跑。


5. 連線測試:

這時以手機、平板或另一個無線裝置來連看看,若沒問題的話,應該就可以上網了。

基本上,只有幾個步驟而已,不過要注意的是,若同時有 network-manager 之類的工具,可能會來搶 wlan0,因此要注意將 network-manager 先關閉再進行測試比較不會出狀況。



總結:


debian 的 ifupdown 功能非常強大且完整,在設定寫了一堆指令,看起來滿亂的,其實可以寫成另外的 script,再由設定檔中呼叫。這裡是為了解說方便,因此全部擠在一起。

原本是直接使用 wireless ad-hoc mode,不用額外裝 daemon,但是後來發現 android 不支援 ad-hoc mode,根本掃描不到 ap,無法使用。因此才改用 hostapd。結果用了 hostapd 後,才發現 hostapd 好強大,不過目前還沒用到其他功能就是。

沒有留言:

張貼留言