web-dev-qa-db-ja.com

DockerコンテナーからのIPv6接続なし

dockerでIPv6を有効にすると深刻な問題が発生します。

環境

  • ホストはDebian Jessieを実行しています。
  • これは仮想サーバー(KVM)です。
  • eth0は、w:x.y:z ::/64のようなネットワークで静的に構成されたアドレスw:x:y:z :: 1を持っています。これは、ホスティング会社によってmyに割り当てられています。
  • 私のホストはIPv6を問題なく使用できます。外界へのpingは機能し、コンテナー(ホストにバインドされたポート80)で実行されているWebサイトはipv6を介してアクセスできます。

問題

しかし、コンテナの中から外の世界にアクセスすることはできません!以下のパラメーターでdockerを再起動した後、私のdocker0ブリッジにIPv6アドレスがありません。ルートもゲートウェイもありません(ipv6アドレスがないと意味がありません)。

私のDockerセットアップ:DockerはDOCKER_OPTSのこれらのパラメーターで開始されます

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ipv6 --fixed-cidr-v6=w:x:y:z:a::/80"

一部のipv6ホスト構成パラメーター:

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1

これが私が自分で作成したネットワークの1つです。

root@wopr:~# docker network inspect wopr6
[
    {
        "Name": "wopr6",
        "Id": "ddc192d4af2a8edc809975e84cf3e4cb82c24d4cfe970dd8e3fc7d6ff31e20ee",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.23.0.0/16",
                    "Gateway": "172.23.0.1/16"
                },
                {
                    "Subnet": "w:x:y:z:a:0:0:0/80",
                    "Gateway": "w:x:y:z:a::1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "dff30ab1496a4c3689ad6da0837fdb6cf7ea1a5b32312116214313b5b14ed07e": {
                "Name": "happy_varahamihira",
                "EndpointID": "8cd4ed4b91d8421171ec8cc771bbe7b7d81f05dc9f4679f20c642c2e828ec475",
                "MacAddress": "02:42:ac:17:00:02",
                "IPv4Address": "172.23.0.2/16",
                "IPv6Address": "w:x:y:z:a::2/80"
            }
        },
        "Options": {},
        "Labels": {}
    }
]

上記のコンテナ内からの情報は次のとおりです。

住所

root@dff30ab1496a:/# ip -6 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
    inet6 ::1/128 scope Host
       valid_lft forever preferred_lft forever
332: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet6 2a03:4000:6:2158:a::2/80 scope global nodad
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe17:2/64 scope link
       valid_lft forever preferred_lft forever

ルート

root@dff30ab1496a:/# ip -6 r
2a03:4000:6:2158:a::/80 dev eth0  proto kernel  metric 256
fe80::/64 dev eth0  proto kernel  metric 256
default via 2a03:4000:6:2158:a::1 dev eth0  metric 1024

Ping

PING ipv6.l.google.com (2a00:1450:4001:811::200e): 56 data bytes, id 0x0011 = 17
--- ipv6.l.google.com ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

何が欠けていますか?

10
lajuette

答えを2週間待って、報奨金を公開してからさらに数時間調べた結果、解決策を見つけました。

  1. 新しいIPv6対応ネットワークをセットアップし、私が使用できるサブネットを割り当てます(私の/ 64の/ 80)

    docker network create --ipv6 --subnet=w:x:y:z:aaaa::/80 myfancynetwork
    

    コンテナを起動して、新しいネットワークに接続します。 IPアドレスを確認します。この例では、w:x:y:z:aaaa :: 5であるとしましょう。

  2. Proxy_ndpを有効にする

    sysctl net.ipv6.conf.eth0.proxy_ndp=1
    

    この設定を/etc/sysctl.confから構成して、永続化することもできます。

  3. プロキシを追加して、私のホスト(IPv6が有効)がルーターからの近隣要請メッセージ(「hey、who's hosting w:x:y:z:aaaa :: 5?」など)に近隣アドバタイズメントメッセージ(「私になって!」).

    ip -6 neigh add proxy w:x:y:z:aaaa::5 dev eth0
    

    ndppdは、ネットワーク上のホストを自動的にアドバタイズするのに役立ちます。

バム、それだけだ。

5
lajuette