nps内网穿透https传递用户真实ip

众所周知nps是一款非常方便的内网穿透工具,可以无需修改配置文件即可在线热添加隧道对于看见代码两眼一黑的小白非常友好,

 

但只有http协议可以通过X-Forwarded-For协议来获得用户的真实ip地址,https传输协议不会携带访问者的ip,这会导致做限制或一些统计功能失效。

 

https模式需要Proxy Protocol协议来封装访问者真实ip。

这里我们可以使用haproxy工具。大致原理就是haproxy监听https的443端口,将访问者的ip记录在Proxy Protocol中,并转发到nps https的监听端口,再由nps转到npc上的nginx,这样nginx就能拿到记录在Proxy Protoco中访问者的ip了。

该教程也可适用于frp的Proxy Protocol V2。该方案仅限于tcp隧道。

 

(如果你不想单用户独占443端口可以使用我提供的修改版nps服务端程序。该修改版程序在主机隧道https模式下无需nps接管ssl证书也可以传递访问者ip,部署更加灵活。兼容原版npc客户端程序。修改版nps部署方式跟官方原版一样。

在新增主机页面的Proxy Protocol Version选项里选择v2模式即可)

NPS修改版(使用修改版可直接跳到nginx配置)

 

(NPS最新版自带proxy_protocol功能,无需安装haproxy工具可直接携带访问者ip。前往git下载即可。使用最新版可直接跳到nginx配置)

这里我使用的nps版本0.26.18


首先安装haproxy工具 centos7的yum源库里有haproxy,可以直接执行。(centos安装报错可以尝试换源 )

#centos
yum install epel-release -y
yum update -y 
yum install haproxy -y

#debian
apt update && apt upgrade && apt install haproxy

进行安装。

服务器配置

安装完成就去编辑/etc/haproxy/haproxy.cfg 清除全部内容写入下面的配置,没有就自己创建

frontend https  	#该区段描述接受客户端连接的监听sockets集
    bind *:443  	#hapoxy监听端口
    mode tcp  	#设置Haproxy运行方式
    default_backend web_server  #default_backend:定义默认服务器组

backend web_server 	#用于定义一组后端服务器
    mode tcp 	#设置Haproxy运行方式
    balance roundrobin #指定应用的负载均衡算法
    stick-table type ip size 200k expire 30m
    stick on src
    server web1 127.0.0.1:4433 send-proxy check  #定义后端服务器的地址和参数

修改nps的配文件把80/443端口让出来

在 /etc/nps/conf/nps.conf 处把 ‘http_proxy_port’ 和 ‘https_proxy_port’ 注释掉或者删除

nps创建一条端口为4433的tcp隧道。

最后重启haproxy和nps

systemctl restart haproxy

nps restart

至此服务端配置已完成

nginx配置


在网站配置里加入以下配置

listen 443 ssl http2 后面加上proxy_protocol;

real_ip_header proxy_protocol;
real_ip_recursive on;
set_real_ip_from 127.0.0.1;

ip就填npc所在的系统ip

(在宝塔里应用到一个站点就等于应用到全局?具体自己测试)

这段Nginx配置是为了获取客户端真实IP地址,但这里的real_ip_header proxy_protocol; 表示使用Proxy Protocol协议来获取客户端真实IP.

real_ip_recursive on; 如果有多个代理层,它将尝试从 Proxy Protocol 头部中获取的第一个 IP 地址视为客户端真实IP。

set_real_ip_from 127.0.0.1; 表示信任来自127.0.0.1的Proxy Protocol头部信息,即如果连接是从127.0.0.1发起且使用了Proxy Protocol协议,则其提供的客户端IP地址被认为是真实的

保存即可,至此nginx日志里的访问ip就不再是内部ip

 

如果你只是使用http协议传输只需要在nginx网站配置文件里添加以下代码即可

set_real_ip_from 0.0.0.0/0; 
real_ip_header X-Forwarded-For; 
real_ip_recursive on;

set_real_ip_from 指令定义了哪些IP地址(或者网段)是可信的上游代理服务器来源,只有这些来源的X-Forwarded-For中的IP才会被当作客户端真实IP。而real_ip_recursive on; 则表示如果X-Forwarded-For包含多个IP地址,那么取最左边(第一个)的IP作为客户端真实IP。

评论

  1. lfcz
    2 年前
    2024-3-21 23:54:53

    按照您的文档进行部署,服务器cetos7,nps是官方0.26.10,nps.conf中已设置http_add_origin_header=true。防火墙正常放行4433/tcp。安装的haproxy也是epel源中的。但是haproxy接管之后并不能进行正常的https访问。怀疑是版本或者某处细节问题。

  2. lfcz
    2 年前
    2024-3-22 0:01:12

    另外我在2月初的时候尝试使用新的魔改版本,应该是0.26.17,但是当时存在nps网页端错位和未知项。且在用win和rocky8下用npc进行连接测试出现没有任何回显便结束进程的问题。切换会0.26.10一切正常(均为全新安装,且是先尝试安装的魔改版)所以部署的0.26.10版本。目前这个真实ip这个问题折腾的属实头大。

    • lazy
      lfcz
      2 年前
      2024-3-22 0:20:32

      跟nps版本无关,请检查配置是否正确

      • lfcz
        lazy
        2 年前
        2024-3-22 13:23:49

        已经检查确认配置文件没问题,都是按照文章内设置进行修改的。可否加个联系方式详聊,可有偿

        • lazy
          lfcz
          2 年前
          2024-3-22 13:36:46

          qq:3033392700

          • lfcz
            lazy
            2 年前
            2024-3-22 21:09:00

            已加,请确认

  3. jacky
    2 年前
    2024-6-28 13:23:33

    修改完/etc/haproxy/haproxy.cfg后启动报错怎办,试了很多方式的配置都不行

    • 匿名者
      jacky
      2 年前
      2024-12-10 19:20:34

      亲测成功,需要改/etc/haproxy/haproxy.cfg文件

  4. 匿名者
    2 年前
    2024-12-10 19:19:58

    亲测成功,补充一下, /etc/haproxy/haproxy.cfg 此文件需要自定义编写,最终成功获取真实ip。不动者:Q50938884

  5. 匿名
    2 月前
    2026-5-12 23:34:19

    这个有个问题 他的末尾需要一个空行 不然就会报错

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