frp内网穿透

1.前言

  • 为什不使用ngrok
    • ngrok 免费版本功能有限
    • 只能有一个内网穿透
    • 对外中转网站没有中国网络,速度慢
    • 使用发布的外网地址默认看到的是一个ngrok的提示页,需要使用nginx中转设置 proxy_set_header ngrok-skip-browser-warning 1; 和 proxy_set_header Host fa9c-2409-8a00-1a40-ec90-58d7-daf3-64bb-fb24.ngrok-free.app;
  • 为什使用frp
    • 免费开源版本
    • 有中文帮助文档
    • 使用go语言编写,部署简单
    • 支持多个内网穿透同时发布

2. 资料

3. 安装过程

  1. 使用frp版本:v0.61.2
  2. 在release下载:
  3. 服务器端docker容器配置
    • 如果没有构建一个空镜像, Dockerfile
    # Dockerfile
    FROM scratch
    # 无需其他指令(这是一个完全空的镜像)
    
    • 构建镜像
    docker build -t empty-image .
    
    • frps.toml 配置
    bindPort = 7000
    vhostHTTPPort = 7001
    
    [auth]
    method = "token"
    token = "abc1abxdea98aeclcdd"
    
    [webServer]
    addr = "0.0.0.0"
    port = 7010
    user = "自己设置"
    password = "自己设置"
    
    • 拷贝 frps、frps.toml 两个文件到服务器:/docker-data/frps/app/ 目录下
    • docker-compose.yaml
    services:
      frps:
        image: empty-image                                  # 镜像
        container_name: frps                                # 容器名,相当于docker run命令中的--name
        restart: unless-stopped                             # 之前是什么状态,docker重启后,保持之前的状态(如果之前是stop,那docker重启时,也是stop状态)
        volumes:                                            # 数据卷挂载路径设置,将本机目录映射到容器目录,相当于docker run命令中的-v
          - /docker-data/frps/app/:/app
        environment:                                        # 设置环境变量,相当于docker run命令中的-e
          TZ: Asia/Shanghai
          LANG: en_US.UTF-8
        ports:                                              # 映射端口,相当于docker run 命令中的-p
          - "7000:7000"                                     #bindPort
          - "7001:7001"                                     #vhostHTTPPort
          - "7010:7010"                                     #webServer port
        working_dir: /app                                   # 工作目录  
        command: "/app/frps -c /app/frps.toml"              #必须指定全路径,因为镜像中并不存在这个文件,而是通过卷映射进来的
    
  4. 客户端配置
  • frpc.toml
serverAddr = "ali.rstone.com.cn"
serverPort = 7000

[auth]
method = "token"
token = "abc1abxdea98aeclcdd"

[[proxies]]
name = "rstone-web-nuxt3"
type = "http"
localPort = 3000
customDomains = ["gzh-dev.rstone.com.cn"]

[[proxies]]
name = "rstone-web-backend"
type = "http"
localPort = 8080
customDomains = ["gzh-dev-api.rstone.com.cn"]
  • 启动客户端: frpc -c frpc.toml
  1. 服务器上nginx配置
  • 设置域名gzh-dev.rstone.com.cn 和 gzh-dev-api.rstone.com.cn 都指向 ali.rstone.com.cn
  • ali.rstone.com.cn 开发端口7000、7010
  • 配置nginx
server {
    listen 80;               # 监听端口   
    server_name gzh-dev.rstone.com.cn;      # 域名

    location / {
        proxy_pass http://172.19.0.1:7001; # 代理目标地址
        proxy_set_header Host $host;       # 设置代理请求头
        proxy_set_header X-Real-IP $remote_addr;  # 设置代理请求头
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    # 设置代理请求头
        proxy_set_header X-Forwarded-Proto $scheme; # 设置代理请求头
    }
}

server {
    listen 80;               # 监听端口   
    server_name gzh-dev-api.rstone.com.cn;      # 域名

    location / {
        proxy_pass http://172.19.0.1:7001; # 代理目标地址
        proxy_set_header Host $host;       # 设置代理请求头
        proxy_set_header X-Real-IP $remote_addr;  # 设置代理请求头
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    # 设置代理请求头
        proxy_set_header X-Forwarded-Proto $scheme; # 设置代理请求头
    }
}

  1. 测试