Haproxy搭配NPS内网穿透,获取客户端的源IP

在自建的NAS上搭建了Wordpress网站,把CNZZ站点访问统计的代码添加到了页面,结果发现cnzz的链接被屏蔽了。

然后试了试友盟、百度统计同样也是当成广告给屏蔽了。

关于如何屏蔽广告可参考 NAS上搭建DNS服务,统一屏蔽家庭网络上的所有广告

打开 anti-ad.net 网站,下载一份广告屏蔽地址,查询了下果真被屏蔽了。

所以还是在服务端自己统计吧,虽然结果不太准确,但能有个大概就好。

在Wordpress 上安装 WP Statistics 统计插件后,结果发现客户端地址都是127.0.0.1,也就是说经过NPS穿透后,源地址是无法传递的。

虽然NPS支持http源地址转发,但是https是不可以的 

Nginx文档上了解到,使用 proxy_protocol stream 的方式可以额外添加这个信息,原理如下:

 

proxy protocol

 

可惜目前Nginx默认集成了 http的方式。 如果使用https 则需要tcp的方式携带源地址信息, Nginx默认没有集成,需要临时编译,这样后期自动升级有些麻烦。

所以公网服务器,选择了Haproxy作为网关 ,整个结构运行原理如下:

客户端  -----> Haproxy (携带客户端IP) -----> NPS (TCP隧道透传,公网机器) ----> NPC(TCP隧道透传,内网NAS机器) -----> Nginx (内网NAS机器,设置header 传给PHP程序)--> PHP

Haproxy 增加配置如下:

listen web
        bind 0.0.0.0:443
        mode tcp
        option forwardfor

server web1 127.0.0.1:1443 send-proxy check inter 3000 fall 3 rise 5

NPS、NPC 均不用配置,使用TCP穿透即可。 1433 <---> 1433

内网NAS上的Nginx 增加配置如下:

server {
        listen 1443 ssl http2 default_server proxy_protocol;       # 这里添加 proxy_protocol 协议
        listen [::]:1443 ssl http2 default_server proxy_protocol;  # 这里添加 proxy_protocol 协议 
        
        # 其他信息略...

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_param REMOTE_ADDR $proxy_protocol_addr;  # 这里把客户端源地址,设置到REMOTE_ADDR里,方便 WP Statistics 接收
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }

}

 

这样客户端与内网NAS通信时全程https,并且wordpress 里WP Statistics 统计插件还能够接收到客户端的源IP,效果如下:

WP Statistics

评论列表: