概述

通过docker的方式快速的使用内网穿透工具frp。客户端和服务端的镜像都已经封装好了可以直接使用。当前版本是官网的0.44.0版本。
如果不需要镜像制作,可以直接通过快速开始直接使用。最后也会补上如何制作镜像的dockerfile。

快速开始

服务端部署

服务端需要部署到一台公网服务器上。

1)准备配置文件docker-compose.yml
docker-compose.yml

version: '3'
services:
  frp:
    image: ${image}
    container_name: frp
    restart: always
    # network_mode: host
    ports:
      - 7000:7000
      - 7500:7500
      - 4000-5000:4000:5000
    volumes:
      - ${docker_volume_directory:-.}/frp/server/frps.ini:/app/frp/frps.ini
    command: ./frps -c /app/frp/frps.ini
  • 7000:客户端连接服务器的端口
  • 7500:服务器的dashboard端口
  • 4000-5000:可以使用的内网穿透端口。这里最好使用 network_mode: host的网络模式,原因是大批量端口在docker中会消耗过多的资源如果使用主机映射的网络模式则会降低内存使用,特别是服务器内存不够的情况下。

2)准备环境变量文件.env
.env

image=registry.cn-hangzhou.aliyuncs.com/yangqiang-pub/frp-server:0.44.0
docker_volume_directory=/data/docker-data
  • image:已经封装好的镜像。
  • docker_volume_directory:数据文件目录,包括配置。

3) 准备配置文件frp/server/frps.ini
frp/server/frps.ini

在.env的统计目录下面新建文件frp/server/frps.ini

[common]
bind_addr = 0.0.0.0
bind_port = 7000

dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = dashboard的密码

#log_file = /data/docker-data/frp/log/frps.log
#log_level = debug
#log_max_days = 3

authentication_method = token
token = 客户端连接服务端的密码

注意上面两个密码需要填写自己的密码

4)启动服务端

docker compose up -d
  • 可以通过docker logs -f --tail 100 frp查看日志

客户端连接

在你需要内网穿透的电脑上,一般是自己本地的电脑或者本地服务器部署客户端。

1) 准备docker-compose.yml
docker-compose.yml

version: '3'
services:
  frp-client:
    image: ${image}
    container_name: frp-client
    restart: always
    ports:
      - 7400:7400
    volumes:
      - ${docker_volume_directory:-.}/frp/client/frpc.ini:/app/frp/frpc.ini
    command: ./frpc -c /app/frp/frpc.ini
    healthcheck:
      test: ./frpc status || exit 1 
      interval: 5s
      timeout: 3s
      retries: 3
      start_period: 1s

2) 准备环境变量文件.env
.env

image=registry.cn-hangzhou.aliyuncs.com/yangqiang-pub/frp-client:0.44.0
docker_volume_directory=/root/docker-data

3) 准备配置文件
frp/client/frpc.ini

[common]
token = 服务端的token密码
server_addr = 服务端ip
server_port = 7000

admin_addr = 0.0.0.0
admin_port = 7400
admin_user = admin
admin_pwd = 客户端管理密码,连接上管理端后可以新增穿透配置

# 配置客户端管理端穿透出去访问服务端ip:4000就可以访问
[dashboard]
type = tcp
local_ip = 本地ip
local_port = 7400
remote_port = 4000

# 配置一个ssh的内网穿透通过服务端ip:4022可以访问
[ssh]
type = tcp
local_ip = 本地或者局域网ip
local_port = 22
remote_port = 4022

4) 启动客户端
docker compose up -d

镜像制作

服务端

1) 准备dockerfile

Dockerfile

FROM alpine:latest

WORKDIR /tmp/

RUN cd /tmp/ && \
    wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz && \
    tar -xvf /tmp/frp_0.44.0_linux_amd64.tar.gz && \
    mkdir -p /app && \
    mv /tmp/frp_0.44.0_linux_amd64 /app/frp && \
    rm -rf /tmp/frp_0.44.0_linux_amd64.tar.gz

WORKDIR /app/frp

CMD ["./frps","-c","/app/frp/frps.ini"]

2)构建
docker build -t registry.cn-hangzhou.aliyuncs.com/yangqiang-pub/frp-server:0.44.0 .

客户端

dockerfile

FROM alpine:latest

WORKDIR /tmp/

RUN cd /tmp/ && \
    wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz && \
    tar -xvf /tmp/frp_0.44.0_linux_amd64.tar.gz && \
    mkdir -p /app && \
    mv /tmp/frp_0.44.0_linux_amd64 /app/frp && \
    rm -rf /tmp/frp_0.44.0_linux_amd64.tar.gz

WORKDIR /app/frp

CMD ["./frpc","-c","/app/frp/frpc.ini"]

概述

