Raspberry遠端控制 —— 私網地址NAT到公網

0x7e2發表於2020-04-04

實驗環境

  • 樹莓派 3B(包含一個8GB記憶體卡,越大越好)
  • MacOS 10.15.4(Windows 也可,別是樹莓派就行)

目標

  • 樹莓派開機自動連線伺服器
  • 遠端 ssh 連線樹莓派

為樹莓派安裝系統

推薦下載官方提供的 raspbain 系統,後期可以通過修改 SD 卡中的配置檔案,連線上 WIFI 網路。下載其他映象可能做不到這一點。

如果手頭的開發機系統是 *inux ,可以使用dd命令來將映象燒寫到 SD 卡。如果是 Windows 系統的話,可以考慮使用一些其他的軟體去燒寫。

MacOS 下,dd燒寫映象到SD卡的參考命令如下:

# 假設SD卡在系統的裝置檔案是 /dev/disk2s1
diskutil unmount /dev/disk2s1
複製程式碼

寫映象(一定小心)

sudo dd bs=4m if=/path_to/your_operator_system.img of=/dev/disk2
複製程式碼

寫映象過程中不會有進度提示,耐心等待即可。

完事兒之後,將 SD 卡插進樹莓派,上電。

顯示器、滑鼠、鍵盤、網線啥啥的往上插就行了。如果沒有顯示器和滑鼠鍵盤的話,則可以通過更改/boot/wpa_supplicant.conf檔案,將 WIFI 連線資訊配進去,然後再上電即可。

配置檔案的參考格式如下:

country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
 
network={
ssid="WiFi-A"
psk="12345678"
key_mgmt=WPA-PSK
priority=1
}
 
network={
ssid="WiFi-B"
psk="12345678"
key_mgmt=WPA-PSK
priority=2
scan_ssid=1
}
複製程式碼

經過重重阻撓,假設已經連線到了網路。

從路由器的裝置列表中找到樹莓派的 IP,假設為 192.168.1.53, 通過以下命令:

ssh pi@192.168.1.53
複製程式碼

即可連線到樹莓派,預設密碼是 raspberry

隨後,更新一下系統依賴即可:

sudo apt update && sudo apt upgrade
複製程式碼

NAT

總所周知,IPv4地址是非常稀缺的資源,目前的話,大概在 20 ~ 30 美元一個。為家裡的每一個裝置都分配一個 IPv4 地址無疑是非常奢侈的一個事情。IPv6 雖說地址足夠多,且現在的支援性雖然好了很多,但是鏈路還是不通暢,還需要時間去成熟。

NAT 全稱是 Network Address Translation,網路地址轉換。通過一定的手段,可以將私網網段的 IP 地址轉換到公網上。當然這裡的前提是我們需要有一個公網 IP 地址。這裡不要買,租就好了。

比較合適的辦法是在雲伺服器廠商打折的時候,買一臺小的 VPS,一般一年也就不到 100 元。

FRP

將私網IP NAT 到公網的方法有很多,比如有ngrok、natapp等等,上述方法都是基於公網環境,條件較差,速度也不是特別理想ngrok私網部署是收費的,且易用性、功能有限。

比較推薦的解決方案是FRP。開源,支援自己部署到 VPS 上。

FRP 分為兩部分,frps和frpc。分別是 server 端和 client 端。繫結了公網IP地址的 VPS 執行 server端,需要遠端控制的樹莓派需要執行 client 端。

FRPC 配置參考

完整的配置檔案參考專案中的frpc_full.ini

其中,server* 要和 frps 中的配置對的上,分別是frps 執行機器所在的公網 IP 地址和執行繫結的 Port。login_fail_exit為 false 的時候,會在斷網時候重試,直到連線成功。

admin_* 部分配置後,即可在本地訪問 http://192.168.1.53:7400,完成對 client 配置的更改和reload

ssh 部分的 remote_port 欄位,值推薦大於 1024,之後可以通過 ssh -oPort=[port] pi@x.x.x.x 通過公網遠端控制樹莓派(自行替換命令中的 IP 和 Port)。

[common]
user = "your_name"
server_addr = x.x.x.x
server_port = 7000
log_file = /var/log/frp/frpc.log
log_level = info
log_max_days = 7
privilege_token = [token]
login_fail_exit = false

admin_addr = 0.0.0.0
admin_port = 7400
admin_user = admin
admin_pwd = admin

[ssh]
privilege_mode = true
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = [port]
use_gzip = true
use_encryption = true
pool_count = 2

[range:VNC]
privilege_mode = true
type = tcp
local_ip = 127.0.0.1
local_port=5901-5903
remote_port= 55901-55903
FRPS 配置參考
[common]
bind_port = 7000
vhost_http_port = [vhost_port]
subdomain_host = [domain]
dashboard_port = 7500
dashboard_user = [username]
dashboard_pwd = [password]
log_file = ./frps.log
log_level = info
log_max_days = 3
privilege_mode = true
privilege_token = [token]
max_pool_count = 50
複製程式碼

下面會以 frpc 為例,說明建立自啟服務的操作姿勢

自啟服務

對於樹莓派,我們希望每次系統啟動的時候,自動執行 frpc,連線到配置好的伺服器上,如果斷網之後,還應該能夠重試下去,保證我們隨時隨地 attach 進系統。

對於上述需求,開機自啟部分可以配置自啟動服務來實現。參考的做法如下:

下載 frp release:

# 樹莓派中執行
wget https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_arm.tar.gz
tar xzf frp_0.21.0_linux_arm.tar.gz
cd frp_0.21.0_linux_arm
複製程式碼

將 frpc 和其配置檔案移動到合適的位置,/etc一般存放配置檔案,/usr/local 一般可以放自己安裝的系統級軟體,/sbin 一般放網路相關。沒有固定的要求,記住放置的位置即可

# 樹莓派中執行
sudo mkdir -p /etc/frpc
sudo mkdir -p /var/log/frp
sudo cp frpc /usr/local/sbin
sudo cp frpc.ini /etc/frpc
sudo touch /var/log/frp/frpc.log
複製程式碼

建立系統服務檔案,ExecStart 位置一定得指對

sudo vim /etc/systemd/system/frpc.service
複製程式碼

參考格式如下:

# /etc/systemd/system/frpc.service

Description=frpc daemon
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/local/sbin/frpc -c /etc/frpc/frpc.ini

[Install]
WantedBy=multi-user.target

複製程式碼

註冊服務自啟

sudo systemctl start frpc
sudo systemctl enable frpc
複製程式碼

大功告成~,Frps 的配置方式和 Frpc 大同小異,不過需要在 VPS 中操作就好了。

之後在隨便任何一臺機器上執行

ssh -oPort=[port] user@public_ip
複製程式碼

就可以通過ssh連線到到樹莓派。還可以通過 ssh 命令的 -i 引數,指定連線用的祕鑰,實現免密連線。這部分會在接下來的文章中進行說明。

感謝閱讀。

長按兩秒識別二維碼關注

Raspberry遠端控制 —— 私網地址NAT到公網

相關文章