• frp+nginx实现内网穿透


    写在前面:上一篇文章写了关于ngrok+nginx实现内网穿透的流程,并提出了一些存在的问题,昨天试过frp之后,将之前ngrok存在的无法映射本地域名的问题解决了

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

    先决条件

    有一个域名,并解析到自己服务器上,如:*.frp.lestat.me

    有一个具备固定ip的公网服务器

    系统环境

    假设环境为:

    服务器OS:ubuntu17.10

    客户端OS:macOS High Sierra

    以下内容将按照上述环境进行搭建

    部署

    相对于ngrok还需要编译源码,frp方便很多,真正的开箱即用

    服务器

    下载对应操作系统的frp服务端&客户端至服务器和内网电脑

    wget
    https://github.com/fatedier/frp/releases/download/v0.16.1/frp_0.16.1_linux_amd64.tar.gz

    解压

    tar zxf ./frp_0.16.1_linux_amd64.tar.gz
    cd ./frp_0.16.1_linux_amd64
    ll

    目录结构如下(不同版本可能有差异,但大致相似):

    -rw-rw-r--  1 kcptun kcptun   11358 Mar 21 10:11 LICENSE
    -rwxrwxr-x  1 kcptun kcptun 6154432 Mar 21 10:10 frpc*
    -rw-rw-r--  1 kcptun kcptun     126 Mar 21 10:11 frpc.ini
    -rw-rw-r--  1 kcptun kcptun    5306 Mar 21 10:11 frpc_full.ini
    -rwxrwxr-x  1 kcptun kcptun 7586848 Mar 21 10:10 frps*
    -r--r-----  1 root   root     11207 Mar 25 15:38 frps.2018-03-25.log
    -rw-rw-r--  1 kcptun kcptun    2127 Mar 25 13:42 frps.ini
    -rw-rw----  1 root   root       723 Mar 26 05:06 frps.log
    -rw-rw-r--  1 kcptun kcptun    2300 Mar 21 10:11 frps_full.ini
    -rw-------  1 root   root         0 Mar 25 11:12 nohup.out

    编辑配置文件

    vim ./frps.ini

    可参考如下配置:

    # 服务器端监听客户端连接请求的端口
    bind_port = 7000
    
    # 服务器端监听http请求的端口(由于80端口被nginx占用,因此指定其他端口)
    vhost_http_port = 8080
    
    # 服务器用以显示连接状态的站点端口,以下配置中可以通过访问IP:7500登录查看frp服务端状态等信息
    dashboard_addr = 0.0.0.0
    dashboard_port = 7500
    
    # dashboard对应的用户名/密码
    dashboard_user = use
    dashboard_pwd = pwd
    
    # 日志文件路径
    log_file = ./frps.log
    
    # 日志记录错误级别,分为:trace, debug, info, warn, erro
    log_level = warn
    
    # 日志保存最大天数
    log_max_days = 3
    
    # 客户端连接校验码(客户端需与之相同)
    privilege_token = privilege_token
    
    # heartbeat configure, it's not recommended to modify the default value
    # the default value of heartbeat_timeout is 90
    # heartbeat_timeout = 90
    
    # only allow frpc to bind ports you list, if you set nothing, there won't be any limit
    # privilege_allow_ports = 2000-3000,3001,3003,4000-50000
    
    # pool_count in each proxy will change to max_pool_count if they exceed the maximum value
    max_pool_count = 5
    
    # max ports can be used for each client, default value is 0 means no limit
    max_ports_per_client = 0
    
    # authentication_timeout means the timeout interval (seconds) when the frpc connects frps
    # if authentication_timeout is zero, the time is not verified, default is 900s
    authentication_timeout = 900
    
    # 支持外部访问的域名(需要将域名解析到IP)
    subdomain_host = frps.lestat.me

    配置nginx反向代理,将来自80端口并指向*.frp.lestat.me的请求分发至frp服务器http请求的监听端口

    server {
        listen       80;
        server_name *.frps.lestat.me;
    
        location / {
            proxy_pass  http://127.0.0.1:8080;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_max_temp_file_size 0;
            proxy_redirect off;
            proxy_read_timeout 240s;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

    启动frp服务器并后台运行,启动完成后可通过lsof -i :7000查看端口占用情况

    nohup ./frps -c ./frps.ini &

    客户端

    1. 创建目录并解压
    2. 编辑配置文件
    [common]
    server_addr = 服务器IP
    server_port = 7000
    privilege_token = privilege_token
    auth_token = auth_token
    [hccrm]
    type = http
    local_port = 80
    subdomain = hccrm

    启动frp客户端程序

    ./frpc -c ./frpc.ini

    本地apache/nginx虚拟主机配置域名别名(alias),根据自己环境而定

    mamp集成apache配置

    流程图解

    假设甲使用的浏览器希望访问乙所在内网环境服务器的web项目:

    最后

    尝试使用*.frps.lestat.me访问站点看是否正常,相比ngrok的流程,frp省去了编译,少踩不少坑,的确省事多了

  • 相关阅读:
    AJax 源码思路
    C语言博客作业--字符数组
    C语言博客作业--一二维数组
    C语言博客作业--数据类型
    C语言博客作业--函数
    C语言博客作业--嵌套循环
    C语言第三次博客作业---单层循环结构
    C语言第二次博客作业---分支结构
    C语言第一次博客作业——输入输出格式
    C语言博客作业--数据类型
  • 原文地址:https://www.cnblogs.com/wangsongbai/p/9368473.html
Copyright © 2020-2023  润新知