為什麼我無法使用 127.0.0.1 訪問此應用程序?
我在 Ubuntu 的 80 埠上的 docker 容器中有一個 .net 核心應用程序,它似乎綁定了開始監聽 http://
$$ :: $$: 80 (ipv6) ?. 我不認為這是特定於 .net 的,但更多的是 Ubuntu 機器上的網路設置。
當我對 localhost 執行 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 未找到。
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 返回任何東西之外沒有任何效果。
誰能讓我知道我做錯了什麼?
您目前正在偵聽容器中的 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。因此,只需將其從 切換[::]:80
到0.0.0.0:80
可能會給您一個錯誤,即其他東西正在使用該埠。