Linux
Curl 不會回退到 ipv4
我已經為 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 時不會複製。