Sunday, May 06, 2007

FON: Extend Your Internet Connection - Act II

Back

免責聲明:若您依照本文章內容修改您的FON,更改後出現任何問題,最後導致FON無法正常運作,您需自行負責,本人並未保證此修改方式適用於各種特殊情形!若您繼續閱讀本文章,則表示您同意此聲明。

在前一篇文章,我們已經準備好了wpa_supplicant,現在需要修改FON的設定值,並加上自動指令檔,使FON能自動啟動與設定相關選項。在這裡也會修改額外的設定檔,來解決先前發現的一些小問題。

在這之前,請先把您的FON恢復至出廠預設值,並且讓FON接受SSH連線,再重新設定相關設定值,避免您先前安裝其它套件會與接下來的設定衝突,最後記得需自動更新成0.7.1 r3。完成後,請先切斷AP2的Ethernet並重新啟動,避免特殊狀況的發生。



您需先在AP2的網頁管理介面,分別設定以下功能。

設定兩個SSID,分別為MyPlace 2, FON_AP 2,只要不與AP1相同即可。為了避免AP2與AP1連線時,同樣的SSID會發生混淆,即使連線設定檔能指定連線AP的BSSID(MAC位址),這仍然是比較保險的做法。加密的部分則不會互相影響,也就是AP1與AP2的MyPlace可以設定不同的加密Key和加密模式。設定完成別忘了要Submit。

Advanced->Internet Connection Settings裡面,需設定Mode為DHCP,這樣搭配下文修改過的/sbin/ifup是剛好的,設定完成別忘了要Submit。

Advanced->Network Settings裡面,需設定與AP1的MyPlace不同的網段。您可以參考Preliminary中網路架構圖的192.168.11.1,或自行設定一個不與現有重疊的網段。若您設定為一運作中的網段,當AP2的用戶端連線至這些重疊的網段,將會無法route至目的地。

Advanced->Wireless Settings裡面,請設定與AP1的MyPlace相同的頻道,這樣AP2才能與AP1連線。



第一個要新增的設定檔,功能是自動建立FON的Station,讓FON能像一般網卡一樣,並且連線至預先設定好的AP。待FON成功連線至FON總部,系統本身的機制就會啟動MyPlace 2和FON_AP 2。這個檔案命名為/etc/init.d/S99wds
#!/bin/sh

# clean the original vap device
ifdown lan

# create new ap and sta device
wlanconfig ath1 create wlandev wifi0 wlanmode ap
wlanconfig ath2 create wlandev wifi0 wlanmode sta nosbeacon

# start sta device first
wpa_supplicant -Bw -iath2 -c/etc/wpa_supplicant.conf
# get IP Addr and other settings by DHCP
udhcpc -i ath2 -R

# and then the network gets ready, the ap device is booted by fon

# ping default router to prevent wireless connection lost
ping `route -n|grep ath2|grep UG|awk '{print $2}'` &

ifconfig eth0 192.168.12.1 netmask 255.255.255.0
需要先Clean Original VAP,是因為Virtual AP和Station有特定的啟動順序,若Station不是在Virtual AP前先bring-up起來,當其它網卡連線至此AP,就會重複出現斷線重連的現象,這個現象在WDS Bridging最下面的Important有提到。這裡使用FON內建的script ifdown lan來關閉MyPlace 2信號的介面ath1

Create new ap and sta的部分,是要重新建立剛才關閉的ath1,和準備要做為Station的ath2

Start sta device和get IP Addr的部分,是先使用wpa_supplicant建立與AP1的連線,完成後再使用udhcpc從AP1取得IP位址。若您需要自行設定IP位址,請自行取代此行設定。

當AP2成功連線至AP1,表示AP2已有連線至Internet的能力,再來會像連接網路線上網一樣,與FON總部連線。連線完成後,會自動使用指令檔來啟動MyPlace 2和FON_AP 2兩個介面,並且開始接受用戶端的連線。若您已在FON總部要求啟動MyPlace 2前,就先連線至MyPlace 2,您可能會遇到極短時間的斷線,但隨即馬上恢復,這是正常的現象。

再來是自動ping預設router的動作,主要是避免無線網路長時間閒置,導致無線網路自動斷線。使用此方法可維持AP1與AP2的連線。

最後一行是設定Ethernet Port的IP位址,相當於分享器的IP位址。



這裡要修改的是/sbin/ifup這個檔案,需修改以下部分:
line 222:
wan_ifname=${wan_ifname:-eth0}

Modify:
wan_ifname=ath2
在FON預設值中,連線至Internet的網路封包都是由Ethernet Port(eth0)送出,而目前Internet連線是由Station(ath2)提供,則需修改wan_ifname為ath2。當FON啟動時,會產生目前網路介面的配置檔,並輸出至/tmp/network-config,而其它設定檔或script都會引用此配置檔,來得知特定功能由哪個介面負責。只要修改/sbin/ifup,使它產生出需要的結果,就不需要逐一修改所有的設定檔,這樣能節省相當多的時間。



