传递最终真实请求 IP
源站获取客户端真实 IP
CDN 回源时会将客户端真实 IP 放在请求头中的 Cdn-Src-Ip 字段中,可以在源站使用 tcpdump 抓包拿到请求信息:
[root@iz28wru16cpz ~]# tcpdump -i any -Ans 0 'dst port 80'
……
r...P..h....GP....~..GET / HTTP/1.1
Host: www.fangwenjun.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: _ga=GA1.2.1951940815.1541592777; _gid=GA1.2.395342428.1541592777; __atuvc=2%7C45
Cdn-Src-Ip: 111.22.13.3
Accept-Encoding: gzip
X-Via: 1.1 zhdx151:8 (Cdn Cache Server V2.0), 1.1 tongdianxin97:6 (Cdn Cache Server V2.0)
Connection: keep-alive
其中 Cdn-Src-Ip: 111.22.13.3 中的 111.22.13.3 就是客户端请求的真实 IP。
输出真实 IP 到日志文件中
以 nginx 为例,如果希望将客户端真实 IP 输出到日志中,可以在 nginx 配置文件中的 log_format 中 加入 "$http_cdn_src_ip",例如下面这样:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$http_x_real_ip" "$http_cdn_src_ip"';
然后在对应的 vhost 的 access_log 中引用上面的 main 日志格式,其日志输出为:
183.6.210.83 - - [08/Nov/2018:09:02:04 +0800] "GET /Linux/(https://file.awen.me/img/2017/03/2008971626.png!awen_800) HTTP/1.1" "404" 2662 "http://www.fangwenjun.com/Linux/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" "-" "-" "111.22.13.3"
最后一个字段就是新加的 $http_cdn_src_ip。
在响应头中获取真实 IP
如果希望用户访问时候能够查看到该字段,则可以在对应的配置文件中添加一个响应头来传递该值,以 nginx 为例:
listen 80;
server_name www.fangwenjun.com;
index index.html index.htm;
root /www/www;
add_header Cdn-Src-IP $http_cdn_src_ip;
……
则浏览器访问时,响应头中就会带有 Cdn_Src_IP:
Cdn-Src-Ip: 111.22.13.3
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Date: Thu, 08 Nov 2018 01:14:58 GMT
ETag: W/"5bbb212a-636b"
Last-Modified: Mon, 08 Oct 2018 09:19:38 GMT
Server: awen/1.0.0
Transfer-Encoding: chunked
X-Cache: MISS from cache.51cdn.com
X-Via: 1.1 dxinxzai155:2 (Cdn Cache Server V2.0), 1.1 hzhdx21:0 (Cdn Cache Server V2.0)
程序中获取真实 IP
如果希望在程序中获取该字段,不同的编程语言都有对应的获取 HTTP 头部的方法,可以查看对应语言的手册,以 PHP 为例,获取方法如下 :
<?php
$ip = $_SERVER["HTTP_CDN_SRC_IP"];
echo $ip;
?>