
私は、多数のローカル ポート (およびを含む) にバインドするサーバーを作成しています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
て確認できます。