docker - 使用 Nginx 反向代理时无法获取客户端的真实 IP
问题描述
问题描述:
当我访问应该返回我的远程客户端 IP 地址的 Asp.net MVC Core 3.1 网页时,我获得了 Nginx 容器的内部 docker IP。我不确定问题是我在 asp.net 核心中的代码、Nginx 反向代理配置未将我的客户端 IP 转发到 Kestrel 容器还是其他原因。
输出:
::ffff:172.23.0.3
所需输出(使用随机 ip 的示例):
231.43.6.124
设置:
- 使用 Ubuntu 并运行 Docker 的远程 VPS(即不在本地运行)
- 没有公共访问权限的 Kestrel docker 容器
- Nginx Docker 容器在端口 80 上具有公共访问权限,并将请求转发到后端 kestrel 服务器。
nginx.conf
http {
upstream backendservers {
server kestrel:80;
}
server {
listen 80;
location / {
proxy_pass http://backendservers/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host:443;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header X-Forwarded-Proto https;
}
}
}
events {
}
asp.net核心代码
// controller
public IActionResult GetIP()
{
var ip = HttpContext.Connection.RemoteIpAddress.ToString();
ViewBag.ip = ip;
return View();
}
// view
@{
ViewData["Title"] = "Get IP";
}
<div class="text-center">
<p>@ViewBag.ip</p>
</div>
Docker启动:
docker network create --driver=bridge stacknet
docker run -d --name=kestrel --restart=always -h kestrel.local --network=stacknet mykestrelimage
docker run -d --name=nginx --restart=always -p 80:80 -h nginx.local --network=stacknet mynginximage
更新 1: 作为测试,我打开了 Kestrel 80 端口。当我直接点击 Kestrel 时,我可以获得客户端 IP,但当它通过 Nginx 反向代理来时,我无法获得它。
更新 2: 根据以下回复之一的建议,在 ngix.conf 中添加了一些行,但似乎没有什么不同。
解决方案
我有类似的问题,这是我尝试过的,它解决了我的问题..
- 去
/etc/nginx/sites-available/
你会发现你已经像这样配置你的服务器的默认文件。
server{ server_name example.com; location / { proxy_pass http://localhost:4000; proxy_set_header X-Real-IP $remote_addr; <---Add this line proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; <---this line too }
2. /nginx 文件夹中还有一个名为 proxy_params 的文件,请确保您在此文件中有以下行。
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 在您的后端代码中最重要的是获得这样的 IP。
const ipAddress = req.headers['x-forwarded-for'] as string;
您也可以通过此命令检查请求 ip。
$ sudo tail -f /var/log/nginx/access.log
推荐阅读
- java - 如何让我的程序循环浏览 wav 文件列表?
- ios - 如何将 UIImage 发送到 Firestore?
- node.js - 在端口 80 上设置时,pm2 多次重启
- android - Markdown 库不支持 android 中的单个 \n
- python - 无法使用 conda 设置 keras
- javascript - React无法使用选项元素读取未定义的属性“值”
- swift - 如何解决 Swift 编译器错误“错误:总线错误:10”?
- javascript - 使用 Laravel Passport 时难以在 React JS 中显示验证错误
- r - 结合公式和整洁的评估(情节)
- java - 使用 javax.xml.namespace.Qname 和 javax.xml.ws.handler.PortInfo 的 Classcast 异常