2013年5月27日 星期一

RaspberryPi : 用 Edimax EW-7811Un 建置 Wireless AP

很多玩 Raspberry Pi 的人都在推薦 Edimax EW-7811Un 這款小巧的無線網卡,因為它只要插到 USB 就可以用,不用為驅動程式傷腦筋,而且聽說它也支援架設 wireless AP。衝著前述兩點,當然就買了。試了一下,如果只是拿來連基地台,它的確小巧又方便,不過,架設基地台這部份就沒想像中容易了,研究了好幾天,看了好多人的說法,甚至有人直接判 EW-7811Un 的死刑,很篤定的說它根本不支援當 AP。本來想放棄,發現在 Windows XP 中用 Edimax 內建的程式是可以當 AP 的,可見應該只是程式的問題而已。加上有人說,只是 Raspberry Pi 內建的 hostapd 無法和 EW-7811Un 搭配。最後試著移除已安裝的 hostapd 後,用 Realtek 網站中所提供的 source 自己編譯,成功了!把過程記錄一下。


移除已安裝過的 hostapd

執行底下的指令來移除
sudo apt-get autoremove hostapd

下載 RTL8192CU 的 source

EW-7811Un 用的是「RTL8192CU」, Realtek 的網站中有提供 Linux 的 source,它是一個 .zip 檔案,我們先將它下載到 Raspberry Pi 中,下載頁面的網址如下:


找「RTL8192CU」中「Unix (Linux)」的,將下載的檔案放到 Raspberry Pi 中。


解壓縮

下載回來的 .zip 檔案裡面包山包海,我們的目標是找到「hostapd」。我下載回來的檔案檔名為「RTL8192xC_USB_linux_v3.4.4_4749.20121105.zip」,所以先利用 unzip (工具自行安裝)來解壓縮,執行底下指令:
unzip RTL8192xC_USB_linux_v3.4.4_4749.20121105.zip
解壓縮完,會多一個目錄名稱為「RTL8188C_8192C_USB_linux_v3.4.4_4749.20121105」,裡面有個叫「wpa_supplicant_hostapd」目錄,我們要的 hostapd 放在該目錄中的壓縮檔案,哈!好像在拆禮物一樣。先切換進目錄中找檔案,執行:
cd RTL8188C_8192C_USB_linux_v3.4.4_4749.20121105/wpa_supplicant_hostapd

裡面有個檔案檔名為「wpa_supplicant_hostapd-0.8_rtw_20120803.zip」,將它解壓縮,執行:
unzip wpa_supplicant_hostapd-0.8_rtw_20120803.zip

解壓縮完,多了一個名稱為「wpa_supplicant_hostapd-0.8」的目錄,裡面有個名稱為「hostapd」的目錄,這就是我們的主角,二話不說,當然要切換進該目錄囉!執行:
cd wpa_supplicant_hostapd-0.8/hostapd

這樣就可以準備開始編譯程式了。


編譯與安裝 hostapd

在 hostapd 目錄中,我們執行底下的指令來編譯:
make

如果順利編譯完,用面的指令來安裝
make install

程式會被安裝到 /usr/local/bin 目錄中,接下來就可以按照一般如何設置 wireless AP 的程序來進行設定了。


讓 Raspberry Pi 變 Wireless AP

前面解決 EW-7811Un 「水土不服」的問題,接下來要處理:

  • 無線網路改用固定 IP。
  • 提供 DHCP 服務,讓 clients 在無線網路連線後可以自動取得 IP。
  • 設定 hostapd ,讓 Raspberry Pi 接受其它 clients 的連線。
  • 設定 NAT,讓 clients 可以連到外面的網路。


無線網路使用固定 IP

有關網卡的設定,我們只要修改「/etc/network/interfaces」即可,所以我們執行底下的指令來修改:
sudo nano /etc/network/interfaces

找到無線網路的設定,把類似底下的設定
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

先註解掉(加上井字號),將這兩行改為:
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
然後加上固定 IP 的設定:
iface wlan0 inet static
address 192.168.3.100
netmask 255.255.255.0
上面把無線網卡設為:
  • 固定的 IP (static)。
  • 使用「192.168.3.100」的 IP 。
  • 遮罩用「255.255.255.0」。
這部份依個人需求自行設定,不過,wlan0 的 IP,稍後的 DHCP 服務設定中會使用到。

改好設定後,如果想讓它馬上生效,可以執行底下的指令:
sudo ifdown wlan0
sudo ifup wlan0


