frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。
1、frp简介
github: https://github.com/fatedier/frp
官方文档: https://github.com/fatedier/frp/blob/master/README_zh.md
下载地址: https://github.com/fatedier/frp/releases
注意事项:
下载的部署包有不同的系统版本, 注意不要搞错, 这里做下简单区分:
以0.32.0版本64位为例:
- frp_0.32.0_linux_amd64.tar.gz
linux
注意是amd和arm,一般是用amd,arm是嵌入式的设备在用 - frp_0.32.0_windows_amd64.zip
windows
- frp_0.32.0_darwin_amd64.tar.gz
mac
也可以使用wget命令去下载, 下载不同版本请记得替换下版本号
wget https://github.com/fatedier/frp/releases/download/v0.32.0/frp_0.32.0_linux_amd64.tar.gz
如果你觉得下载比较慢,可以直接下载我上传的资源,需要一些积分哦,博主下载尝试了好多次才成功的😏。传送门
2、部署
部署分为服务端和客户端,先运行服务端
说下我使用的机器设备:
类别 | 设备 |
---|---|
服务端 | 阿里云服务器ECS(CentOS 7.7 64位) |
客户端 | 树莓派3B+ |
简单说下,博主服务端用的阿里云服务器ECS ,这样你就有了一台有公网ip的机器,如果不是用公网的机器,那只能在局域网中访问了。
客户端用的树莓派3B+ 一个linux小主机,一直在吃灰,这次也算物尽其用了。
你可以选择你有的两台设备分别做服务端和客户端做测试,windows、linux、mac 都可以
2.1 服务端
2.1.1 上传 frp_0.32.0_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.32.0_linux_amd64.tar.gz -C /usr/local
# 进入配置路径
cd /usr/local/frp/frp_0.32.0_linux_amd64
2.1.2 修改frps.ini配置文件
详细配置可以参考官方文档:https://github.com/fatedier/frp/blob/master/README_zh.md
下面博主自己的配置:
[common]
bind_port = 7000
vhost_http_port = 8080
authentication_method = token
# auth token
token = 123456
bind_port
: 提供给客户端访问的端口
vhost_http_port
: 服务端给用户访问的端口,这里可以配合使用域名,后面详细说明
authentication_method
:使用token方式来验证客户端访问
token
:自己定义一个随机数,客户端的token要和服务端token 保持一致,注意不要泄露,防止别人随意蹭服务端提供的服务
2.1.3. 启动
./frps -c ./frps.ini
上面直接启动,关闭连接窗口会关闭进程,可以后台运行
nohup ./frps -c ./frps.ini &
进阶:将服务端frps添加为service
进入/usr/local/frp/frp_0.32.0_linux_amd64/systemd 路径
cd /usr/local/frp/frp_0.32.0_linux_amd64/systemd
修改frps.service文件User=root 或者其他用户, 修改后表示运行此用户操作 frps
可以使用vim,比如:sudo vim frps.service
,怎么使用vi和vim 修改文件,这里不做介绍,大家自行百度
修改后的文件为:
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini
[Install]
WantedBy=multi-user.target
启动程序复制到/usr/bin 目录下,配置文件复制到/etc/frp 路径下,没有frp文件夹,自行创建
# 启动脚本复制到/usr/bin目录下
cp /usr/local/frp/frp_0.32.0_linux_amd64/frps /usr/bin
# 在/etc下新建frp文件夹
cd /etc
mkdir frp
# 复制配置文件
cp /usr/local/frp/frp_0.32.0_linux_amd64/frps.ini /etc/frp
# 复制frps.service
cp /usr/local/frp/frp_0.32.0_linux_amd64/systemd/frps.service /etc/systemd/system
以上操作如没有权限, 请在命令前添加sudo
,或者使用root用户(使用root用户一定要小心操作)
下面尝试使用systemctl来管理frps
# 启动
systemclt start frps
# 停止
systemclt stop frps
# 重启
systemctl restart frps
# 查看状态
systemctl status frps
# 开机启动
systemctl enable frps
2.1.4 测试
访问:http://公网ip:8080
注意: 服务端起来后就可以访问到页面, 这时候还没有客户端提供服务, 等客户端启动后, 就可以访问到具体服务。
2.1.5 其他
如果机器80端口可用的话,标题2.1.2的 vhost_http_port 也可以配置成80端口,这样就可以直接使用http://公网ip
访问了。
如果80端口已经被占用了,我们我可以使用nginx来处理
在nginx配置中添加以下配置:
server {
listen 80;
server_name frp.example.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
}
我们可以使用二级域名,直接访问 http://frp.example.com
访问的请求会自动转发到http://127.0.0.1:8080 上,这里博主的nginx和frp部署在一台机器上。
2.2 客户端
- 解压rp_0.32.0_linux_arm.tar.gz
- 修改frpc.ini配置
# frpc.ini
[common]
server_addr = 公网ip
server_port = 7000
token = 123456
[web]
type = http
local_port = 8081
custom_domains = 公网域名
server_addr
:公网ip
server_port
:服务端定义的端口
token
:和服务端保持一致
local_port
:8081 是客户端机器上提供被穿透的服务的端口,比如你运行了公众号的程序,端口是8081
custom_domains
:公网域名
- 启动
./frpc -c ./frpc.ini
后台运行:
nohup ./frpc -c ./frpc.ini &