当前位置: 首页 > 后端技术 > PHP

服务器获取真实客户端IP

时间:2023-03-30 01:53:03 PHP

0x01首先检查一个问题测试环境微信支付通道提示网络环境安全验证失败。请稍后再试。出现这种情况,首先想到的可能是双方网络交互中的微信端验证与我们的参与不一致。查了手册,确定是这种问题,开始排查。获取真实IP的方法可能有误。solid程序的获取和过滤没有问题。反向代理是否向上发散反向代理通过后,由于在客户端和web服务器之间增加了一个中间层,web服务器无法直接获取客户端的ip,只能通过$remote_addr变量获取客户端的ip地址反向代理服务器,检查没有这个问题,再往上走,网络通信工程好的同学表示,绝不认输。可能是NAT分配了出口IP,也可能是负载均衡服务分配异常。先获取我本地的内网和外网IP,方便以后排查#LocalIPifconfig|grep-A1"en"|grep广播|cut-d""-f2#ExtranetIPcurl--silenthttp://icanhazip.com检查谁连接到端口80.netstat-tn|grep80|akw'{print$5}'|awk-F'{print$1}'|grep[localIP]这里有问题,但是没有我的IP,然后用nginx$remote_addr获取的IP作为参考。这是nginx最后一次握手的IP。$remote_addr=10.168.0.0/16段在nginx打印$remote_addr,并将当前机器ip添加到server_name,分别加载均衡IP和本地IP进行测试,最终确定问题出在负载均衡服务器异常。0x02LNMP堆栈使用真正的IPL。PHP在NMP栈中获取到的所有TCP操作信息都是前端Nginx通过fastcgi传递给它的,比如$_SERVER['REMOTE_ADDR']是通过includefastcgi.conf引入的;等于nginx的$remote_addr中的几个变量Nginx:$remote_addr代表客户端的IP,但它的值不是客户端提供的,而是由服务端根据客户端的ip指定的。icanhazip的原理也是一样的。当你的浏览器访问一个网站时,假设中间没有代理,那么该网站的web服务器会将remote_addr设置为你暴露在公网的IP。如果你使用了某个代理,你的浏览器会先访问这个代理,然后由代理转发给网站,这样web服务器就会把remote_addr设置为代理机器的IP,除非代理把你的IP附加到$proxy_add_x_forwarded_for$proxy_add_x_forwarded_for变量在客户端请求头中包含"X-Forwarded-For",有两部分与$remote_addr,用逗号分隔。X-Forwarded-For(简称XFF),X-Forwarded-For是一个HTTP扩展头。RFC2616协议没有定义它。最早由缓存代理软件Squid引入,代表HTTP请求端的真实IP。现在已经成为事实上的标准,被各大HTTP代理、负载均衡等转发服务广泛使用,并写入RFC7239(ForwardedHTTPExtension`标准。$proxy_set_header在排错问题中已经说明,代理可以设置header之后proxy_set_headerHost$http_host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Proto$scheme;X-Real-IP一般如X-Real-IP这样custom头字段通常被HTTP代理用来表示与其产生TCP连接的设备的IP,这个设备可能是另一个代理,也可能是真正的请求者,这取决于通过的层数代理或者是否一直使用真实IP,一路往下传。(切记:客户端上传的任何东西都是不可信的)当使用多层代理或者CDN时,如果代理服务器没有通过用户的真实IP,那么服务器将永远无法获取到用户的真实IP。0x03用户的真实IP从哪里来?宽带提供商提供独立IP。比如家里电信的宽带上网,电信分配了一个公网IP,那么一个请求经过的IP路径如下:此时119.147.19.234会将得到的116.1.2.3附加到header信息并传递给10.168.0.0/32,所以本例中我们获取到的用户ip为:116.1.2.3。如果119.110.0.0/16不在头信息中加上116.1.2.3传给业务服务器,业务服务器只能获取到上层的IP地址。是内网ip,比如isp,长宽比较小。请求路径可能如下:本例中获取到的用户ip为211.162.78.1。在这种情况下,一个IP对应的用户可能有几十个,上百个。手机2G上网网络提供商不能直接向单个用户终端提供IP。以中国移动cmwap上网为例,那么请求路径可能为:本例中获取的用户ip为202.96.75.1。2008年,广东联通手机上网的公网ip只有3个。所以,这种情况下,同一个ip有几十万的用户是很正常的。对于几万、几十万员工的企业,同样会有大量的用户来自同一个IP,可能达到数万,但出口IP可能就那么几个。0x04NAT[NetworkAddressTranslation]中文意思是网络地址转换,它允许整个组织以公共IP地址出现在Internet上。NAT处于OSI参考模型的网络层(第3层),是一种将内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。NAT允许使用私有地址的内部网络连接到Internet或其他IP网络。NAT路由器在将内网的数据包发送到公网时,会在IP包的包头中将私有地址转换为合法的IP地址。RFC1918规定了三个专用地址,作为私有内部网络ClassA:10.0.0.0—10.255.255.255Class10.0.0.0/8B:172.16.0.0—172.31.255.255Class172.16.0.0/12C:192.168。0.0—192.168.255.255192.168.0.0/16这三个私有地址本身是可路由的,但是公网路由器不会转发这三个私有地址的流量;当这些私有地址配置在公司内部时,内部计算机与外部网络通信时,公司的边界路由器会通过NAT或PAT技术将内部私有地址转换为外网IP,外部看到的源地址为公司边界路由转换后的公网IP地址。从某种意义上说,它也增加了内部网络的安全性。这个过程是通过NAT中的本地地址和全局地址的映射表项来实现的,所以必须事先在NAT路由器上配置好这样的映射表项。这样就可以在一个公网IP下下发一个私有IP地址。0x05IPV6要来了?写这篇文章的时候看到一个推送说阿里全面应用IPV6。这件事的意义是相当重大的。我们知道,一个IPv4标准的IP地址由4X8=32个二进制数字组成。理论上,上有2^32个IP地址。等于4,294,967,296,超过42亿个IPv4地址。参考《世界互联网用户统计报告》,目前全球约有4,208,571,287人在上网,这意味着为ipv4地址设计的最大IP地址数量已接近尾声。凑合。说到IPv6,相比IPv4最大的改进就是位数大大增加了,变成了8个4位的16进制数。这意味着有2^128个IPv6地址。地球上的每一粒沙子一分为二,足以存储2^128字节。什么是理论概念?在目前的量子水平上,假设计算设备可以在原子水平上运行,它每千克质量可以存储大约25中的10。幂位,存储2的128次方字节大约需要272万亿=272万亿千克。最后,周末愉快,北京联通已经支持ipv6了,我在望京测试,可以获取到ipv6地址