1. 程式人生 > 實用技巧 >把樹莓派變身無線AP

把樹莓派變身無線AP

把樹莓派變身無線AP

環境要求:

  • Raspberry Pi 4B(4GB版)
  • TF卡(最小16GB)
  • 乙太網線一根
  • PC機一臺(本例以Mac為例)

本文在2020-11-23做了更新,針對iptables的錯誤給出瞭解決方案

1 系統安裝

1.1 下載系統映象(32bit)

截止到目前(2020-11-20),清華大學開源軟體映象站的樹莓派系統映象最新的版本是 2020-08-20 的,選擇 2020-08-20-raspios-buster-armhf-lite.zip 檔案,將其下載到本地。

1.2 下載 Raspberry Pi Image

這個工具是Raspberry官方提供的傻瓜式將Raspberry Pi OS燒寫到TF卡的軟體,從

清華源 上也可以下載,目前最新的版本是 imager_1.4,根據自己的作業系統,選擇合適的版本下載即可。Mac系統下載 imager_1.4.dmg ,Windows系統下載 imager_1.4.exe ,Ubuntu系統下載 imager_1.4_amd64.deb

1.3 燒寫映象檔案到TF卡

一般選擇16GB的TF卡就夠用了,首先開啟 Raspberry Pi Image 軟體,啟動後介面如下:

點選Operating System下面的 CHOOSE OS 按鈕,選擇 “Erase”

然後把TF卡插在讀卡器上,將讀卡器插入PC機的USB3.0介面,點選 SD Card 下面的 CHOOSE SD CARD 按鈕,選擇剛才插入的TF卡。

接著,點選“WRITE”按鈕,開始對TF卡進行擦除和格式化,等操作完成。

格式化完成後,還是在這個介面中選擇“Use custom”。

並在彈出的對話方塊中找到自己之前下載的映象檔案,然後選擇SD卡為剛才格式化好的TF卡,最後點選“WRITE”,等待映象燒寫完成。

燒寫完成後,會出現一個名叫“boot”的磁碟系統,這裡我們的系統映象就燒寫好了。

2 配置樹莓派

2.1 開啟SSH

用VS Code開啟“boot”,在根目錄系建立一個名為“ssh”的檔案,注意,這個檔案的名字就是“ssh”,全小寫,沒有副檔名,沒有內容。建立好了,直接關閉就行。這樣就可以通過ssh遠端連線樹莓派了。

2.2 使用SSH方式連線到樹莓派

首先給樹莓派插上乙太網的網線,然後通電開機。

稍微等待一會兒,一般家庭用的無線路由器都有自帶的管理軟體,我用的是小米WiFi。通過小米WiFi的APP可以檢視到連線的裝置資訊,找到那個叫“raspberrypi”的裝置,點選檢視聯網資訊,可以獲取的樹莓派在家庭區域網中的ip地址,我這裡是192.168.31.187,記住這個地址,接下來就可以通過終端使用ssh訪問樹莓派了。

啟動終端,輸入命令

~ $ ssh [email protected]

第一次訪問的時候,PC機會要求記錄這個遠端裝置訪問的許可權。所以請輸入“yes”後回車,之後會讓我們輸入樹莓派的賬戶“pi”的登入密碼,預設密碼是“raspberry”,輸入正確後,回車會看到這個歡迎頁面,並看到終端的顯示已經變成“pi@raspberrypi:”的主機資訊了,這表明我們成功通過ssh進入到了樹莓派的系統中。

2.3 給樹莓派換國內源

這個必須做,不然後面會瘋掉。

sudo nano /etc/apt/sources.list

把檔案中的內容註釋掉,新增以下內容

deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib

然後 control-o 回車儲存,control-x關閉。

同樣,將 /etc/apt/sources.list.d/raspi.list 檔案中的內容也替換掉。

sudo nano /etc/apt/sources.list

替換內容為:

deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui

然後 control-o 回車儲存,control-x關閉

2.4 更新

在終端裡執行更新軟體命令先。

sudo apt-get update
sudo apt-get dist-upgrade

2.5 配置

在終端裡執行

sudo raspi-config

會啟動下圖的配置介面,通過鍵盤上的上下方向鍵,選擇 5 Localisation Options ,回車。

進入配置的二級介面後,選擇 L1 Locale ,回車。

這時,樹莓派會先回到終端環境一下,然後很快就會進入下圖這個介面。

首先在這個介面上通過鍵盤方向鍵或者滑鼠滾動那個 Locales to be generated: 區域,直到找到 zh_CN.UTF-8 UTF-8 ,然後按 空格鍵 進行選中,選中效果是會出現一個 “*” 號。完成選擇請回車。

這時會出現下圖的“設定系統的預設本地環境”的介面,這裡我選擇的是 en_US.UTF-8

然後在這個介面上,按動鍵盤的“右箭頭”按鍵,選中 <OK> ,回車,樹莓派會回到終端裡,介面中會出現幾行配置過程資訊,不用管,直接等待它配置完成即可,然後就會回到一開始的配置介面了。

