Nginx反向代理后邮件服务器无法获取客户端真实IP该如何配置
问题根因
Nginx反向代理转发请求时默认不会传递客户端原始IP,后端服务接收到的请求来源就是Nginx的内网IP,所以日志中只会记录Nginx的地址。
第一步:修改Nginx反向代理配置
在现有location块中增加透传真实IP的请求头配置,修改后的完整配置如下:
server { listen 8443 ssl http2; server_name mail.domain.com; location / { proxy_set_header Host $host; # 新增透传真实IP配置 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass https://<internal ip>/; client_max_body_size 0; proxy_connect_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; send_timeout 3600; } }
修改完成后执行nginx -s reload重载配置生效。
第二步:配置后端邮件服务信任Nginx代理IP
仅修改Nginx侧配置不会生效,必须让后端服务信任Nginx的内网IP,才会读取请求头里的真实IP替换日志里的来源IP,以下是常见服务的配置参考:
- 如果后端是Webmail服务(跑在Nginx上):
在后端Web服务的http块中添加如下配置,将192.168.1.10替换为你实际的Nginx本地IP:set_real_ip_from 192.168.1.10; real_ip_header X-Forwarded-For; real_ip_recursive on; - 如果后端是Postfix SMTP服务:
编辑main.cf,添加如下配置:proxy_protocol = yes mynetworks = 127.0.0.0/8 [::1]/128 192.168.1.10/32 # 替换为Nginx的IP - 如果后端是Dovecot IMAP/POP3服务:
编辑dovecot.conf,添加如下配置:trusted_proxies = 192.168.1.10 # 替换为Nginx的IP login_trusted_networks = 192.168.1.10
验证效果
所有配置修改完成后,重载对应服务,再查看邮件服务的错误日志,即可看到真实的客户端IP,后续自动封禁策略直接基于日志中的真实IP配置即可。
内容的提问来源于stack exchange,提问作者vespino
相关产品推荐
相关产品推荐

