本文使用的软件、硬件环境如下

  • 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

官方文档https://gofrp.org/docs/

为什么要使用FRP?

相信很多人也跟我有一样的需求,比如在外面访问家里的智能设备、电脑等,这时就可以通过内网穿透来解决。常用的内网穿透应用场景如下:

  • 在家访问公司内部的办公OA等相关系统。
  • 在外访问家里的监控。
  • 在外访问家里的路由器以及管理智能家居等设备。
  • 在外访问内网主机,如Windows远程桌面连接,Linux服务器SSH连接等。

准备工作

  1. 需要一台具有公网IP的服务器。
  2. Docker、Docker Compose环境。

原理

frp 主要由frps(服务端)frpc(客户端)组成。frps 是frp中的服务端,一般部署在具有公网IP的服务器上。frpc 是frp中的客户端,一般部署在需要内网穿透的内网服务器上。其本质就是将内网服务器端口与公网服务器端口进行映射来实现。

部署

公网服务器

  1. 创建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
  2. 创建frps.ini文件

    touch frps.ini

内网服务器

  1. 创建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
  2. 创建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系统,请关闭防火墙