认识 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 位的包