連續按兩下“右箭頭”按鍵,選中<Finish> ,回車。

如果是第一次配置,應該會讓你重啟,直接按照提示指引重啟就行了。

等待差不多1分鐘吧,再使用ssh方式登入到樹莓派上即可。

3 安裝 RaspAP (手動方式)

3.1 原理介紹

首先借用 RaspberryPi 官網上“配置無線接入點”頁面的一張圖 ,來說明一下我們的樹莓派作為無線AP,到底在網路中是什麼角色。

圖中的 RPiPC#1PC#2 共同連線在家庭區域網環境中,它們的IP地址範圍都是“10.10.0.X”的,這個地址範圍是由圖中的 Router 來負責分配的,它們都在由 “Router” 建立的區域網環境中,相互之間是可以通訊的。

配置成無線AP的RPi還有另外一個地址,就是“192.168.4.1”,而圖片中最右側的 Laptop 地址是“192.168.4.2”,也就是說這個“Laptop”是在由“RPi”建立的區域網絡環境中,它只能跟“RPi”通訊。這樣,如果“RPi”能訪問外網的話,“Laptop”就藉助“RPi”也能訪問外網了;如果“RPi”沒有連線外網的網線,不能上網,那“Laptop”也不能上外網,但是它和“RPi”之間還是可以進行區域網通訊的。

3.2 RaspAP介紹

RaspAP 是一個執行在樹莓派上,可以將樹莓派作為無線AP的圖形化管理工具。當我們在樹莓派上安裝了 RaspAP 之後,就可以輕鬆地通過網頁的方式來配置無線AP的功能了。

RaspAP 的官網上給出了一個 “Quick Installer”,其實就是在樹莓派終端執行下面的一條命令

curl -sL https://install.raspap.com | bash

當這條命令自己執行完之後,我們的樹莓派就具有了上圖所列出的一些無線訪問配置資訊。

很遺憾的是,這條命令因為網路的原因在這裡用不了,所以我們需要使用“手動”的方式來安裝和配置。

3.3 RaspAP 手動安裝步驟

手動安裝的指引我參考了 Manual installation 頁面中的步驟,並稍微做了一些調整。下面列出我的安裝步驟。

Step1:安裝必備的依賴

sudo apt-get install lighttpd git hostapd dnsmasq iptables-persistent vnstat qrencode php7.3-cgi

Step2:開啟lighttpd服務

sudo lighttpd-enable-mod fastcgi-php

會看到如下輸出:

Met dependency: fastcgi
Enabling fastcgi-php: ok
Enabling fastcgi: ok
Run "service lighttpd force-reload" to enable changes

繼續執行指令:

sudo service lighttpd force-reload
sudo systemctl restart lighttpd.service

Step3:克隆raspap-webgui原始碼

這個原始碼倉庫在GitHub,由於網路的原因,下載速度很慢,我已經把這個倉庫匯入到了碼雲上,所以克隆地址會跟官網文件的命令不一樣。

pi@raspberrypi:~ $ sudo rm -rf /var/www/html
pi@raspberrypi:~ $ sudo git clone https://gitee.com/ursaminor68/raspap-webgui.git /var/www/html

這時會出現以下輸出:

Cloning into '/var/www/html'...
remote: Enumerating objects: 19377, done.
remote: Counting objects: 100% (19377/19377), done.
remote: Compressing objects: 100% (10829/10829), done.
remote: Total 19377 (delta 7163), reused 19377 (delta 7163), pack-reused 0
Receiving objects: 100% (19377/19377), 20.96 MiB | 2.46 MiB/s, done.
Resolving deltas: 100% (7163/7163), done.

看到這些資訊,就表明克隆完成了。

Step4:一大波指令

以下的指令都是從 RaspAP 的手動安裝指引介面中搬移過來的,直接老老實實把下面的所有指令都執行完就行了。

給“www-dtata”使用者新增sudo的許可權

cd /var/www/html
sudo cp installers/raspap.sudoers /etc/sudoers.d/090_raspap

建立一堆 RaspAP 的配置目錄,新增 /etc/dhcpcd.conf 檔案作為基礎配置檔案。

sudo mkdir /etc/raspap/
sudo mkdir /etc/raspap/backups
sudo mkdir /etc/raspap/networking
sudo mkdir /etc/raspap/hostapd
sudo mkdir /etc/raspap/lighttpd
cat /etc/dhcpcd.conf | sudo tee -a /etc/raspap/networking/defaults > /dev/null

更改一些檔案和目錄的使用者組以及許可權的命令,敲就是了。

