一、http_x_forwarded_for的定义
http_x_forwarded_for是一个HTTP请求头部,在经过代理后保留了原始客户端IP地址并发送到了最终的服务器。Nginx中该头部的完整名称是nginxhttp_x_forwarded_for。
当Nginx作为反向代理服务器时,它会从客户端收到一个HTTP请求,然后转发给后端服务器。这个转发请求会导致客户端的IP地址变成Nginx服务器的IP地址。通过在请求头中添加nginxhttp_x_forwarded_for字段,可以在后端服务器上看到真正的客户端IP地址。
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
二、http_x_forwarded_for的作用
http_x_forwarded_for的主要作用是识别客户端的真实IP地址,解决在代理服务器中无法获取真实IP的问题。
如果没有nginxhttp_x_forwarded_for头部,后端服务器只能看到代理服务器的IP地址。这可能导致错误日志和安全问题。而添加了nginxhttp_x_forwarded_for头部,则允许后端服务器追踪请求的来源,获取真实IP地址。
三、http_x_forwarded_for的安全性问题
http_x_forwarded_for头部可以被伪造,这可能导致安全问题。攻击者可以通过篡改http_x_forwarded_for头部来伪造客户端的IP地址,从而进行攻击。
为了解决此问题,可以通过在Nginx配置文件中添加以下代码,限制http_x_forwarded_for的长度和内容。这样可以防止攻击者篡改http_x_forwarded_for头部,同时保护服务器的安全。
# set the maximum length of the x-forwarded-for header
http {
underscores_in_headers on;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# more good security measures
if ($http_x_forwarded_for ~ "^(.+,)?10\.")
{
return 403;
}
if ($http_x_forwarded_for ~ "^(.+,)?172\.([1][6-9]|[2]\d|[3][0-1])\.")
{
return 403;
}
if ($http_x_forwarded_for ~ "^(.+,)?192\.168\.")
{
return 403;
}
四、http_x_forwarded_for的使用场景
http_x_forwarded_for头部是常用的服务器配置,适用于以下场景:
- 反向代理服务器:使用Nginx等反向代理服务器时,http_x_forwarded_for可以识别客户端真实IP地址。
- CDN缓存加速:CDN缓存加速服务器也需要使用http_x_forwarded_for头部来获取真实的客户端IP地址。
- 防火墙安全:可以通过限制http_x_forwarded_for的长度和内容,来保护服务器的安全。
五、http_x_forwarded_for的注意事项
http_x_forwarded_for头部可能会受到代理服务器的影响而变化。因此需要特别注意以下情况:
- 代理链:如果请求通过多个代理服务器,则http_x_forwarded_for头部可能包含多个IP地址。
- 匿名代理:如果请求通过匿名代理服务器,则http_x_forwarded_for头部可能包含虚假的IP地址。
- 缓存:CDN缓存等服务器可能会缓存http_x_forwarded_for头部,导致后续请求还是使用的缓存的头部。
- 客户端:客户端也有可能篡改http_x_forwarded_for头部,从而影响真实的IP地址。