這裡要修改的是/etc/hotplug.d/iface/20-firewall,需修改以下部分:
@ last 2 line:

Insert
/usr/sbin/iptables -A WAN_HOOK -o ${wan_ifname} -d 192.168.1.0/28 -j DROP

關於這裡修改的部分,請參考FON: Prevent Clients to Access Unauthorized Zone,在這裡有詳細的說明。就本例而言,FON_AP 2的使用者在預設的設定之下,並無法連線至192.168.10.0/24,但並無法防止使用者連線至上層的192.168.1.0/28。加上這樣的規則,即可保護192.168.1.0/28不被FON_AP 2的使用者存取。設定完成後,每次FON啟動就會自動將此規則加入iptables。



再來是/etc/wpa_supplicant.conf。這裡分別貼上WPA, WPA2, WEP, None四種加密方式可使用的設定檔。

WPA, WPA2:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1

network={
ssid="MyPlace"
bssid=00:18:84:XX:XX:XX
proto=WPA RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
WEP:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1

network={
ssid="MyPlace"
key_mgmt=NONE
wep_key0="abcde"
wep_key1=0102030405
wep_key2="1234567890123"
wep_tx_keyidx=0
}
None:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
ap_scan=1

network={
ssid="MyPlace"
key_mgmt=NONE
}
由於wpa_supplicant會自動使用設定檔內允許的加密與認證方式,所以WPA與WPA2可以使用相同的設定檔。

WPA, WPA2的Key也可以直接放入未編碼過的Key,並使用雙引號(")把Key包含起來,但這樣每次系統啟動時,都需花費系統資源來把未編碼過的Key,轉換成編碼過的Hex Code,相當花費時間,因此建議您可以事先使用wpa_passphrase把您的Key轉換好,再把它直接放入wpa_supplicant.conf,可以節省開機需要的時間。

若您的SSID或Key使用的是特殊字元,您可以直接輸入Hex Code,並且不要在旁邊加上雙引號,wpa_supplicant也能接受此格式。

若您使用WEP加密,您需知道原先Key的Index,並修改成設定檔相對應的選項。在設定檔中的Index範圍是0~3,若您原先的格式是1~4,則您的Index值需自行減1,然後再修改成wep_key#="abcde"和wep_tx_keyidx=##字號請替代為您的Index。



在這裡要修改的有兩個檔案。

/etc/dnsmasq.conf @ last line:
Append:
dhcp-option=6,168.95.192.1,168.95.1.1

dhcp-range=192.168.12.100,192.168.12.200,255.255.255.0,12h
interface=eth0
interface=ath1
/etc/init.d/N50chillispot @ line 116:
Remove:
--dns1="$WANIP" \
--dns2="$WANIP" \
dnsmasq是FON提供MyPlace 2用戶端DNS查詢和DHCP服務的程式。實際使用時,發現DNS查詢的部分常會出問題,在不明情況下,某一次的DNS查詢會回傳Query refused,接下來的查詢會全部都回傳Query refused,直到重新啟動才會恢復。此問題與FON連續開機數天,就會發生無法連外的情形是類似的。在設定檔設定DNS Server後,就會直接透過DHCP傳給MyPlace 2用戶端,而不是直接使用FON的dnsmasq,如此即可避免此問題。

再來的dhcp-range設定的是會分配給MyPlace 2和Ethernet Port用戶端的IP位址範圍。這裡也要求dnsmasq需listen eth0ath1介面。

同樣為了不使用dnsmasq,FON_AP 2也需要做一些調整。FON_AP 2的使用者是由chillispot提供服務,在FON預設值中,會使用自身的dnsmasq,也就是會遇到相同的問題。刪除指定的那兩行,是要讓chillispot使用系統從上層網路取得的DNS Server,而不是使用dnsmasq,這樣就能解決問題。



這裡修改的是/sbin/ifup
Remove line 61:
udhcpc -i "$dev" ${ipaddr:+ -r $ipaddr} -R &
為了要讓Ethernet Port當成IP分享器使用,先前有要求Advanced->Internet Connection Settings裡需設為DHCP。設為DHCP後,系統啟動時會執行這裡的指令,而刪除此行就會變成只啟動eth0而不做額外的設定,這樣就不需要先刪除FON設定好的值,可以直接執行想要的指令。



這裡修改的是/etc/firewall.user
Append:

# make packets received from ethernet inteface can go through FON to ath2
iptables -A FORWARD -i eth0 -o ath2 -j ACCEPT
iptables -A FORWARD -i eth0 -o ath1 -j ACCEPT
iptables -A FORWARD -i ath1 -o eth0 -j ACCEPT
這個部分是為了讓Ethernet Port的電腦,可以經由FON連線至MyPlace和Internet。若未加上這些規則,Ethernet Port的電腦會無法與其它Interface連線。



以上內容都修改完成後,重新啟動後,您的FON應該可以成功與AP1連線。請繼續閱讀接下來的文章。

No comments: