web-dev-qa-db-ja.com

Curlはipv4にフォールバックしません

ローカルホスト用に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コンテナを使用してDockerSwarmを実行し、8080でWebサーバーを公開しました。以下のコマンドを使用して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対応カーネルでgentoolinuxを実行しています。

==更新

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>
...
2
Xinus

次のメッセージに従って、ipv6経由でポートに正常に接続しているようです。

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

接続がESTABLISHED状態に入ったため、curlはこれをIPv6ホストへの接続が成功したと見なし、正しいです。

次に発生するのは、curlクライアントがHTTP要求をポート8080のlocalhost(:: 1)に送信することです。ただし、サーバーは期待するドキュメントで応答しません。

この時点では、接続がIPv6で確立されたため、curlがIPv4で再試行する理由はありませんが、サーバーはHTTPペイロードを送信しませんでした。

サーバーがIPv6ポートに適切にバインドされていない、サーバーの2つのインスタンスが両方ともIPv6ポート8080にバインドしようとしている、またはサーバーがIPv6ポートにバインドされているという別の問題がある可能性があります。 IPv4を使用する場合は複製されません。

1
Citizen Kepler