本文使用的软件、硬件环境如下
-
Centos:7.9.2009
-
Docker:23.0.1
-
Docker Compose:v2.6.0
Docker镜像版本如下:
- snowdreamtech/frps:0.51.0
- snowdreamtech/frpc:0.51.0
什么是FRP?
frp 是一个开源
的专注于内网穿透
的高性能的反向代理应用
,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务
以安全、便捷的方式通过具有公网IP节点
的中转暴露到公网
,同时也是现在最常用的内网穿透服务之一。
项目地址:https://github.com/fatedier/frp
为什么要使用FRP?
相信很多人也跟我有一样的需求,比如在外面访问家里的智能设备、电脑等,这时就可以通过内网穿透来解决。常用的内网穿透应用场景如下:
- 在家访问公司内部的办公OA等相关系统。
- 在外访问家里的监控。
- 在外访问家里的路由器以及管理智能家居等设备。
- 在外访问内网主机,如Windows远程桌面连接,Linux服务器SSH连接等。
准备工作
- 需要一台具有
公网IP
的服务器。 - Docker、Docker Compose环境。
原理
frp 主要由frps(服务端)
和frpc(客户端)
组成。frps 是frp中的服务端
,一般部署在具有公网IP
的服务器上。frpc 是frp中的客户端
,一般部署在需要内网穿透的内网服务器
上。其本质就是将内网服务器端口与公网服务器端口进行映射来实现。
部署
公网服务器
-
创建
docker-compose.yml
文件version: '3' services: frp: image: snowdreamtech/frps:0.51.0 container_name: frps restart: unless-stopped volumes: - $PWD/frps.ini:/etc/frp/frps.ini environment: TZ: Asia/Shanghai network_mode: host
-
创建
frps.ini
文件touch frps.ini
内网服务器
-
创建
docker-compose.yml
文件version: '3' services: frp: image: snowdreamtech/frpc:0.51.0 container_name: frpc restart: unless-stopped volumes: - $PWD/frpc.ini:/etc/frp/frpc.ini environment: TZ: Asia/Shanghai network_mode: host
-
创建
frpc.ini
文件touch frpc.ini
TCP配置
frps.ini
配置示例如下:
[common]
# 监听端口
bind_port = 17010
# 面板端口
dashboard_port = 17011
# 登录面板账号设置
dashboard_user = admin
dashboard_pwd = admin
# frp服务端允许代理的端口范围
allow_ports = 7000-20000
# 身份验证
token = 9LgPn249C2NYv1o8ZXY
frpc.ini
配置示例如下:
[common]
# server_addr为FRPS服务器IP地址(即公网IP)
server_addr = xxx
# server_port为服务端监听端口,与frps.ini中的bind_port保存一致
server_port = 17010
# 身份验证,与frps.ini中保存一致
token = 9LgPn249C2NYv1o8ZXY
# frp客户端允许代理的端口范围
allow_ports = 7000-20000
[http_proxy]
# 协议类型
type = tcp
# 内网服务器端口
local_port = 22
# 远程访问端口
remote_port = 17022
配置完成后,使用docker-compose up -d
命令创建容器,就可以通过公网ip:17011
访问frp后台面板,账户和密码是frps.ini
中配置的信息。然后通过公网ip:17022
连接内网服务器。
HTTP配置
frps.ini
配置示例如下:
[common]
# 监听端口
bind_port = 17020
# 面板端口
dashboard_port = 17021
# 登录面板账号设置
dashboard_user = admin
dashboard_pwd = admin
# 设置http及https协议下代理端口
vhost_http_port = 8002
# vhost_https_port = 8082
# frp服务端允许代理的端口范围
allow_ports = 7000-20000
# 身份验证
token = 9LgPn249C2NYv1o8ZXY
frpc.ini
配置示例如下:
[common]
# server_addr为FRPS服务器IP地址(即公网IP)
server_addr = xxx
# server_port为服务端监听端口,与frps.ini中的bind_port保存一致
server_port = 17020
# 身份验证,与frps.ini中保存一致
token = 9LgPn249C2NYv1o8ZXY
# frp客户端允许代理的端口范围
allow_ports = 7000-20000
[http_proxy]
# 协议类型
type = http
# 内网服务器端口
local_port = 18001
# 公网IP(也可以填写解析到该公网IP的域名)
custom_domains = xxx
配置完成后,使用docker-compose up -d
命令创建容器,然后通过公网ip:8002
访问内网服务器服务。
同时配置TCP、HTTP
frps.ini
配置示例如下:
[common]
# 监听端口
bind_port = 17020
# 面板端口
dashboard_port = 17021
# 登录面板账号设置
dashboard_user = admin
dashboard_pwd = admin
# 设置http及https协议下代理端口
vhost_http_port = 8002
# vhost_https_port = 8082
# frp服务端允许代理的端口范围
allow_ports = 7000-20000
# 身份验证
token = 9LgPn249C2NYv1o8ZXY
frpc.ini
配置示例如下:
[common]
# server_addr为FRPS服务器IP地址(即公网IP)
server_addr = xxx
# server_port为服务端监听端口,与frps.ini中的bind_port保存一致
server_port = 17020
# 身份验证,与frps.ini中保存一致
token = 9LgPn249C2NYv1o8ZXY
# frp客户端允许代理的端口范围
allow_ports = 7000-20000
# 内网web服务
[web]
# 协议类型
type = http
# 内网服务器端口
local_port = 18001
# 公网IP(也可以填写解析到该公网IP的域名)
custom_domains = xxx
# 内网ssh
[ssh]
# 协议类型
type = tcp
# 内网ssh端口
local_port = 22
# 远程访问的ssh端口
remote_port = 17080
# 公网IP(也可以填写解析到该公网IP的域名)
custom_domains = xxx
配置完成后,使用docker-compose up -d
命令创建容器,通过公网ip:8002
访问内网服务器服务,通过公网ip:17080
连接内网服务器。
注意:
1、如果你具有公网IP的服务器是云服务器Linux系统,请在防火墙和安全组放行上述与frps配置相关的端口
2、如果内网服务器是Linux系统,请在防火墙开放与frpc配置相关的端口或关闭防火墙(不推荐);如果是Windows系统,请关闭防火墙