Không có kết nối IPv6 từ container docker


11

Tôi đang gặp vấn đề nghiêm trọng khi kích hoạt IPv6 trong docker.

Môi trường

  • Máy chủ đang chạy Debian Jessie.
  • Đó là một Máy chủ ảo (KVM).
  • eth0 có một địa chỉ được cấu hình tĩnh như w: x: y: z :: 1 trong một mạng như w: xy: z :: / 64, được công ty lưu trữ của tôi gán cho tôi.
  • Máy chủ của tôi có khả năng sử dụng IPv6 mà không gặp vấn đề gì: Ping thế giới bên ngoài hoạt động, một trang web chạy trên một container (Cổng 80 bị ràng buộc với máy chủ: 80) có thể truy cập qua ipv6.

Vấn đề

Tuy nhiên tôi không thể truy cập vào thế giới bên ngoài từ bên trong các container! Cầu docker0 của tôi KHÔNG có địa chỉ IPv6 sau khi khởi động lại docker với các tham số bên dưới. Không có tuyến đường và cũng không có cổng (không có ý nghĩa nếu không có địa chỉ ipv6).

Thiết lập Docker của tôi: Docker được bắt đầu với các tham số này trong DOCKER_OPTS

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

Một số tham số cấu hình máy chủ ipv6:

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

Đây là một trong những mạng tôi tự tạo:

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": {}
    }
]

Dưới đây là một số thông tin từ bên trong container, được đề cập ở trên:

Địa chỉ

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

Tuyến đường

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

Bình

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

Tôi đang thiếu gì

Câu trả lời:


5

Vì vậy, sau khi chờ đợi hai tuần để có câu trả lời và nghiên cứu thêm vài giờ sau khi mở tiền thưởng, tôi đã tìm ra giải pháp.

  1. Thiết lập mạng hỗ trợ IPv6 mới và chỉ định một mạng con khả dụng cho tôi (a / 80 of my / 64)

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

    Bây giờ bắt đầu một container và kết nối nó với mạng mới. Tìm địa chỉ IP của nó. Giả sử nó là w: x: y: z: aaaa :: 5 trong ví dụ này.

  2. Kích hoạt proxy_ndp

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

    Bạn cũng có thể định cấu hình cài đặt này qua /etc/sysctl.conf để duy trì cài đặt này.

  3. Thêm proxy để làm cho máy chủ của tôi (bật IPv6) để trả lời các tin nhắn Neighbor Sollicitation từ bộ định tuyến của tôi (như: "hey, ai đang lưu trữ w: x: y: z: aaaa :: 5?") Với các tin nhắn Neighbor Advertising ("điều đó sẽ là tôi!").

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

    ndppd có thể giúp bạn tự động quảng cáo bất kỳ máy chủ nào trên mạng của bạn.

Bam, vậy thôi.


Bạn có thể cài đặt ndppddaemon để tự động hóa việc này.
Michael Hampton

1
@MichaelHampton: Đó chính xác là những gì tôi đề xuất.
lajuette
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.