frp内网穿透

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; # 设置代理请求头
        }
    }
    
  2. 测试

# 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. 资料

- 官网
  - 源码:[https://github.com/fatedier/frp](https://github.com/fatedier/frp)
  - 文档: [https://gofrp.org/zh-cn/](https://gofrp.org/zh-cn/)
  - release: [https://github.com/fatedier/frp/releases](https://github.com/fatedier/frp/releases)

## 3. 安装过程

1. 使用frp版本:v0.61.2
2. 在release下载:
  - macos版本「使用客户端」:[https://github.com/fatedier/frp/releases/download/v0.61.2/frp_0.61.2_darwin_amd64.tar.gz](https://github.com/fatedier/frp/releases/download/v0.61.2/frp_0.61.2_darwin_amd64.tar.gz)
    - linux版本:[https://github.com/fatedier/frp/releases/download/v0.61.2/frp_0.61.2_linux_amd64.tar.gz](https://github.com/fatedier/frp/releases/download/v0.61.2/frp_0.61.2_linux_amd64.tar.gz)
3. 服务器端docker容器配置
  - 如果没有构建一个空镜像, Dockerfile
    ```
    # Dockerfile
    FROM scratch
    # 无需其他指令(这是一个完全空的镜像)
    ```
    - 构建镜像
    ```shell
    docker build -t empty-image .
    ```
    - frps.toml 配置
    ```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
    ```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

```ini
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
  ```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; # 设置代理请求头
      }
  }

  ```
2. 测试
  - 穿透网站访问:
    - [http://gzh-dev.rstone.com.cn](http://gzh-dev.rstone.com.cn)
    - [http://gzh-dev-api.rstone.com.cn](http://gzh-dev-api.rstone.com.cn)
  - 访问面板界面
    - [http://ali.rstone.com.cn:7010](http://ali.rstone.com.cn:7010)