nginx-让后端应用获取真实的客户端IP

简介

在使用 nginx 做反向代理时,后端要获取到客户端 IP,需要在 nginx 上设置对应的配置。

设置转发请求头

设置 HTTP 请求头中的 X-Forwarded-For,X-Real-IP

... location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-For $remote_addr; proxy_pass :8080; } ...

X-Real-IP 如果有多层转发,只要在第一层设置就可以了,防止变量被覆盖。 X-Forwarded-For 由于取前一个的值,相当于经过 nginx 代理就会追加一个 IP,只要获取第一个就是真实的客户端 IP。

后端获取

先获取 X-Real-IP如果获取不到 X-Real-IP,通过 X-Forwarded-For 取如果再取不到,就直接取 remote_addr

nginx 配置 X-Forwarded-For 的风险

用户可以通过自己设置请求头来伪造 ip。

比如在发起 http 请求时设置请求头 x-forwarded-for:1.1.1.1。

那么服务器通过 x-forwarded-for 获取到的第一个 ip 就是用户伪造的 ip。

防止伪造方案

在只有 1 层 nginx 代理的情况下,设置 nginx 配置proxy_set_header X-Forwarded-For $remote_addr;

此时$remote_addr 获取的是用户的真实 ip

在有多层反向代理的情况下设置 最外层 nginx 配置和情况 只有一层代理 一样proxy_set_header X-Forwarded-For $remote_addr; 除了最外层之外的 nginx 配置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

这样就防止了用户通过伪造请求头来伪造真实 ip。

后台只需要从 x-forwarded-for 请求头中取出第一个 ip 就是用户的真实 ip。

后面如果有多个 ip,就是反向代理的 ip

#pgc-card .pgc-card-href {text-decoration: none;outline: none;display: block;width: 100%;height: 100%;}#pgc-card .pgc-card-href:hover {text-decoration: none;}/*pc 样式*/.pgc-card {box-sizing: border-box;height: 164px;border: 1px solid #e8e8e8;position: relative;padding: 20px 94px 12px 180px;overflow: hidden;}.pgc-card::after {content: " ";display: block;border-left: 1px solid #e8e8e8;height: 120px;position: absolute;right: 76px;top: 20px;}.pgc-cover {position: absolute;width: 162px;height: 162px;top: 0;left: 0;background-size: cover;}.pgc-content {overflow: hidden;position: relative;top: 50%;-webkit-transform: translateY(-50%);transform: translateY(-50%);}.pgc-content-title {font-size: 18px;color: #222;line-height: 1;font-weight: bold;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}.pgc-content-desc {font-size: 14px;color: #444;overflow: hidden;text-overflow: ellipsis;padding-top: 9px;overflow: hidden;line-height: 1.2em;display: -webkit-inline-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;}.pgc-content-price {font-size: 22px;color: #f85959;padding-top: 18px;line-height: 1em;}.pgc-card-buy {width: 75px;position: absolute;right: 0;top: 50px;color: #;font-size: 14px;text-align: center;}.pgc-buy-text {padding-top: 10px;}.pgc-icon-buy {height: 23px;width: 20px;display: inline-block;background: url(;}高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构¥59.3购买

X-Real-IP

只要 第一层 nginx 代理情况下只需配置即可:

proxy_set_header X-Real-IP $remote_addr;

当有多层反向代理时,只能在最外层代理设置

proxy_set_header X-Real-IP $remote_addr;

如果在非最外层设置,则获取到的是反向代理机器的 ip