2013年3月12日 星期二

使用 notebook 上的無線網卡來當無線 AP - arch linux 篇

以 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=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
}

因此,取出 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='none'
CONNECTION='ethernet'
DESCRIPTION="wireless ap in master mode with hostapd"
IP="static"
ADDR="192.168.199.254"
INTERFACE=wlan0
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,所以我們自己手動建立。
$ cat << EOF > /tmp/none
#!/bin/bash
exit 0
EOF
按 ctrl-d

$ sudo chmod 755 /tmp/none
$ sudo chown root:root /tmp/none
$ sudo mv /tmp/none /usr/lib/network/connections/none

這樣即可產生 none 的 connections,內容是不做任何事,傳回 0
因此設成 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 及相關功能。

 

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 好強大,不過目前還沒用到其他功能就是。

使用 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 好強大,不過目前還沒用到其他功能就是。