【发布时间】:2020-10-21 03:56:23
【问题描述】:
问题描述:
当我访问应该返回我的远程客户端 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 中添加了一些行,但似乎没有什么不同。
【问题讨论】:
-
您是否正在实施可用的中间件来进行标头转发? docs.microsoft.com/en-us/aspnet/core/host-and-deploy/…
-
没有。我尝试按照链接的“转发标头中间件顺序”部分进行操作,但在编译时不断出错。 (当前上下文中不存在名称“ForwardedHeaders”)是否缺少一些 using 语句?
-
你需要添加一个 using for
Microsoft.AspNetCore.HttpOverrides -
你能详细说明一些示例代码吗?仍然得到构建错误。顺便说一句 - 作为测试,我打开了 kestrel 端口 80,如果我不使用 nginx 作为反向代理,代码确实可以工作。
-
当您要求 nginx 将 IP 转发为
X-Real-IP标头时,直接在您的代码中读取它。
标签: docker asp.net-core nginx asp.net-core-mvc kestrel-http-server