前往
大廳
主題

利用樹莓派充當臨時AP心得

永遠的新手 | 2022-05-01 22:48:25 | 巴幣 0 | 人氣 308

因為最近無線網路的設備越來越多,最近發現有時會斷一下又重新連線,但訊號等級其實還不錯,因此並非訊號不佳導致,推測是我那低價AP負荷過重了,但是要升級也得評估一下該換什麼,要點時間。此時看到桌上那台平常開著當小伺服器但沒用上無線網路的樹莓派,突然想為何不先開個輔助AP呢,於是就有了這篇文。

首先要說明的,樹莓派要當作AP並不是很困難,網路上都有教學文件,只要是使用有內建無線網路的機板應該很輕鬆,當然如果是需要外接USB無線網卡的可能就是另一個故事了。但是並不是很建議用在日常場合,因為它的內建天線不是效率很高的,而且即使改裝機板,焊接了外接天線,它內部溝通界面是SDIO,經過測試跑到133MB/s已經是極限,不能和專業的分享器比,只能應應急或當需求低的。

接著介紹我使用2022年的作業系統的流程。因為我還要跑其他服務,因此不可能直接拿現成的作業系統映像(像 OpenWRT) 所以是直接安裝在標準的 Raspberry Pi OS bullseye 上,同時藉由這次經驗了解有什麼調整參數可用。

首先要安裝 AP 模式軟體 hostapd,另外還要 DHCP server 。我的參考文件是
https://blog.gtwang.org/iot/setup-raspberry-pi-as-wireless-access-point/2/ 那篇是2016年的。DHCP server 我是選擇 dnsmasq, 它同時具備 DHCP、DNS以及TFTP server的能力,對小規模的很合適。
我的需求是涵蓋範圍不用廣,因此選擇5GHz的無線網路,設定值大概如下
interface=wlan0
hw_mode=a
channel=149
ht_capab=[HT40+][SHORT-GI-20][SHORT-GI-40]
ieee80211d=1
country_code=TW
ieee80211n=1
ieee80211ac=1
wmm_enabled=1
macaddr_acl=0
auth_algs=1
accept_mac_file=/etc/hostapd/hostapd.deny
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ssid= MY_SSID
wpa_passphrase= MY_PASSWORD

其他設定都和參考文件差不多,但橘色的是我改過的, 要使用802.11ac網路要設定hw_mode=a, 如果是11n的就是=g
channel 的話,能選的範圍有限,而且會計算你的 country_code, 台灣的話AC部份就是36-48 以及149-161間吧,設錯了是無法啟動的,我還是乖乖做合法的好公民。
上面的設定後,會開啟20MHz的信道,這樣效能上比較不那麼高。因為我都已經放5GHz範圍了,設定了 hd_capab 那行以後就可以有40MHz的信道,手機連線後顯示200MB/s速度。當然,看看別人的AP動輒80MHz...但是樹莓派就只能開到40了,而且如上所述,就算能開80也沒有意義啊...
紫色的字就替換成SSID和密碼了,顯然,/etc/hostapd/hostapd.conf 必須把權限設定為600才行...

DNSMasq 設定
/etc/dnsmasq.conf 設定如下。無線網路界面wlan0我設定為 192.168.3.14 /24 (固定IP)

interface=wlan0
dhcp-range=192.168.3.32,192.168.3.63,24h
dhcp-option=1,255.255.255.0     #subnet mask
dhcp-option=28,192.168.3.255   #broadcast
dhcp-option=3,192.168.3.14      #default gateway
dhcp-option=option:dns-server,8.8.8.8,8.8.4.4
bind-interfaces
domain-needed
local=/home/
該伺服器只要監聽無線網路就可以了,有線網路不要,所以設定第一行是那樣。

防火牆設定
要對無線網路開啟 UDP 67 以及 UDP 53 兩個 port,另外要開啟IP轉送讓手機的訊息可以從無線界面轉到有線網路然後送出,反方回應也能轉去無線網路發給手機,以下是 iptables 的設定(只寫相關部份)
# 當是從無線網路進入時,跳至無線網路特殊規則 apserv
-A INPUT -i wlan0 -j apserv
# apserv: 開啟 DHCP (UDP 67) 以及 DNS (UDP 53) 服務
-A apserv -p udp -m udp --dport 53 -j ACCEPT
-A apserv -p udp -m udp --dport 67 -j ACCEPT
# 無線網路和有線網路間的資料轉送
-A FORWARD -i eth0 -o wlan0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i wlan0 -o eth0 -j ACCEPT
# 對外IP假面
-A POSTROUTING -o eth0 -j MASQUERADE

還有 /etc/sysctl.conf 的這行要打開:
net.ipv4.ip_forward=1

弄好以後,開始啟動 dnsmasq 以及 hostapd 服務...
sudo systemctl start dnsmasq.service
sudo systemctl start hostapd.service

嗯,手機上顯示網路了,連接成功了...但是過幾分鐘突然斷線,而且無線網路不見了??!
這問題一開始煩擾我一兩個鐘頭,後來發現是無線網路狀態被切換回 managed 模式了,導致AP不見。是誰害的? 最後查出是處理 WPA  加密的 wpa_supplicant 害的。這玩意平常使用無線網路連線是必須的,但當作AP時是沒有用的,只是單純關閉它好像沒用,最後才發現要改 /etc/dhcpcd.conf 裡面,加入界面設定:

interface wlan0
    static ip_address=192.168.3.14/24
    nohook wpa_supplicant

這樣這個界面喚起時就不會動到 wpa_supplicant 了,也不會自動掃描和改模式了,如此大功告成。
實際連接相當穩定。

實際成果
我的5台設備連上了它,減輕了主AP的壓力,也不再跑出斷線訊息了。當然如果全部拿出來應該還是會重現,但應該很少會這樣。另外拿 speedtest 來跑,上傳40M, 下載61M, 其實蠻可以接受的。看來在下次有客人到家以前,應該有充裕時間評估新的分享器該選什麼了。

題外話

創作回應

更多創作