您的位置:

nginxhttp_x_forwarded_for的详细解析

一、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地址。