[Raspberry Pi 3] 多了WiFi,價格不變,輕鬆打造隨身無線基地台

by 3月 21, 2016 55 意見        

還記得當初,在 Raspberry Pi 1 Model B 上面實作 WiFi 無線基地台的時候,為了擔心一個小小的 USB Wireless 網卡是不是被 Kernel 直接支援,就選了老半天;更別說為了讓 hostapd 支援它,還得自己編譯套件,在那邊痴痴的等、傻傻的盼。

沒想到,到了 Raspberry Pi 3 上面簡單多了。

事前準備


請先參閱  [Raspberry Pi 3] 老朋友,新功能!關於那些開箱後馬上要作的事,完成初始設定。
至於,還在用 Raspberry Pi 1、2 的朋友,實作步驟請參閱 Raspberry Pi 的應用 - Wi-Fi 無線基地台



設定 WiFi 的 IP 位址


編輯網路介面的設定檔。
sudo vi /etc/network/interfaces

內建的 WiFi 介面編號是 wlan0,禁止它讀取 WiFi 連線設定值。
# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

編輯 DHCP Client 設定檔。
sudo vi /etc/dhcpcd.conf

輸入要給 wlan0 用的指定 IP 位址。
interface wlan0
static ip_address=192.168.0.1/24


啟用 NAT 功能


開放 IP 轉送功能。
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf

調整防火牆的 IP 偽裝設定。
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


為了安全考量,WiFi 用戶端我會讓它們無法互連,如果有這個需要的話,請再加上這一行。
sudo iptables -A FORWARD -i wlan0 -o wlan0 -j ACCEPT

儲存防火牆的設定值。
sudo bash -c 'iptables-save > /etc/network/iptables.eth0_to_wlan0'
sudo iptables-restore < /etc/network/iptables.eth0_to_wlan0


編輯開機自動載入的腳本。
sudo vi /etc/rc.local

在倒數二行加入新的防火牆規則。
sudo iptables-restore < /etc/network/iptables.eth0_to_wlan0


架設 DHCP Server


同樣依照 Raspberry Pi 的實作 - 自動配置 IP 位址資訊的 DHCP Server 的實作,完成 DHCP Server 的架設。

這次選擇的是 dnsmasq 套件,先把它安裝起來。
sudo apt-get -y install dnsmasq

編輯 dnsmasq 主設定檔。
sudo vi /etc/dnsmasq.conf

輸入下列設定值 ,192.168.0.1 是 wlan0 的自訂 IP,192.168.0.101 到 192.168.0.110 是 dnsmasq 可以發放的 IP 位址。
bogus-priv
bind-interfaces
resolv-file=/etc/resolv.dnsmasq
min-port=49152
server=8.8.8.8
server=168.95.192.1
cache-size=10000
interface=wlan0

dhcp-range=192.168.0.101,192.168.0.110,255.255.255.0,8h
dhcp-option=1,255.255.255.0
dhcp-option=3,192.168.0.1
dhcp-option=6,192.168.0.1,8.8.8.8,168.95.192.1
dhcp-authoritative


複製原本的本機 DNS Server 設定值。
sudo cp /etc/resolv.conf /etc/resolv.dnsmasq

將裡面的 DNS Server 改成 wlan0 的自訂 IP。
sudo sed -i 's/127.0.0.1/192.168.0.1/g' /etc/resolv.dnsmasq

重新啟動 dnsmasq。
sudo systemctl restart dnsmasq && sudo systemctl enable dnsmasq


啟用 W-iFi 熱點功能


這邊就是重點了。

以前我們使用 Edimax EW-7811Un 無線網卡的時候,還得自己上 Realtek 官網去下載 Linux Driver,然後再編譯老半天。

現在不用了,直接使用官方套件庫的套件就行了。
sudo apt-get -y install hostapd

新增 hostapd 的主設定檔。
sudo vi /etc/hostapd/hostapd.conf

輸入下列的設定值,SSID、密碼及頻道請依自己的需求修改。
interface=wlan0
ssid=RPi3-AP
hw_mode=g
channel=11
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=RPi3-Password
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP


測試一下 hostapd 是否正常啟動。
sudo hostapd -dd /etc/hostapd/hostapd.conf

沒有錯誤訊息的話,按 Ctrl + C 中斷服務。

