概述

内网穿透可以解决本地服务器无法被公网访问的问题。所以内网穿透的前提是需要有一台在公网的服务器(既然有公网服务器了,为什么还要访问本地网络?比如调试、比如公网服务器性能差等等都是原因)。
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去动态的配置转发