因為最近無線網路的設備越來越多,最近發現有時會斷一下又重新連線,但訊號等級其實還不錯,因此並非訊號不佳導致,推測是我那低價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, 其實蠻可以接受的。看來在下次有客人到家以前,應該有充裕時間評估新的分享器該選什麼了。
題外話
原來像NodeMCU這種小型有WiFi的微電腦都可以改成強波器啊... 不過網速就不要計較了