指定 hostapd 的設定檔位置。
sudo sed -i 's/#DAEMON_CONF=""/DAEMON_CONF="\/etc\/hostapd\/hostapd.conf"/g' /etc/default/hostapd

最後,重新開機讓所有的設定值都生效。
sudo systemctl enable hostapd && sudo reboot


開始使用


這邊用 Mac 來測試一下,先確認一下是不是真的可用用 WiFi 掃到 Raspberry Pi 3 的 SSID。

非常好,我們找到了,而且可以成功連上來了。

而且也可以正常的對外連線。


參考資料


圖片來源


更新紀錄


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

IT 技術家 - 創站部落客

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

55 則留言 :

  1. 在倒數第二步驟 出現如下錯誤, 請指教
    root@raspberrypi:~# hostapd -dd /etc/hostapd/hostapd.conf
    random: Trying to read entropy from /dev/random
    Configuration file: /etc/hostapd/hostapd.conf
    'ine 3: unknown hw_mode 'g
    'ine 10: invalid key_mgmt 'WPA-PSK
    FT (IEEE 802.11r) requires nas_identifier to be configured as a 1..48 octet string
    3 errors found in configuration file '/etc/hostapd/hostapd.conf'
    Failed to set up interface with /etc/hostapd/hostapd.conf
    hostapd_init: free iface 0x550869f0
    Failed to initialize interface

    回覆刪除
  2. 依照錯誤訊息看來,
    'ine 3: unknown hw_mode 'g
    'ine 10: invalid key_mgmt 'WPA-PSK
    請檢查一下 hostapd.conf 的內容是不是正確...

    回覆刪除
  3. 請問若是要把soft-ap關掉
    恢復原本只可以去連Wifi的功能
    應該要怎麼用做?
    前面更動過的文件和設定全部都得改回原本的嗎?

    回覆刪除
    回覆
    1. 是的,
      /etc/dhcpcd.conf、/etc/network/interfaces 的內容要改回來,
      NAT 要關掉、dnsmasq、hostapd 要停掉,firewalld 的規則也要清掉。

      刪除
  4. 請問我步驟都已完成,無法搜尋到pi3上的訊號,且重新開機後出現一行紅字:failed to start LSB:advanced IEEE 802.11 management daemon.see'systemctl status hostapd.service'for details.
    請問是否有解?謝謝

    回覆刪除
    回覆
    1. 看起來是 hostapd 服務沒有成功啟動,
      請執行錯誤訊息提到的 systemctl status hostapd.service 指令,
      確認一下詳細的錯誤訊息,我認為很有可能是 hostapd.conf 的設定有問題。

      刪除
    2. 執行systemctl status hostapd.service,出現下列訊息
      host.service - LSB:advanced ieee 802.11 management daemon
      loaded:loaded (/etcinit.d/hostapd)
      active:failed (result:exit-code) since thu 2016-05-05.....省略
      process:511 execstart=/etc/init.d/hostapd start (code=exited,status=2)
      hostapd.conf內的設定我剛又再確認一次,應該是沒有錯...測試hostapd時看起來也正常,沒有出現fail

      刪除
    3. 不太清楚你是怎麼測試 hostapd 的,如果沒有問題的話,服務不應該起不來。
      1. 請先不要用 daemon 模式啟動 hostapd,直接下 command 測試,並確定 client 端連的上來。
      2. 如果直接下 command 沒有問題的話,那就請檢查 daemon 設定檔。

      刪除
    4. 問題已解決,感謝您!!

      刪除
  5. 請問有方法可以限制/分配網絡流量嗎?

    回覆刪除
    回覆
    1. 當然可以,這得實作 QoS 功能....
      在 Raspbian 裡應該已經安裝好 iptables 跟 tc (traffic control) 兩個套件,研究一下它們就可以完成基本的管制了....

      刪除
    2. 感激不尽 :)

      刪除
  6. 能写篇在CentOS 7 ARM下配置无线网卡的文章吗?急需

    回覆刪除
  7. 請問這樣就同時能夠當ap 以及 clinet去連別人的wifi嗎?

    回覆刪除
    回覆
    1. 照這篇文章的步驟,的確可以把 RPi 變成 AP。
      不過,同一個 wlan 介面無法同時成為 AP Mode 又成為 Client。

      刪除
  8. 內建的 WiFi 介面編號是 wlan0,禁止它讀取 WiFi 連線設定值。
    # wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

    請問這個#字 shift+3出不來?已更改過鍵盤設定
    另外存檔離開的指令為何?

    回覆刪除
    回覆
    1. 請服用 http://blog.itist.tw/2014/05/raspberry-pi-setup.html,找到 vi & vim 的那一段,加入 set nocp 來修改鍵盤的相容性。

      存檔離開的指令是 :wq,這個請爬一下 vi & vim 的操作教學文。

      刪除
  9. 感謝您,輸入問題解決。
    照這篇文章的步驟,的確可以把 RPi 變成 AP。
    不過,同一個 wlan 介面無法同時成為 AP Mode 又成為 Client。

    承上所述,照這篇文章的步驟是否能讓RPi3在沒有網路的環境下
    讓手機或其他電腦設備,透過RPi3的固定IP位址登入操作RPi3呢?
    謝謝

    回覆刪除
    回覆
    1. RPi3 對外的 eth0 沒有連線,
      但是對內的 wlan0 已經成了 AP Mode,並且有固定 IP,當然可以讓其他同網段的 Client 端直接連線。

      刪除
  10. sudo /etc/init.d/dnsmasq restart
    [....] Restarting dnsmasq (via systemctl): dnsmasq.serviceJob for dnsmasq.service failed. See 'systemctl status dnsmasq.servi ce' and 'journalctl -xn' for details.
    failed!
    重啟dnsmasq出現此錯誤
    請問是否有辦法解決呢?

    回覆刪除
    回覆
    1. 這個訊息只是說 dnsmasq 服務起不來,要執行一下 journalctl -xn 或看一下 log 才知道為什麼起不來。

      比較常見的原因:
      1. IP 網段的問題。
      2. 主設定檔的內容有問題。

      刪除
    2. 您好 我也遇到相同問題 然後好像是
      dncp-range 的問題
      想請問 前輩們
      是否知道如何解決

      刪除
    3. 如果是 DHCP Range 的問題,有個很重要的關鍵:
      用來發 IP 的網路介面,它一定要固定 IP,而且一定要跟發放的範圍同網段,
      如果不是的話,服務一定起不來。

      刪除
  11. 所以rpi3無法做ap_client mode ? 正確?

    回覆刪除
    回覆
    1. 可以啊,因為我用不到,所以沒實作而已....

      刪除
  12. 請問為何我連上去之後她是黃色驚嘆號呢~(沒有連到外面的樣子
    是因為學校的網路嗎...

    回覆刪除
    回覆
    1. 看一下你的 Client 有沒有拿到 IP,
      有的話,查一下源頭也就是學校網路有沒有擋。
      沒有的話,查一下實作的過程有沒有錯。

      刪除
  13. 版主您好,
    這邊按照上面的方式進行操作,最後使用手機可以連接到RPi3上面。

    但是卻沒有辦法真的連到外面的網路,不知道是哪邊操作出了問題?

    回覆刪除
    回覆
    1. 這個代表 hostapd + dnsmasq 都有起來,但是對外的連線設定有問題 ...
      請確定一下 LAN Port 的設定、dnsmasq 的 geteway 是否正確。

      刪除
  14. job for dnsmasq.servicee failed. See 'systemctl status dnsmasq.service' and 'journalctl -xn' for details.
    請問版主這是什麼問題呢?

    回覆刪除
    回覆
    1. dnsmasq 服務沒起來,
      請依照上面的說明執行 systemctl -l status dnsmasq.service 或 journalctl -xn,
      確認並修正錯誤的參數。

      刪除
  15. 想問如果我在iptables那邊想指定,符合規定的MAC address才能連線,
    我改從哪裡開始下手會比較好呢?

    回覆刪除
    回覆
    1. 可以參考這個方法
      https://www.cyberciti.biz/tips/iptables-mac-address-filtering.html

      刪除
  16. 請問版大 在重啟之前有執行過hostapd -dd /etc/hostapd/hostapd.conf 手機可以正常搜尋到SSID
    但重啟後就GG了.. 在執行一次hostapd -dd /etc/hostapd/hostapd.conf並不會像原先那樣停在等待狀態

    報錯提示這些
    random: Trying to read entropy from /dev/random
    Configuration file: /etc/hostapd/hostapd.conf
    rfkill: initial event: idx=0 type=1 op=0 soft=0 hard=0
    rfkill: initial event: idx=1 type=1 op=0 soft=0 hard=0
    rfkill: initial event: idx=2 type=2 op=0 soft=0 hard=0
    nl80211: Supported cipher 00-0f-ac:1
    nl80211: Supported cipher 00-0f-ac:5
    nl80211: Supported cipher 00-0f-ac:2
    nl80211: Supported cipher 00-0f-ac:4
    nl80211: interface wlan1 in phy phy1
    nl80211: Set mode ifindex 4 iftype 3 (AP)
    nl80211: Failed to set interface 4 to mode 3: -95 (Operation not supported)
    nl80211: Try mode change after setting interface down
    nl80211: Set mode ifindex 4 iftype 3 (AP)
    nl80211: Failed to set interface 4 to mode 3: -95 (Operation not supported)
    nl80211: Interface mode change to 3 from 0 failed
    nl80211: Could not configure driver mode
    nl80211: Remove monitor interface: refcount=0
    netlink: Operstate: ifindex=4 linkmode=0 (kernel-control), operstate=6 (IF_OPER_UP)
    nl80211: Set mode ifindex 4 iftype 2 (STATION)
    nl80211 driver initialization failed.
    hostapd_interface_deinit_free(0x55caa9f0)
    hostapd_interface_deinit_free: num_bss=1 conf->num_bss=1
    hostapd_interface_deinit(0x55caa9f0)
    hostapd_bss_deinit: deinit bss wlan1
    hostapd_cleanup(hapd=0x55cab618 (wlan1))
    hostapd_free_hapd_data: Interface wlan1 wasn't started
    hostapd_interface_deinit_free: driver=(nil) drv_priv=(nil) -> hapd_deinit
    hostapd_interface_free(0x55caa9f0)
    hostapd_interface_free: free hapd 0x55cab618
    hostapd_cleanup_iface(0x55caa9f0)
    hostapd_cleanup_iface_partial(0x55caa9f0)
    hostapd_cleanup_iface: free iface=0x55caa9f0

    請問該如何解決QAQ
    我是使用Tp link AC600 T2U這個 4.9.35-v7+版本

    回覆刪除
    回覆
    1. 這塊網卡用的是 MediaTek MT7610 的晶片 ,你可能要去找找有沒有支援它的 hostapd 版本.....

      刪除
  17. 哈囉,先謝謝版主的用心翻譯和分享,我已照您上面的步驟都完成了,過程程中也沒有發生錯誤,在最後一行"Sudo systemctl enable hostapd && sudo reboot"重啟後,用手ㄐ或筆電搜尋這個wifi ap 都找不到? 請問是還需要啟動ap的指令嗎?
    樹梅派本身的wifi要打開嗎?

    回覆刪除
    回覆
    1. 這個指令第一個是要讓 hostapd 服務在開機後自動啟動,第二個是讓 RPi 重新開機。
      重新開機後還找不到的話,
      1. WiFi 當然要打開,要不然手機跟筆電是要跟連到哪兒去?
      2. 找不到 RPi AP 的 SSID,代表 hostapd 服務有問題,檢查一下吧....

      刪除
  18. 版大您好很感謝你的這篇教學受益良多,
    也很順利地讓我的筆電連上pi 3 (有要到IP addr , ping 外網也會通)
    但是開啟網頁他說無法連上網際網路
    然後已經確定我的pi是有上網能力的了
    接著我按windows診斷他說 遠端裝置或資源不接受連線@@
    請問有可能是甚麼問題嗎?
    感謝你耐心的回復喔~

    回覆刪除
    回覆
    1. 你是直接 ping 外部 IP 嗎?
      試試看 ping 外部的任一個 domain,例如 www.google.com。
      感覺像是 DNS Server 設定有問題....

      刪除
  19. 版大你好
    我使用的是Pi3
    這個架設AP方式 需要額外購買網路卡嗎

    回覆刪除
    回覆
    1. 你要不要先把文章看一次,再按著步驟實作看看呢....^^

      刪除
    2. 感謝 我照著步驟做了

      目前遇到可以連到RPi3上,但是沒辦法上網
      是因為 wlan0 的自訂IP 是要輸入本身的連上網的IP嗎?

      刪除
    3. wlan0 的 IP 是從上層 DHCP Server 拿到的,通常是無線基地台或 IP 分享器。
      如果你是直接接在小烏龜的話,請參考這篇安裝 PPPoE 撥接程式。
      http://blog.itist.tw/2015/02/raspberry-pi-pppoe-connection.html

      刪除
  20. 感謝你的教學
    在跑完 sudo systemctl status dnsmasq
    出現以下的問題
    ignoring nameserver 192.168.0.1 - local interface
    是哪個部分打錯了嗎

    回覆刪除
    回覆
    1. 我沒遇過這個訊息,服務有因此跑不起來嗎?

      刪除
  21. 不好意思請問一下
    如果RPI對外用PPPOE、對內用WIFI(分享)可以成功連線嗎?

    回覆刪除
  22. 請問一下,RPI使用PPPO對外連線,另一篇文章設定之後本身可以對外連線
    但是這著此篇設定之後,透過WIFI連進去RPI的設備沒辦法對外連線

    還有DHCP每次重開機之後都不會啟動,手動啟動服務之後DHCP就正常了,要如何解決

    回覆刪除
    回覆
    1. 後來去查詳細的資料,自己解決了
      如果對外是使用PPPOE的話要把eth0改成ppp0才行

      刪除
  23. 這邊提供大家一個job for dnsmasq.servicee failed. See 'systemctl status dnsmasq.service' and 'journalctl -xn' for details.的解決方案

    是dnsmasq版本的問題 原本是2.72版 改安裝dnsmasq 2.76版就沒問題了

    回覆刪除
    回覆
    1. 請問您重新安裝適用wget 的方式去安裝嗎?我目前也卡這個問題 已安裝過2.77版本 一樣都有這個問題

      刪除
    2. 我也安裝了2.76的版本 error還是一樣...只是我輸入呈現以下結果
      pi@raspberrypi:~ $ cat /etc/resolv.dnsmasq
      # Generated by resolvconf
      nameserver 163.17.131.2
      nameserver 203.64.158.150
      nameserver 168.95.1.1

      刪除
    3. 這是我的ifconfig
      pi@raspberrypi:~ $ ifconfig
      eth0: flags=4163 mtu 1500
      inet 10.25.6.192 netmask 255.255.255.0 broadcast 10.25.6.255
      inet6 fe80::bc2:b42a:ee0e:1c9b prefixlen 64 scopeid 0x20
      ether b8:27:eb:8c:94:27 txqueuelen 1000 (Ethernet)
      RX packets 46136 bytes 5939870 (5.6 MiB)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 4811 bytes 962954 (940.3 KiB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

      lo: flags=73 mtu 65536
      inet 127.0.0.1 netmask 255.0.0.0
      inet6 ::1 prefixlen 128 scopeid 0x10
      loop txqueuelen 1000 (Local Loopback)
      RX packets 36 bytes 3186 (3.1 KiB)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 36 bytes 3186 (3.1 KiB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

      wlan0: flags=4163 mtu 1500
      ether 4a:56:33:e4:83:b5 txqueuelen 1000 (Ethernet)
      RX packets 0 bytes 0 (0.0 B)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 0 bytes 0 (0.0 B)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

      刪除
    4. 以及 sudo vi /etc/dnsmasq.conf
      dhcp-mac=set:client_is_a_pi,B8:27:EB:*:*:*
      dhcp-reply-delay=tag:client_is_a_pi,2
      bogus-priv
      bind-interfaces
      resolv-file=/etc/resolv.dnsmasq
      min-port=49152
      server=8.8.8.8
      server=168.95.192.1
      cache-size=10000
      interface=wlan0
      dhcp-range=192.168.0.101,192.168.0.110,255.255.255.0,8h
      dhcp-option=1,255.255.255.0
      dhcp-option=3,192.168.0.1
      dhcp-option=6,192.168.0.1,8.8.8.8,168.95.192.1
      dhcp-authoritative

      刪除
  24. 我也安裝了2.76的版本 error還是一樣...只是我輸入呈現以下結果
    pi@raspberrypi:~ $ cat /etc/resolv.dnsmasq
    # Generated by resolvconf
    nameserver 163.17.131.2
    nameserver 203.64.158.150
    nameserver 168.95.1.1

    回覆刪除
  25. 請問一下
    目前我手邊有一台樹梅派3和一張EDIMAX EW-7822UAn的網卡
    想嘗試平時用內建網卡連結家裡WIFI,外出時在使用網孔+外接網卡做WIFI基地台
    請問這是可行的嗎?
    如果是的話,該如何設定呢?

    謝謝 !

    回覆刪除