Raspberry Pi 的應用 - Wi-Fi 無線基地台

by 5月 16, 2014 8 意見            

雖然市面上很容易買的到迷你型的無線基地台,畢竟那還得另外帶著一個設備,而且還要考慮它的電源問題,倒不如直接用 Raspberry Pi 來模擬成 Wi-Fi 熱點,而且同時還可以提供其他的多種功能。
最後更新日期 - 2017/01/26

想要在 內建 Wi-Fi 的 Raspberry Pi 3 上面實作嗎?
請參閱  [Raspberry Pi 3] 多了WiFi,價格不變,輕鬆打造隨身無線基地台

事前準備

  • Raspberry Pi Type B / B+,Type A / A+ 無法實作,除非一次安裝兩張網卡。
  • Raspbian 作業系統。
  • USB 無線網卡,這裡用的是 Edimax EW-7811Un
  • 內建的 Ethernet 為 eth0 負責對外連線,而外接的 Wireless 為 wlan0 負責對內連線。

開始安裝


先測試一下系統是否已經偵測到無線網卡。
lsusb

我們需要安裝 hostapd 套件,讓無線網卡模擬成  Soft-AP。
sudo apt-get -y install hostapd

但是 hostapd 不支援這張無線網卡,所以我們先移除主程式,但保留相關的設定值,只需重新編譯主程式就可以了。
sudo apt-get -y remove hostapd

Reltek 官網已經不提供 Driver 下載,請改到 Edimax 官網下載
wget http://www.edimax.com.tw/edimax/mw/cufiles/files/download/Driver_Utility/transfer/Wireless/NIC/EW-7811Un/EW-7811Un_Linux_driver_v1.0.0.5.zip


打開瀏覽器,打開 Realtek 官網 下載 RTL8188CUS 的 Linux 驅動程式及工具,位置在「下載中心」-「Wireless LAN ICs」-「WLAN NIC」-「 IEEE 802.11b/g/n Single-Chip 」-「Software」。

任選一個驅動程式載點,將連結位址複製下來。

回到 shell,把 Linux Driver 下載下來。
請注意,不要直接用下面這個連結,因為 Realtek 會即時產生密碼,必須自行到官網取得連結位址。
wget ftp://WebUser:r3iZ6vJI@60.251.198.232/cn/wlan/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip

將檔案解壓縮。
unzip RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip

進入 RTL8188C 裡面的 hostapd 目錄,再將 hostapd 主程式解壓縮。
cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/
tar zxvf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz

開始編譯並安裝 hostapd 主程式。
cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd
make clean && make && sudo make install

將 hostapd 相關檔案複製到它對應的目錄。
sudo cp /usr/local/bin/hostapd* /usr/sbin

切換到 wireless 工具程式目錄,準備將它解壓縮。
cd ../../../wireless_tools
tar zxvf wireless_tools.30.rtl.tar.gz

同樣也需要重新編譯及安裝。
cd wireless_tools.30.rtl
make clean && make && sudo make install

編譯及安裝的動作需要一些時間,先來杯咖啡休息一下吧 ..... ^_^


依 WAN 的來源選擇的服務模式


實作成 Access Point 有兩種模式可以選擇,請依現場實際的需求判斷。
  • 橋接模式

    適用於現有環境中已經有 IP 分享器、無線基地台或路由器在處理上網的服務,而我們只是希望使用 Raspberry Pi 來延伸現有的 Wi-Fi 訊號範圍或是提供原本不存在的 Wi-Fi 連線上網功能。

    這個模式的重點是,透過 Raspberry Pi 的無線網卡連接上來的 Clients,會與現有環境中所有的 Clients 位於相同的 LAN 網段,也就是它們之間可以直接連線。

    如果現有環境中沒有 DHCP Server 的話,請千萬不要使用橋接模式。
     
  • 路由模式

    適用於所有狀況,簡單的說,這就是把 Raspberry Pi 變成一個無線基地台,所以 Raspberry Pi 的有線 WAN Port 一定是直連路由器,也就是俗稱的小烏龜。

    相對的,如果現有環境中已經有其他的 Clients 時,透過 Raspberry Pi 的無線網卡連接上來的 Clients,會與現有環境中所有的 Clients 位於不同的 LAN 網段,也就是它們無法直接互連。

設定為橋接模式


安裝網路橋接功能套件。
sudo apt-get -y install bridge-utils


修改無線網卡的設定值,加入橋接功能。
sudo vi /etc/network/interfaces

########## 我是分隔線 ##########
auto lo

iface lo inet loopback
iface eth0 inet dhcp

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

auto br0
iface br0 inet dhcp
bridge_ports eth0 wlan0

########## 我是分隔線 ##########

不論我們是否曾經依照 Raspberry Pi 的基礎 - 使用 Wi-Fi 無線網卡連上網路 的步驟,讓 Raspberry Pi 直接用無線網卡上網的話,都必須把原本的 wlan0 設定值註解掉。


設定為路由模式


路由模式需要 DHCP Server 讓 Wi-Fi Client 取得 IP 設定,請先依照 Raspberry Pi 的實作 - 自動配置 IP 位址資訊的 DHCP Server 的步驟實作完成。

避免無線網卡 wlan0 被作業系統自動啟用。
sudo vi /etc/default/ifplugd


找到 INTERFACES 及 HOTPLUG_INTERFACES,從 auto 改成 eth0。

修改無線網路卡的設定值,設定一個指定的靜態 IP 位址。
sudo vi /etc/network/interfaces

########## 我是分隔線 ##########
auto lo

iface lo inet loopback
iface eth0 inet dhcp

#allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
#iface default inet dhcp