sudo cp raspap.php /etc/raspap
sudo chown -R www-data:www-data /var/www/html
sudo chown -R www-data:www-data /etc/raspap
sudo mv installers/*log.sh /etc/raspap/hostapd
sudo mv installers/service*.sh /etc/raspap/hostapd
sudo chown -c root:www-data /etc/raspap/hostapd/*.sh

執行到這裡會看到以下輸出:

changed ownership of '/etc/raspap/hostapd/disablelog.sh' from www-data:www-data to root:www-data
changed ownership of '/etc/raspap/hostapd/enablelog.sh' from www-data:www-data to root:www-data
changed ownership of '/etc/raspap/hostapd/servicestart.sh' from www-data:www-data to root:www-data

繼續執行指令:

sudo chmod 750 /etc/raspap/hostapd/*.sh
sudo cp installers/configport.sh /etc/raspap/lighttpd
sudo chown -c root:www-data /etc/raspap/lighttpd/*.sh

執行到這裡會看到輸出:

changed ownership of '/etc/raspap/lighttpd/configport.sh' from root:root to root:www-data

繼續執行指令:

sudo mv installers/raspapd.service /lib/systemd/system
sudo systemctl daemon-reload
sudo systemctl enable raspapd.service

執行到這裡會看到輸出:

Created symlink /etc/systemd/system/multi-user.target.wants/raspapd.service → /lib/systemd/system/raspapd.service.

繼續執行指令:

sudo mv /etc/default/hostapd ~/default_hostapd.old
sudo cp /etc/hostapd/hostapd.conf ~/hostapd.conf.old
sudo cp config/default_hostapd /etc/default/hostapd
sudo cp config/hostapd.conf /etc/hostapd/hostapd.conf
sudo cp config/dnsmasq.conf /etc/dnsmasq.d/090_raspap.conf
sudo cp config/dhcpcd.conf /etc/dhcpcd.conf
sudo cp config/config.php /var/www/html/includes/

指令太多,怕看序列:)

sudo systemctl stop systemd-networkd
sudo systemctl disable systemd-networkd
sudo cp config/raspap-bridge-br0.netdev /etc/systemd/network/raspap-bridge-br0.netdev
sudo cp config/raspap-br0-member-eth0.network /etc/systemd/network/raspap-br0-member-eth0.network
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/90_raspap.conf > /dev/null
sudo sysctl -p /etc/sysctl.d/90_raspap.conf
sudo /etc/init.d/procps restart

看到以下輸出:

[ ok ] Restarting procps (via systemctl): procps.service.

繼續執行指令:

sudo iptables -t nat -A POSTROUTING -j MASQUERADE

如果執行完後看到如下的錯誤提示:

iptables/1.8.2 Failed to initialize nft: Protocol not supported

請先執行

sudo reboot

把樹莓派重啟,這時你的終端會退出ssh連線,等待1分鐘左右,再次執行ssh登入

ssh [email protected]

然後重新執行

sudo iptables -t nat -A POSTROUTING -j MASQUERADE

發現沒有出錯了,就可以繼續執行下面的指令了

sudo iptables -t nat -A POSTROUTING -s 192.168.50.0/24 ! -d 192.168.50.0/24 -j MASQUERADE
sudo iptables-save | sudo tee /etc/iptables/rules.v4

看到以下輸出:

# Generated by xtables-save v1.8.2 on Sat Nov 21 22:43:02 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Sat Nov 21 22:43:02 2020
# Generated by xtables-save v1.8.2 on Sat Nov 21 22:43:02 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -j MASQUERADE
-A POSTROUTING -s 192.168.50.0/24 ! -d 192.168.50.0/24 -j MASQUERADE
COMMIT
# Completed on Sat Nov 21 22:43:02 2020

然後,繼續執行指令:

sudo systemctl unmask hostapd.service
sudo systemctl enable hostapd.service

看到以下輸出:

Synchronizing state of hostapd.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable hostapd

然後執行

sudo reboot

系統重啟。等待1~2分鐘。你應該能夠看到你的無線網路連線訊號中多了一個“raspi-webgui”

安裝RaspAP成功~~!

4 RaspAP WebGUI

用PC機在無線訊號中找到 “raspi-webgui” 後,點選連線,輸入初始密碼 “ChangeMe” 之後,就可以在PC機的瀏覽器中輸入地址:http://10.3.14.1 ,使用者名稱為 admin ,密碼是 secret ,進入如下畫面

因為我們之前配置了本地語言環境為“zh_CN”,所以看到的是中文介面,很親切吧。
如果你不喜歡“raspi-webgui”這個名字,可以按照下圖的指引修改。


這樣自己容易記,而且也不會跟其他同樣也是用樹莓派做成的無線AP名稱衝突。

其他的配置選項除了修改密碼以外,基本上都不用改,除非你十分清楚自己要改什麼,否則最好不要隨意改動。

5 用ssh登入樹莓派無線AP

如果你的PC機連線了樹莓派的無線AP網路,那麼以後ssh可以通過 10.3.141.1 這個地址來登入樹莓派操作。【強調,即便這時樹莓派沒有連線網線,它的無線AP也可用的】

當你用你的樹莓派做智慧小車的驅動板時,如果你需要通過電腦控制樹莓派,那麼只需要讓你的電腦連線樹莓派的無線AP訊號,然後再選擇ssh方式登入樹莓派,進入樹莓派的終端介面進行程式碼操控即可。