Google Computer Engine がプログラムを IPv6 ポートにバインドするのはなぜですか?

Google Computer Engine がプログラムを IPv6 ポートにバインドするのはなぜですか?

私は、多数のローカル ポート (およびを含む) にバインドするサーバーを作成しています80。Container 443-Optimized OS (COS) と Docker コンテナーを使用して、Google Computer Engine (GCE) でサーバーを実行すると、ポートは IPv4 ではなく IPv6 にバインドされます。

$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:36265         0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::443                  :::*                    LISTEN
udp        0      0 10.128.0.33:68          0.0.0.0:*

これは重要な区別です。私のプログラムには、 の IPv4 アドレスを使用してローカル インターフェイスに直接接続しようとするロジックがあるためです127.0.0.1

GCE インスタンスで IPv4 ポートを使用するように指定するにはどうすればよいですか?

答え1

編集

注目すべき重要な点が1つあります(コメントで指摘されているように)- IPv4 と IPv6 の両方を使用するインターフェースにバインドされている可能性がありますが、IPv6 ルーティングは Google Cloud では機能しません (まだ内部でサポートされていません)。


つまり、これは Docker のネットワーク処理方法と紛らわしい「機能」であり、IPv6 だけでなく IPv4 接続も許可する必要があることが判明しました。

見るこのStackOverflowの回答詳細については、後世のために以下に回答を引用します。

...github.com/docker/docker/issues/2174は、 で IPv6 のみにバインドを表示することですnetstatが、これは問題ではありません。github の問題では次のように述べられています。

プロキシを設定すると、Docker はループバック アドレス '127.0.0.1' を要求します。Linux は、これが IPv6 に存在するアドレス (::0 として) であると認識し、両方で開きます (ただし、正式には IPv6 ソケットです)。netstat を実行すると、これを認識し、IPv6 であると通知されますが、まだ IPv4 でリッスンしています。設定を少しいじったことがある場合、net.ipv6.bindv6only = 1 に設定して、Linux が行うこのトリックを無効にしている可能性があります。

つまり、IPv6 のみとして表示されているからといって、net.ipv6.bindv6only 設定で IPv6 を IPv6 のみにバインドするように設定していない限り、IPv4 で通信することは可能です。明確にするために、net.ipv6.bindv6only は 0 である必要があります。実行しsysctl net.ipv6.bindv6onlyて確認できます。

関連情報