1. 简介

        FRP(Fast Reverse Proxy):这是一个开源的、高性能的内网穿透和反向代理软件,支持TCP、UDP、HTTP、HTTPS等多种协议。FRP可以将内网服务安全、便捷地通过具有公网IP的节点暴露到公网,实现内网穿透。FRP由客户端(frpc)和服务端(frps)组成,服务端部署在具有公网IP的机器上,客户端部署在需要穿透的内网服务所在的机器上。FRP支持多种代理类型,包括TCP代理、HTTP代理和UDP代理,还支持静态文件服务器,可以将本地文件通过HTTP或HTTPS方式提供给公共网络访问

2. 工作原理

        FRP由两个主要组件构成:服务端(frps)和客户端(frpc)。服务端通常部署在具有公网IP的机器上,而客户端部署在需要穿透的内网服务所在的机器上。工作原理如下:

  • 服务端运行并监听一个主端口,等待客户端的连接。

  • 客户端连接到服务端的主端口,并告诉服务端要监听的端口和转发类型。

  • 服务端fork新的进程监听客户端指定的端口。

  • 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端。

  • 客户端进程再将数据转发到本地服务,实现内网对外暴露服务的能力。

3. 实例

整体文件结构

dev-ops
    ---frpc
        ---config
            ---frpc.toml
        ---docker-compose.yml
    ---frps
        ---config
            ---frps.toml
        ---docker-compose.yml

3.1 服务端

        需要一个公网服务器,上各大主流网站买一个最低配的服务器(2核2G,几十块钱一年),需要的只是其IP。在服务器中安装frp作为server。

编写frps.toml文件

# https://github.com/fatedier/frp/blob/dev/conf/frps_full_example.toml
[common]
# 监听端口
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板的账号密码(修改成自己的)
dashboard_user = admin
dashboard_pwd = admin
# token =

token:如果设置了,需要客户端和服务端保持一致。

docker-compose.yml

# 命令执行 docker-compose -f docker-compose.yml up -d
version: '3.9'
services:
  frps:
    image: fatedier/frps:v0.60.0
    hostname: frps
    container_name: frps
    volumes:
      - "./config/frps.toml:/frps.toml"
    command:
      - "-c"
      - "/frps.toml"
    network_mode: "host"

在服务器中运行这个文件

docker-compose.yml up -d

3.2 客户端

在内网中启动一个frp容器,将需要代理的服务注册到frps服务器。

编写frpc.toml文件

# 服务端地址 https://github.com/fatedier/frp/blob/dev/conf/frpc_full_example.toml
serverAddr = "117.72.37.243"
# 服务端配置的bindPort
serverPort = 7000
# token =

[[proxies]]
# 代理应用名称,根据自己需要进行配置
name = "jenkins-demo"
# 代理类型 有tcp\udp\stcp\p2p
type = "tcp"
# 客户端代理应用IP
localIP = "127.0.0.1"
# 客户端代理应用端口
localPort = 8811
# 服务端反向代理端口;提供给外部访问
remotePort = 8811

[[proxies]]
# 代理应用名称,根据自己需要进行配置
name = "mysql-dashboard"
# 代理类型 有tcp\udp\stcp\p2p
type = "tcp"
# 客户端代理应用IP
localIP = "127.0.0.1"
# 客户端代理应用端口
localPort = 8899
# 服务端反向代理端口;提供给外部访问
remotePort = 8899
  • [[proxies]]:需要代理其他端口只需要添加重复代码,然后按需修改即可代理多个端口。

  • 已经代理两个应用端口,需要在服务器的安全组中添加规则,8811、8899。

docker-compose.yml

# 命令执行 docker-compose -f docker-compose.yml up -d
version: '3.9'
services:
  frpc:
    image: fatedier/frpc:v0.60.0
    hostname: frpc
    container_name: frpc
    volumes:
      - "./config/frpc.toml:/frpc.toml"
    command:
      - "-c"
      - "/frpc.toml"
    network_mode: "host"
docker-compose.yml

注:服务器中启动frps容器、内网启动frpc容器。针对该示例需要在添加服务器安全组规则,7000、7500、8811、8899。

4. 测试

本文参与测试的玩家:

frpc:nas(私有云,一个内网服务器,可以在其中部署应用)。

frps:华为云(2核2G)。

4.1 启动frps容器

4.2 启动frpc容器

4.3 配置安全组规则

4.4 验证

访问 http://服务器IP:7500,进入frps管理界面,账户密码在frps.toml文件中配置,本文都为admin。

可以看到代理的服务应用都注册到frps。

访问 http://服务器IP:8811,已经可以访问到nas中的应用。

注:

1、部署在nas私用云中的应用与部署在电脑本地一样,都是在内网中。

2、后期可能出一篇关于nas的文章。

  不积跬步,无以至千里 --- xiaokai

更多推荐