使用知道创宇云防御后获取访客真实IP的方法

一、使用REMOTE_ADDR获取不到访客真实IP的原因

使用知道创宇云防御等CDN架构服务后,CDN节点作为代理位于用户与源站服务器之间,通过“REMOTE_ADDR”获取访客IP的方法获取到的将是CDN节点IP,而非访客真实IP。针对上述问题,知道创宇云防御默认会通过XFF等字段向网站源服务器传递访客真实IP,服务器获取时只需将原来的“REMOTE_ADDR”调整为“HTTP_X_CONNECTING_IP”或“HTTP_X_FORWARDED_FOR”字段即可。

二、获取访客真实IP的方法

假设访问过程如下:访客本地IP — 代理IP1—代理IP2—云防御节点—网站服务器。

其中直接和云防御节点相连的IP不可伪造,非连接的IP可伪造。如果访客没有使用VPN等代理访问,则除REMOTE_ADDR外得到的IP地址是一样的,均是访客IP。

在网站服务器看到的IP值如下(PHP写法,如$_SERVER[‘REMOTE_ADDR’]):

    • REMOTE_ADDR:节点IP;
    • HTTP_X_FORWARDED_FOR:访客IP,代理IP1,代理IP2;
    • HTTP_X_REAL_FORWARDED_FOR / HTTP_X_CONNECTING_IP:代理IP2,一般推荐使用这个,即直接和云安全节点相连接的IP,因为没有直接和云安全节点连接的IP是可伪造的。

通过REMOTE_ADDR获取节点IP,通过代理字段获取访客真实IP。

Nginx配置示例:

log_format  main  ‘$remote_addr $http_x_connecting_ip – $remote_user [$time_local] “$request” ‘

                       ‘$status $body_bytes_sent “$http_referer” ‘

                      ‘”$http_user_agent” $request_time “$upstream_http_content_type”‘;

Nginx如上配置后的效果:

1.1.1.1 2.2.2.2 – – [26/Apr/2017:03:49:15 +0000] “GET / HTTP/1.1” 200 13459 “-” “Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)” 0.516 “text/html; charset=UTF-8”

以下为ASP、ASP.NET、PHP、JSP代码示例:

ASP:Request.ServerVariables("HTTP_X_CONNECTING_IP")

ASP.NET(C#):Request.ServerVariables["HTTP_X_CONNECTING_IP"]

PHP:$_SERVER["HTTP_X_CONNECTING_IP"]

JSP:request.getHeader("X-Connecting-Ip")