为什么我无法使用 127.0.0.1 访问此应用程序?

为什么我无法使用 127.0.0.1 访问此应用程序?

我在 Ubuntu 上端口 80 上的 docker 容器中有一个 .net core 应用程序,它似乎绑定开始侦听 http://[::]:80 (ipv6)?。

我不认为这是 .net 特有的,而是 Ubuntu 盒子上的网络设置。

当我对本地主机执行 wget 时,我收到以下回复:

 wget localhost
--2022-03-14 17:47:59--  http://localhost/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html.27’

然而,当我使用地址 127.0.0.1 执行 wget 时,它会给出 404 not found。

wget 127.0.0.1
--2022-03-14 17:50:10--  http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2022-03-14 17:50:10 ERROR 404: Not Found.

从我读到的内容来看,这是由于 ipv6 和我的应用程序绑定到 ::

我尝试在 ubuntu 盒子上禁用 ipv6,除了阻止 wget localhost 返回任何内容之外没有任何效果。

谁能让我知道我做错了什么?

答案1

您当前正在侦听容器中的 IPv6 地址。

使用 时http://localhost,您的操作系统将尝试 IPv4 和 IPv6。您可以在/etc/hosts文件中验证这一点,因为 localhost 已映射到 IPv4 和 IPv6127.0.0.1以及::1.

例如,这是我的主机文件的一部分。

127.0.0.1   localhost
127.0.1.1   danny

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
# [...]

如果您想在仅侦听 IPv6 的同时访问容器,您可以使用http://localhost您已经尝试过的方法或使用 IPv6 环回地址 来访问它http://[::1]。括号应该是允许 URL 解释器识别主机的这一部分而不是端口分隔符。

例如,对于wget,您可以像这样使用它:

wget http://[::1]

否则,您还需要侦听 IPv4 地址。因此,将其绑定到0.0.0.0:80而不是[::]:80允许您使用 来访问它http://127.0.0.1


综上所述,由于您在调用时确实收到了响应http://127.0.0.1(它是 404,但它仍然是响应),这意味着可能有另一个服务正在侦听 IPv4 上的端口 80。因此,只需将其从 切换[::]:800.0.0.0:80可能会给您带来错误,表明其他东西正在使用该端口。

相关内容