Linux

Curl 不會回退到 ipv4

  • September 26, 2018

我已經為 localhost 配置了 ipv6 和 ipv4 的 gentoo 建構

/etc/hosts

# IPv4 and IPv6 localhost aliases
127.0.0.1   sunils-pc.homenetwork sunils-pc localhost
::1     sunils-pc.homenetwork sunils-pc localhost

我已經啟用了 ipv6 轉發,如下所示

sunils@sunils-pc ~ $ cat /proc/sys/net/ipv6/conf/all/forwarding
1

sunils@sunils-pc ~ $ cat /proc/sys/net/ipv4/conf/all/forwarding
1

我已經使用 docker 容器在 8080 處執行了 docker swarm,將 Web 伺服器公開。我可以使用以下命令訪問該網站

curl -4 http://localhost:8080/

但是當我嘗試使用curl http://localhost:8080/它訪問它時,它會無限期地掛起。從詳細的輸出中可以看出,它試圖訪問 ipv4 地址的服務並無限期掛起,而不會退回到 ipv4。

sunils@sunils-pc ~ $ curl -v http://localhost:8080
* Rebuilt URL to: http://localhost:8080/
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.61.0
> Accept: */*
> 

我不確定我應該在哪裡進一步調查。我正在使用啟用了 ipv6 的核心執行 gentoo linux。

==更新

當我使用 ipv4 時,我在終端上得到了正確的 HTTP 響應,但在 ipv6 的情況下,它會無限期地掛起。

sunils@sunils-pc ~ $ curl -4 -v http://localhost:8080
* Rebuilt URL to: http://localhost:8080/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.61.0
> Accept: */*
> 
< HTTP/1.1 200 
< Set-Cookie: XSRF-TOKEN=e20b76f1-78c3-473c-a518-da2519983985; Path=/
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Type: text/html;charset=UTF-8
< Content-Language: en-US
< Transfer-Encoding: chunked
< Date: Wed, 26 Sep 2018 17:13:11 GMT
< 
<!doctype html>
...

根據以下消息,您似乎已通過 ipv6 成功連接到埠:

* Connected to localhost (::1) port 8080 (#0)

由於連接已經進入 ESTABLISHED 狀態,curl 認為這是與 IPv6 主機的成功連接,並且是正確的。

接下來發生的事情是 curl 客戶端將 HTTP 請求發送到埠 8080 上的 localhost(::1)。但是,伺服器永遠不會返回您期望的文件。

此時沒有理由為什麼 curl 會在使用 IPv6 建立連接時重新嘗試使用 IPv4,但是,伺服器沒有發送 HTTP 有效負載。

看來問題可能是伺服器沒有正確綁定到 IPv6 埠,有兩個伺服器實例都在執行,都試圖綁定到 IPv6 埠 8080,或者伺服器綁定到 IPv6 埠的另一個問題使用 IPv4 時不會複製。

引用自:https://serverfault.com/questions/932796