内网穿透可以解决本地服务器无法被公网访问的问题。所以内网穿透的前提是需要有一台在公网的服务器(既然有公网服务器了,为什么还要访问本地网络?比如调试、比如公网服务器性能差等等都是原因)。
frp是开源的内网穿透解决访问,现在用于很多商业场景,比其他的比较稳定。
本教程是针对docker环境搭建的,如果要使用其他方法搭建,可以参考官网教程:官网

服务端搭建

在任意一台可以通过公网服务器上部署服务端

镜像

当前镜像是官网0.44.0版本:
registry.cn-hangzhou.aliyuncs.com/yangqiang-pub/frp-server:0.44.0

准备

  • docker-compose.yml:docker-compose配置文件

    version: '3'
    services:
    frp:
    image: ${image}
    container_name: frp
    restart: always
    ports:
      - 7000:7000
      - 7500:7500
      - 4000-4100:4000-4100
    volumes:
      - ${docker_volume_directory:-.}/frp/server/frps.ini:/app/frp/frps.ini
    command: ./frps -c /app/frp/frps.ini

    注意:4000-4100:4000-4100是代表服务端的4000-4100的端口可以被指定到客户端使用。如果没有配置这个客户端配置了内网穿透后是无法访问的,这是因为服务端在docker容器里面,需要从宿主机转发端口到容器里面然后由容器里面的frp服务端去转发流量。

  • .env: docker-compose环境变量配置

    image=registry.cn-hangzhou.aliyuncs.com/yangqiang-pub/frp-server:0.44.0
    docker_volume_directory=/data/docker-data
    • 如果要指定配置文件地址,配置文件路径:/data/docker-data/frp/server/frps.ini
    • 如果不指定配置就删除这个配置,配置文件路径(docker-compose.yml所在目录):./frp/server/frps.ini
  • frps.ini: frp服务端配置

    [common]
    bind_addr = 0.0.0.0
    bind_port = 7000
    dashboard_addr = 0.0.0.0
    dashboard_port = 7500
    dashboard_user = admin
    dashboard_pwd = admin
    #log_file = /data/docker-data/frp/log/frps.log
    #log_level = debug
    #log_max_days = 3
    # 客户端连接时候的认证方式和内容
    authentication_method = token
    token = aFB4Xruu

启动

把上面的文件准备好后,在同一个目录中应该是下面这种结构

docker-compose.yml
.env
frp/server/frps.ini

执行: docker-compose up -d

客户端搭建

在任意一个内网的机器上部署客户端,让所有通过服务器的流量可以访问指定的内网服务。

镜像

当前镜像是官网0.44.0版本:
registry.cn-hangzhou.aliyuncs.com/yangqiang-pub/frp-client:0.44.0

准备

  • docker-compose.yml:docker-compose配置文件
    version: '3'
    services:
    frp-client:
    image: ${image}
    container_name: frp-client
    restart: always
    ports:
      - 7400:7400
    volumes:
      - ${docker_volume_directory:-.}/frp/client/frpc.ini:/app/frp/frpc.ini
    command: ./frpc -c /app/frp/frpc.ini
  • .env: docker-compose环境变量配置
    image=registry.cn-hangzhou.aliyuncs.com/yangqiang-pub/frp-client:0.44.0
    docker_volume_directory=/root/docker-data
    • 如果要指定配置文件地址,配置文件路径:/data/docker-data/frp/client/frpc.ini
    • 如果不指定配置就删除这个配置,配置文件路径(docker-compose.yml所在目录):./frp/client/frpc.ini
  • frpc.ini: frp客户端配置(注意和服务器端配置名字上的区别)
    [common]
    # 服务端配置的token
    token = aFB4Xruu
    # 服务端服务器的地址
    server_addr = 10.2.138.104
    # 服务端服务器配置的端口
    server_port = 7000
    # 下面是客户端的dashboard访问
    admin_addr = 0.0.0.0
    admin_port = 7400
    admin_user = admin
    admin_pwd = admin
    # 配置dashboard可以通过服务器访问
    [dashboard]
    type = tcp
    # 启动客户端的宿主机地址
    local_ip = 10.51.233.239
    local_port = 7400
    remote_port = 4000
    # 配置一个ssh
    [ssh-10.51.233.145]
    type = tcp
    local_ip = 10.51.233.145
    local_port = 22
    remote_port = 4022

启动

把上面的文件准备好后,在同一个目录中应该是下面这种结构

docker-compose.yml
.env
frp/client/frpc.ini

执行: docker-compose up -d

快速开始

如果服务端ip是:10.10.10.10

  • 通过服务端ip访问本地10.51.233.145机器的ssh:10.10.10.10:4022
  • 通过服务端ip访问客户端的dashboard:10.10.10.10:4000

总结

  • 服务端一定要部署到一台公网机器,并且公网机器被使用到的端口是需要开放出来的
  • 客户端可以部署到任意一台本地机器,只要本地机器可以连接到服务器就行
  • 客户端除了通过frpc.ini配置内网端口转发之外,还可以通过dashboard去动态的配置转发