設置 DHCP server

可以當 DHCP server 的程式有很多,這裡選用 udhcpd。先執行底下的指令來安裝:
sudo apt-get install udhcpd

安裝完,依個人需求修改設定檔「/etc/udhcpd.conf」,我改了範例中的幾個選項:
  • 可配發的第一個 IP:start           192.168.3.101
  • 可配發的最後一個 IP:end             192.168.3.200
  • 提供服務給哪一張網卡:interface       wlan0
  • clients 的 DNS 設定:opt     dns     8.8.8.8 4.2.2.2
  • clients 的 netmask 設定:option  subnet  255.255.255.0
  • clients 的 default gateway 設定,設為 Raspberry Pi 無線網卡的 IP:opt     router  192.168.3.100
其它選項再研究囉!

如果要馬上啟動 DHCP server,我們得先修改「/etc/default/udhcpd」,執行:
sudo nano /etc/default/udhcpd

然後將「DHCPD_ENABLED」設為「yes」:
DHCPD_ENABLED="yes"

修改好儲存,執行底下的指令來啟動服務:
sudo service udhcpd start


設置 hostapd

一般會把 hostapd 的設定檔路徑是「/etc/hostapd/hostapd.conf」,所以我們執行底下指令來新增或修改:
sudo nano /etc/hostapd/hostapd.conf

貼一下設定的內容供參考:
# Basic configuration
interface=wlan0
ssid=pi
channel=1
#bridge=br0
# WPA and WPA2 configuration
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=YourPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
# Hardware configuration
driver=rtl871xdrv
ieee80211n=1
hw_mode=g
device_name=RTL8192CU
manufacturer=Realtek

「ssid」那行是我們想讓 clients 看到的名稱,而「wpa_passphrase」那行是 clients 連線時所需要的密碼,依個人需要設定。其它的設定再自行參考網路上有關 hostapd.conf 的說明。

馬上來測試 hostapd 是否能正常運作,能不能當 Wireless AP 就看它了。先執行底下的指令來修改「sudo nano /etc/default/hostapd」:
sudo nano /etc/default/hostapd

修改「DAEMON_CONF」那行,指定要使用的設定檔路徑為「/etc/hostapd/hostapd.conf」,改為:
DAEMON_CONF="/etc/hostapd/hostapd.conf"

儲存好後,我們就可以啟動 hostapd 的服務了,執行:
sudo service hostapd start

[註] 如果像我因為設定檔沒設好,導致 hostapd 啟動失敗,而執行上述指令又看不到錯誤訊息,則建議暫時執行底下的指令來測試:
sudo hostapd /etc/hostapd/hostapd.conf


設置 NAT 服務

有了  udhcpd 及 hostapd 所提供的服務,應該可以讓手持裝置或是電腦透過無線網路來連上 Raspberry Pi ,並取得 IP 了。最後還是設定 NAT 的部份,讓 clients 能夠用 NAT 來偽裝成 Raspberry Pi 另一個網路介面的 IP 來對外連線。當然,還有另外一個方式是用 bridge 的方式,這裡就先不討論。
我們可以利用 iptable 來提供 NAT 的服務,執行底下的指令:
sudo iptables -A INPUT -i wlan0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE
sudo sysctl net.ipv4.ip_forward=1


  • 第一行先將 wlan0 設為接受所有的封包。
  • 第二行則是將所有來自無線網路的 IP「192.168.3.0/24」(必須依 wlan0 的設定自行修改),通通以 eth0 的身份進行 NAT 偽裝。
  • 第三行是讓 Raspberry Pi 能夠扮演 gateway 的角色,幫忙轉封包。

最方便的當然是將它們寫成 script ,這樣就不用每次都做重覆同樣的事。

下面來看看用 iPad 連線的結果:


相關文章



3 則留言:

  1. 依設定動作OK, 請問我eth0 -> 192.168.1.110, wlan0->192.168.2.1, wlan0 分享範圍為 192.168.2.200 ~ 210,
    我想從 192.168.1.110 連至 192.168.2.200或201 要如何設定 ?

    回覆刪除
  2. 在設置 hostapd
    一般會把 hostapd 的設定檔路徑是「/etc/hostapd/hostapd.conf」,所以我們執行底下指令來新增或修改:

    為什麼我的PI /etc資料夾裡面沒有hostapd這一個資料

    回覆刪除

 
© 2009. Design by Pocket