22308


ubuntu 14.04 上に、 docker をインストールしています。

この上で、コンテナ (elasticsearch) を、適切に host へマッピングしながらデーモン実行して(補足参照)、`netstat
-lnp`を実行したところ、どうも tcp6 に対してのみ port が bind されているように見えます。

[code]

    vagrant@vagrant-ubuntu-trusty-64:~$ netstat -lnp | egrep '(9200|9300)'
    (No info could be read for "-p": geteuid()=1000 but you should be root.)
    tcp6       0      0 :::9300                 :::*                    LISTEN      -               
    tcp6       0      0 :::9200                 :::*                    LISTEN      -
    
[/code]

しかし、この状態でも、 tcp4 での接続は、正しく動作している様子でした。

[code]

    vagrant@vagrant-ubuntu-trusty-64:~$ curl -4 127.0.0.1:9200
    {
      "name" : "Rahne Sinclair",
      "cluster_name" : "elasticsearch",
      "version" : {
        "number" : "2.2.0",
        "build_hash" : "8ff36d139e16f8720f2947ef62c8167a888992fe",
        "build_timestamp" : "2016-01-27T13:32:39Z",
        "build_snapshot" : false,
        "lucene_version" : "5.4.1"
      },
      "tagline" : "You Know, for Search"
    }
    
[/code]

自分の理解ですと、 tcp6 と tcp4 はプロトコルが別なので、 tcp6 で特定の port へ bind していたとしても、tcp4
のプロトコルでは、接続ができないのではないかと思っているのですが、上記の通り、今手元の環境では、そうではない動作をしています。

質問:

  * どうして、 tcp6 でしか bind していないように見えるのに、 tcp4 でアクセスできているのでしょうか。

* * *

補足:

コンテナの実行に利用したコマンドは、次の通りでした。

[code]

    docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch
    
[/code]


CC BY-SA 3.0
2016-02-20T07:25:56.990
22300
2016-02-20T09:02:26.773
2016-02-20T08:27:17.960
754
754
question
ubuntu docker tcp
docker でホストへ bind した port が、 tcp6 に bind されているのに tcp4 で接続できている理由がわからない


OSの仕様上、デフォルトではIPv6のソケットはIPv4の接続も受け付けることができます。  
IPv4のアドレスは自動的にIPv6の「IPv4射影アドレス」に変換されます。

<http://man7.org/linux/man-pages/man7/ipv6.7.html>

>
[code]

>        IPv4 and IPv6 share the local port space.  When you get an IPv4
>        connection or packet to a IPv6 socket, its source address will be
>        mapped to v6 and it will be mapped to v6.
>  
[/code]


CC BY-SA 3.0
2016-02-20T09:02:26.773
22308
2016-02-20T09:02:26.773
3639
22300
answer