本篇文章已有198人收藏 | Loading收藏

Frp内网穿透群晖NAS时获取到用户真实IP地址

适用于系统:DSM 6.2.3

前言

我在路由器使用 Frp 内网穿透 NAS 地址后,查看登陆日志全都是路由器的 ip, 这样子不仅无法封锁真实用户 ip,而且当NAS登录接口遭到爆破时系统会自动封锁路由器的ip导致用户自己也无法正常登录。

解决办法

  • 内网使用 http 采用 X-Forwarded-For 来获取 ip
  • 外网使用 https 采用 proxy protocol 来获取真实 ip
  1. 开启 Proxy-Protocol,版本V1、V2都可以,我以 OpenWrt 中 Frp 设置为例
    use-frp-to-get-real-ip-in-synology-step-01.png
  2. 修改 Nginx配置文件 → nginx.mustache
    SSH连上群晖,依次执行以下命令:

    cd /usr/syno/share/nginx
    
    vim nginx.mustache
    

    注释以下内容,大概在64行
    use-frp-to-get-real-ip-in-synology-step-02.png

  3. 修改 Nginx配置文件 → DSM.mustache
    首先,在第一个 server 块的 listen 下面增加如下内容:
    use-frp-to-get-real-ip-in-synology-step-03.png
    real_ip_header     X-Forwarded-For;
    real_ip_recursive  on;
    set_real_ip_from   127.0.0.1;
    

    然后,在第四个 server 块的 listen 下面增加以下内容:
    use-frp-to-get-real-ip-in-synology-step-04.png

    real_ip_header            proxy_protocol;
    real_ip_recursive         on;
    set_real_ip_from          127.0.0.1; # 这里改为 Frp客户端所在设备的ip
    
  4. 重启 Nginx 服务
    # 重启 nginx
    synoservicecfg --restart nginx
    

结语

完成以上修改后,局域网将无法通过 https://ip:port 访问 DSM 桌面,但可以通过 http://ip:port 访问,因为 proxy protocol 实际上是在建立连接前先发送一个带有 realip 等信息的包,如果不通过代理去访问(比如内网使用 https+ip 访问), 就没有这个包,就会报错打不开页面。