在部署网站或应用时,云服务器的公网IP可能会被分配给多个用户,导致请求的源IP无法准确追踪。为了解决这个问题,我们可以通过Nginx配置来实现精准的源IP转发。以下是一些具体的步骤和配置方法。
1. 使用X-Forwarded-For头部
Nginx通过X-Forwarded-For头部来追踪请求的原始IP。当你使用代理服务器或负载均衡器时,它们会添加这个头部,并将客户端的IP地址放在该头部的第一个位置。
配置步骤:
- 在Nginx配置文件中,启用
proxy_set_header指令来设置X-Forwarded-For头部。 - 修改
proxy_set_header指令,确保X-Forwarded-For头部包含客户端的原始IP地址。
server {
listen 80;
server_name example.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend_server;
}
}
在上面的配置中,$proxy_add_x_forwarded_for变量会自动包含客户端的原始IP地址。
2. 修正X-Forwarded-For头部中的IP地址
在某些情况下,X-Forwarded-For头部可能包含多个IP地址,或者需要从中间设备中提取原始IP。以下是一些处理方法:
配置步骤:
- 使用正则表达式来提取或修正X-Forwarded-For头部中的IP地址。
- 使用
map指令来创建一个新的变量,包含修正后的IP地址。
server {
listen 80;
server_name example.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend_server;
map $remote_addr $real_ip {
default $remote_addr;
~^192\.168\.1\. ~ ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) $1;
}
proxy_set_header X-Real-IP $real_ip;
}
}
在上面的配置中,我们使用正则表达式来提取内部网络中的IP地址,并将其设置为X-Real-IP头部。
3. 防止伪造X-Forwarded-For头部
为了防止恶意用户伪造X-Forwarded-For头部,我们可以使用real_ip_header指令来指定信任的代理服务器。
配置步骤:
- 在Nginx配置文件中,使用
real_ip_header指令来指定信任的代理服务器。 - 使用
set_real_ip_from指令来指定信任的IP地址范围。
http {
upstream backend_server {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80;
server_name example.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend_server;
real_ip_header X-Real-IP;
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 10.0.0.0/8;
}
}
}
在上面的配置中,我们指定了信任的IP地址范围,并使用X-Real-IP头部来记录原始IP地址。
通过以上方法,你可以通过Nginx实现精准的源IP转发,避免云服务器IP干扰。这样,你就可以在应用程序中准确地追踪用户请求的来源,从而提高安全性和用户体验。