使用docker部署Frps实现内网穿透

部署环境

  • 阿里云ubuntu系统

部署Frps

  1. 搜索frps镜像

    1
    docker search frp
  2. 拉取frp镜像

    1
    docker pull snowdreamtech/frps
  3. 创建frps目录以及frps.toml配置文件

    1
    2
    3
    mkdir frps
    cd frps
    touch frps.toml
  4. 在frps.toml配置文件中填写配置信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34

    [common]
    # 内网穿透端口配置
    bind_addr = 0.0.0.0
    bind_port = 7000


    # WEB控制面板相关配置
    dashboard_addr = 0.0.0.0
    dashboard_port = 7500
    dashboard_user = admin
    dashboard_pwd = admin

    # 日志相关配置
    log_file = ./frps.log
    log_level = info
    log_max_days = 3
    disable_log_color = false


    # auth token
    token = 12345678

    # 子域名配置
    subdomain_host = frps.com

    allow_ports = 2000-3000,3001,3003,4000-50000

    #转发端口
    vhost_http_port = 80 ; ★ HTTP 代理口(Nginx 经 c_frps:80 转发)
    vhost_https_port = 443

    max_pool_count = 5
    max_ports_per_client = 0
  1. 创建并运行容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    docker run -id \
    --name=c_frps \
    --restart=always \
    --network c_bridge \
    -p 6010:6000 \
    -p 7010:7000 \
    -p 7510:7500 \
    -v /root/songjian/frp/frps/frps.toml:/etc/frp/frps.toml \
    -h c_frps \
    snowdreamtech/frps:latest
  2. 验证程序是否可用

    在浏览器中输入http://服务器ip:7510,看控制面板界面是否能正常打开

    界面如下:

    image-20240104163746870

  3. 至此, frps安装完毕

    接下来,可在需要进行内网穿透的电脑上安装frpc来实现内网穿透,具体详见之前的文章:《使用frp进行内网穿透实现外网访问局域网中的服务器》

注意事项

  1. 如果需要进入容器,可执行以下指令

    1
    docker exec -it c_frps /bin/sh

    注意:这里需要使用/bin/sh,不能使用bash或者/bin/bash,否则会报错

  2. 如果想要实现客户端子域名访问, 首先需要将域名解析到frps所在的服务器ip, 然后在nginx配置中添加域名泛解析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # /etc/nginx/conf.d/frps-vhost.conf
    server {
    listen 80;
    server_name *.frp.cn; # 匹配所有 *.frp.cn

    location / {
    proxy_pass http://c_frps:80; # Docker 内网访问 frps
    proxy_set_header Host $host; # ★ 必须保留原始域名,frps 靠它路由
    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;
    }
    }

这样frpc客户端那边通过subdomain属性配置就能设置子域名访问了

  1. 如果想要让服务器当做内网穿透跳板机, 也就是支持任意个人域名而非单纯子域名, 那么需要在nginx配置文件中做如下设置:

    1
    2
    3
    4
    5
    6
    7
    8
    server {
    listen 80 default_server; # 兜底所有未单独配置的域名
    server_name _;
    location / {
    proxy_pass http://frps容器名:80;# 端口对应frps配置中的vhost_http_port
    proxy_set_header Host $host;
    }
    }

    这样frpc客户端那边通过custom_domains属性配置就能设置自定义域名访问了, 注意的是自定义域名同样要解析到服务器ip或者域名才能正常访问

  2. 如果frpc客户端链接提示拒绝, 通常是端口不通导致的, 这里需要将客户端的设置和frps服务端设置保持一致, 因为我们使用了docker映射, 以宿主端口7010映射到容器的7000为例, frpc配置文件中的端口应该填7010而非7000

    示例配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [common]
    server_addr = 服务器ip或者域名
    server_port = 7010 #对应bind_port的映射端口
    token = 12345678


    [mac_http]
    type = http
    local_ip = 127.0.0.1
    local_port = 13000
    subdomain = git

    frpc配置三件套: 地址+端口+密钥

  1. 如果frpc客户端连接超时,有可能是服务器未开放7010端口, 需要去服务器运营商安全组开启该端口

  2. frpc 客户端报错 Send login request to plugin error

    这有可能是因为frps 配置了 [plugin.user-manager] / [plugin.port-manager]等插件导致的, 去frps配置文件中将plugin插件板块相关配置全部删除即可

TCP穿透

假设你在网上找了一个免费的内网穿透跳板机, 拿到了它的ip和端口以及登录token, 但是没有对方的域名, 而且对方的服务也不支持自定义域名, 此时隧道虽然顺利打通, 但不知道怎么访问本地服务

此时我们可以换成TCP的访问模式, 只需要在本地frpc客户端配置文件中做如下配置:

1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 跳板机IP ; 比如 5.6.7.8
server_port = 7000 ; frps 控制口
token = xxx ; 密钥

[my1300]
type = tcp
local_ip = 127.0.0.1
local_port = 1300 ; 你本地要暴露的服务
remote_port = 21300 ; ★ 服务器上对外暴露的端口(frps 分配的)

然后在任意浏览器输入http://跳板机IP:21300即可访问本地1300端口对应的服务了, 但有一个前提是21300要在对方的开放端口范围内才行, 这个问题就只能靠换端口测试来验证了

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%