树莓派 + frp + 公网服务器,实现自定义域名内网穿透,暴露内网服务在公网(多 ssh, 多 web)

2023-02-18 14:55:17 浏览数 (1)

认识 FRP

FRP 是 Fast Reverse Proxy 的缩写,一款支持 TCP/UDP 快速反向代理的开源软件,可以很方便的内网穿透。和花生壳、Ngrok 等不同,FRP 客户端和服务端的控制权都在自己手中,这也意味着你需要准备一台有公网IP 的 VPS 运行服务端程序。

参考文档

  • https://github.com/fatedier/frp/blob/master/README_zh.md
  • https://chinsyo.com/2019/08/10/ssh-connect-raspberry-pi-anywhere/

FRP 公网服务器 配置

Linux VM_2_29_centos 3.10.0-514.26.2.el7.x86_64

下载对应版本:https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz

解压:

代码语言:javascript复制
tar -zxvf frp_0.33.0_linux_amd64.tar.gz

移动到 /usr/local/frp:

代码语言:javascript复制
mv frp_0.33.0_linux_amd64 /usr/local/frp

cd 到 /usr/local/frp:

代码语言:javascript复制
cd /usr/local/frp

修改 frps.ini(云服务器要开放对应的端口,如我这使用的:7000 和 9000)

代码语言:javascript复制
# common 公用/通用配置
[common]
# 监听 frpc 的端口,与客户端的 server_port 一致
bind_port = 7000
# 外网访问服务器的端口
vhost_http_port = 9000

对于域名访问:

只要将域名解析到公网服务的 IP 即可。

启动 frps.ini:

代码语言:javascript复制
./frps -c ./frps.ini

加入开机启动:

代码语言:javascript复制
sudo vi /etc/systemd/system/frps.service
代码语言:javascript复制
# /etc/systemd/system/frps.service
[Unit]
Description=frps
After=network.target
[Service]
TimeoutStartSec=30
WorkingDirectory=/usr/local/frp
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target
代码语言:javascript复制
# 刷新服务
sudo systemctl daemon-reload
# 允许开机启动
sudo systemctl enable frps.service
# 运行服务
sudo systemctl start frps.service
# 查看状态
sudo systemctl status frps.service

FRP 树莓派端 配置

Linux raspberrypi 4.19.118-v7l #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l GNU/Linux

下载对应版本:https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_arm.tar.gz

修改 frpc.ini(多 web):

代码语言:javascript复制
# common 公用信息
[common]
# 公网服务器的 IP(假设为 193.112.50.149)
server_addr = 193.112.50.149
# 公网服务器监听的端口,与服务端的 bind_port 一致
server_port = 7000

# 本地 web 服务
[web]
# http 类型
type = http
# 本地 web 服务端口
local_port = 80
# 公网服务器的域名1
custom_domains = zhuoqun.info

# 本地 web 服务,中括号里的 web2 不能与前面同类的配置重名
[web2]
# http 类型
type = http
# 本地 web 服务端口
local_port = 8080
# 公网服务器的域名2(多级域名也可以),注意域名不要重复
custom_domains = python3.top

[ssh]
# type 请求协议
type = tcp
# 本地 ip
local_ip = 127.0.0.1
# 本地 ssh 端口
local_port = 22
# 外网请求过来的端口
remote_port = 6000

另外一台客户端机器启动 frpc 服务(未验证):

代码语言:javascript复制
# common 公用信息
[common]
# 公网服务器的 IP(假设为 193.112.50.149)
server_addr = 193.112.50.149
# 公网服务器监听的端口,与服务端的 bind_port 一致
server_port = 7000

# 本地 web 服务
[web]
# http 类型
type = http
# 本地 web 服务端口
local_port = 80
# 公网服务器的域名
custom_domains = zhuoqun.info

# 本地 web 服务,中括号里的 web2 不能与前面同类的配置重名
[web2]
# http 类型
type = http
# 本地 web 服务端口
local_port = 8080
# 公网服务器的域名
custom_domains = python3.top

# 中括号里的 ssh2 不能与另外一台机器 ssh 配置重名(未验证)
[ssh2]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

启动 frpc.ini:

代码语言:javascript复制
./frpc -c frpc.ini 

启动日志:

代码语言:javascript复制
root@raspberrypi:/usr/local/frp# ./frpc -c frpc.ini 
2020/06/07 01:00:06 [I] [service.go:282] [cebc77f32bea36db] login to server success, get run id [cebc77f32bea36db], server udp port [0]
2020/06/07 01:00:06 [I] [proxy_manager.go:144] [cebc77f32bea36db] proxy added: [web ssh]
2020/06/07 01:00:06 [I] [control.go:179] [cebc77f32bea36db] [web] start proxy success
2020/06/07 01:00:06 [I] [control.go:179] [cebc77f32bea36db] [ssh] start proxy success

加入开机启动:

代码语言:javascript复制
sudo vi /etc/systemd/system/frpc.service
代码语言:javascript复制
# /etc/systemd/system/frpc.service
[Unit]
Description=frpc
After=network.target
[Service]
TimeoutStartSec=30
WorkingDirectory=/usr/local/frp
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target
代码语言:javascript复制
# 刷新服务
sudo systemctl daemon-reload
# 允许开机启动
sudo systemctl enable frpc.service
# 运行服务
sudo systemctl start frpc.service
# 查看状态
sudo systemctl status frpc.service

SSH 连接树莓派

IP 填写公网服务器的 IP: 193.112.50.149

端口填写 ssh 里面填的: 6000

访问 树莓派上的站点

域名 zhuoqun.info 解析到了公网服务器 IP 193.112.50.149 

浏览器访问的端口是 vhost_http_port 填的,即 9000 端口。

个人的:http://zhuoqun.info:9000/

注意事项

如果提示:-bash: ./frpc:无法执行二进制文件: 可执行文件格式错误

那可能是:下载的 tar 跟系统不匹配,如:使用了 arm64 位的包

0 人点赞