docker搭建frp服务端和客户端

使用docker-compose来搭建frps和frpc

1.搭建frps服务端

  1. 创建FRP目录

    1
    2
    3
    mkdir /opt/docker-compose-data/frp #默认为root用户

    cd /opt/docker-compose-data/frp
  2. 创建 Docker-compose.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # vim docker-compose.yml

    version: '3.3'
    services:
    frps:
    restart: always
    network_mode: host
    volumes:
    - './frps.ini:/etc/frp/frps.ini'
    container_name: frps
    image: snowdreamtech/frps

  3. 创建frps.ini文件

    1
    2
    3
    4
    5
    6
    7
    8
    # vim frps.ini
    [common]
    bind_port=5400 #监听端口

    subdomain_host = xxx.xxx #主域名
    max_pool_count = 5 #最大连接数

    token = pwd12345 #服务端与客户端的认证密钥,要改一个复杂一点的
  4. 启动容器

    1
    2
    3
    4
    5
    #启动容器
    docker-compose up -d

    #查看是否启动成功
    docker ps

1.搭建frpc客户端

  1. 创建FRP目录

    1
    2
    3
    mkdir /opt/docker-compose-data/frp #默认为root用户

    cd /opt/docker-compose-data/frp
  2. 创建 Docker-compose.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # vim docker-compose.yml

    version: '3.3'
    services:
    frpc:
    restart: always
    network_mode: host
    volumes:
    - './frpc.ini:/etc/frp/frpc.ini'
    container_name: frpc
    image: snowdreamtech/frpc

  3. 创建frpc.ini文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # vim frpc.ini
    [common]
    server_addr= 121.1.20.1 #服务端服务器的公网ip
    server_port= 5400 #监听端口
    token = pwd123 #服务端与客户端的认证密钥


    [jellyfin] #如果有多个,这个名称不能重复
    type = tcp
    local_ip = 127.0.0.1
    local_port = 8096 #本地服务端口
    remote_port = 6001 #远程服务器端口
    subdomain = jellyfin
  4. 启动容器

    1
    2
    3
    4
    5
    #启动容器
    docker-compose up -d

    #查看是否启动成功
    docker ps

问题

  1. 服务端不是docker的方式安装的,通过systemd启动frps服务后,想代理tcp 80、443端口,但是一直报错port unavailable,其他tcp端口9000、9001等都能正常被代理。

    服务端配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [Unit]
    Description=Frp Server Service
    After=network.target

    [Service]
    Type=simple
    User=nobody
    Restart=on-failure
    RestartSec=5s
    ExecStart=/usr/bin/frps -c ./frps.ini --log_file ./frps.log
    LimitNOFILE=1048576

    [Install]
    WantedBy=multi-user.target

    报错信息:

    1
    2
    [control.go:447] [54351724c0c3c4be] new proxy [nginx_80] error: port unavailable
    [control.go:447] [54351724c0c3c4be] new proxy [nginx_443] error: port unavailable

    原因:

    User使用nobody没有权限使用80、443端口资源。将其改为root即可。