Raspberry远程控制 —— 私网地址NAT到公网
实验环境
- 树莓派 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 [email protected]
复制代码
即可连接到树莓派,默认密码是 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] [email protected] 通过公网远程控制树莓派(自行替换命令中的 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 参数,指定连接用的秘钥,实现免密连接。这部分会在接下来的文章中进行说明。
感谢阅读。
长按两秒识别二维码关注 ▼