allow-hotplug wlan0
iface wlan0 inet static
address 192.168.0.1
netmask 255.255.255.0

########## 我是分隔線 ##########

不論我們是否曾經依照 Raspberry Pi 的基礎 - 使用 WIFI 無線網卡連上網路 的步驟,讓 Raspberry Pi 直接用無線網卡上網的話,都必須把原本的 wlan0 設定值註解掉。

啟用封包轉送 (IP Forward) 的功能。
sudo vi /etc/sysctl.conf


找到 net.ipv4.ip_forward=1,刪除開頭的「#」註解符號。

啟用 NAT 的功能。
sudo iptables -F
sudo iptables -F -t nat
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

儲存目前的 iptables 設定值。
sudo bash -c 'iptables-save > /etc/network/iptables'
sudo iptables-restore < /etc/network/iptables

設定開機時的自動啟動巨集,讓 iptables 的規則自動被載入。
sudo vi /etc/rc.local

在最後一行「exit 0」的上一行,加入「sudo iptables-restore < /etc/network/iptables」。


啟動熱點功能


建立 hostapd 主設定檔。
sudo vi /etc/hostapd/hostapd.conf

Driver 是無線網卡的驅動程式,如果晶片不是 Realtek RTL8188CUS,別忘了要修改。
SSID 是基地台的自訂名稱。
Channel 是無線通訊的頻道,從 1 到 11,通常會設定為 1、6、11 的其中一個。
WPA 是加密協定,1 是 WPA,2 是 WPA2。
WPA_PassPhrase 是基地台的自訂密碼。

詳細的設定值,請參閱 hostapd: IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator - hostapd configuration file

########## 我是分隔線 ##########
interface=wlan0
driver=rtl871xdrv
bridge=br0
ssid=RPi-AP
channel=6
hw_mode=g
ieee80211n=1
wmm_enabled=1
wpa=2
wpa_passphrase=RPi-Pa$$w0rd
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
auth_algs=1
macaddr_acl=0

########## 我是分隔線 ##########

輸入下列指令讓 hostapd 啟動,測試一下設定值是否正確。
sudo hostapd -dd /etc/hostapd/hostapd.conf

運作正常的話會停在這個畫面,等待 Client 端來連線。

要停止的話,直接按 Ctrl+C 停止。

若是沒有出現錯誤訊息,就可以編輯 hostapd 服務設定檔。
sudo vi /etc/default/hostapd

找到 #DAEMON_CONF=,改成 DAEMON_CONF="/etc/hostapd/hostapd.conf"

啟動 hostapd 服務。
sudo service hostapd restart

讓 hostapd 開機時自動啟動。
sudo update-rc.d hostapd defaults

以上的步驟正確的執行完成後,重新開機即可生效。
sudo reboot


Client 連線實測


這邊我們用 iPhone 做為 Client 來實際連線測試。

在 iOS 上打開「設定」-「Wi-Fi」,就會顯示附近所有的基地台,這邊就會看到「RPi-AP」。

輸入我們在 hostapd 主設定檔裡的自訂密碼「RPi-Pa$$w0rd」。

終於完成了基地台的建置,iPhone 取得了正確的 IP 位址及相關設定值。



系列文章


參考資料


更新紀錄

  • 2014/05/16 撰文。
  • 2015/01/16 將橋接模式及路由模式分開,加入橋接模式的安裝過程畫面。
  • 2015/01/19 調整了實作步驟的順序,並將 DHCP Server 的建置獨立為 Raspberry Pi 的實作 - 自動配置 IP 位址資訊的 DHCP Server
  • 2015/01/20 加入路由模式的安裝過程畫面,並加入了實測連線的結果。
  • 2017/01/26 修改 Driver 的下載位址。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

8 則留言 :

  1. 你好, 很精采的文章.
    最近也在玩Raspberry Pi, 有個問題想請教大大:
    我想要的功能剛好跟大大這篇文章相反: 我的RPi有無線網卡, 目前連接家中的無線AP也都OK, 可是我想要的應用是在外地時, 能夠讓我的RPi透過iPhone的熱點(在不越獄的情況下)上網, 但不是透過USB連接熱點, 而是單純透過Wifi分享, 這樣有辦法做到嗎? 之前試過用Raspbian的WPA_Config GUI, 看的到iPhone HotSpot, 可是連不上, 目前不知如何解決

    回覆刪除
  2. 聽起來你只是要讓 RPi 透過 WIFI 連到 iPhone 的 3G / LTE 上網 ?!

    1. iPhone 的個人熱點支援的協定是 WPA2,密碼要8碼以上。

    2. 檢查 RPi 的 wpa_supplicant.conf 設定,可以參考
    http://www.freebsd.org/cgi/man.cgi?wpa_supplicant.conf%285%29
    重點是 SSID, PSK, PROTO, KEY-MGMT, PAIRWISE, GROUP 這幾個參數。

    回覆刪除
  3. 請問您這篇用的是
    pi幾呢?
    pi1
    pi2 ??

    回覆刪除
    回覆
    1. 當年用的是 Raspberry Pi 1 B ....^^

      刪除
  4. success on raspberry pi 3
    thank a lots

    回覆刪除
  5. 如果要同时设route 给eth1跟wlan0 该怎么设定?
    谢谢

    回覆刪除
  6. 發現
    位置在「下載中心」-「Wireless LAN ICs」
    已經沒有了

    回覆刪除
    回覆
    1. 剛剛去看了一下,Realtek 應該把 WLAN 的 Driver 全部拿掉了,
      那就到 Edimax 下載好了...
      http://www.edimax.com.tw/edimax/download/download/data/edimax/tw/download/

      刪除