没有所谓的捷径
一切都是时间最平凡的累积

使用nginx tcp转发,如何获取客户端真实IP

站长整理辛苦,觉得有用评论点个赞吧,若转载请注明出处。如果文章内容失效,请反馈给本站,谢谢!

这里要使用的是proxy_protocol,具体做法如下:

1.先要确保nginx支持Real‑IP modules豫章小站
执行命令:

nginx -V 2>&1 | grep -- 'stream_realip_module'
nginx -V 2>&1 | grep -- 'http_realip_module'

有说明支持,默认新版本的都支持。主要是http_realip_module 模块支持就行
2.代理服务器

stream
server {
listen 1.1.1.1:80;
proxy_pass 2.2.2.2:80;
proxy_protocol on;
}
server {
listen 1.1.1.1:443;
proxy_pass 2.2.2.2:444;
proxy_protocol on;

开启proxy_protocol,加参数
proxy_protocol on;

3.源站服务器

listen 80 proxy_protocol;
listen 444 ssl proxy_protocol;

set_real_ip_from 2.2.2.2;
real_ip_header proxy_protocol;
# 替换remote_addr

这样web日志remote_addr就可以获取客户端真实IP
注意源站不能使用443端口,否则会被入侵检测系统判断没有携带SNI而拒绝。

总结:

这里有一个坑,要使用Proxy protocol,就需要两个角色sender和receiver,服务端与接收端之间建立连接后,会先发送一个带有客户信息的tcp header,因为更改了tcp协议,所以接收端也需要支持Proxy protocol,否则不能识别tcp header,导致无法成功建立连接,访问就会出现连接重置的现象。而对于Nginx来说,listen配置中的proxy_protocol是针对监听端口生效的,所以虽然是在server的listen中配置,但实际上对于端口来说算是全局配置。

怎么理解这句话?豫章小站

意思是如果配置了listen 80 proxy_protocol ,那么其他server中的配置的80端口都将受影响,所有请求都会转到proxy_protocol,但浏览器一般是不支持proxy_protocol的,所以会导致其他站点都将无法访问。豫章小站

所以对于同一个Nginx服务端,如果有部分server需要代理协议,部分server不需要代理协议。他们所监听的端口一定要分开,例如:

listen 80;

listen 81 proxy_protocol;

代理服务器配置proxy_pass 2.2.2.2:81;通过转发81来读取数据,这样就把需要代理和不需要代理的区分开。

宝塔面板网站开启CDN后如何获取真实IP地址,nginx宝塔面板网站获取真实ip

nginx使用realip模块获取客户端真实ip,nginx绕过cdn获取真实ip

» 站长码字辛苦,有用点个赞吧,也可以打个
» 若转载请保留本文转自:豫章小站 » 《使用nginx tcp转发,如何获取客户端真实IP》
» 本文链接地址:https://mydns.vip/4851.html
» 如果喜欢可以: 点此订阅本站 有需要帮助,可以联系小站
赞(0) 打赏
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除,联系邮箱:contact@mydns.vip。文章观点不代表本站立场。本站原创内容未经允许不得转载,或转载时需注明出处:豫章小站 » 使用nginx tcp转发,如何获取客户端真实IP
分享到: 更多 (0)

评论 抢沙发


  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

智慧源于勤奋,伟大出自平凡

没有所谓的捷径,一切都是时间最平凡的累积,今天所做的努力都是在为明天积蓄力量

联系我们赞助我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