docker容器内支持IPv6

有多种方法可以实现

  • 使用host类型网络
services:
  web:
    image: haohetao/nginx
    restart: always
    network_mode: "host"

这样容器内直接使用宿主机的IP地址,而且这种情况下不再需要对外公布端口,因为端口直接就在宿主机上

  • 给宿主机分配私有IPv6地址

    /etc/docker/daemon.json添加以下内容

    “`json
    {
    "registry-mirrors": ["https://docker.hetao.me"],
    "bip": "172.18.0.1/16",
    "ipv6": true,
    "fixed-cidr-v6": "fd33::1/64",
    "experimental": true,
    "ip6tables": true
    }
    </p></li>
    </ul>

    <pre><code class="line-numbers">这样可以全局开启IPv6
    如果要在docker compose中开启IPv6,可以在docker-compose.yaml中指定
    “`yaml
    services:
    web:
    image: haohetao/nginx
    restart: always
    ports:
    – 80:80/tcp
    – 443:443/tcp
    – 443:443/udp
    networks:
    web-network:
    ipv4_address: 172.30.0.20
    ipv6_address: fd34::20
    networks:
    web-network:
    driver: bridge
    enable_ipv6: true
    ipam:
    config:
    – subnet: “172.30.0.0/24”
    – subnet: “fd34::/64”

    这样docker会自动添加NAT64,容器用私有IPV6也能上网

    • 分配固定公网IP

      ip6tables设为false,同时把私有IPv6改为公网IPv6即可,此方法需要路由器或者云平台支持划分子网段
      aws支持,aliyun不支持

    • NDP proxying
      注意:aliyun不支持,aliyun限制了一个网卡只能有一个IPv6地址(不同实例规格数量不同),多余的IP会被拦截
      daemon.json配置

    {
      "registry-mirrors": ["https://docker.hetao.me"],
      "bip": "172.18.0.1/16",
      "ipv6": true,
      "fixed-cidr-v6": "2409:8a1e:6a51:61e1:2::/80",
      "experimental": true,
      "ip6tables": false
    }
    

    容器子网要在宿主机的网段范围内,前缀要小于宿主机前缀(不能等于)

    然后在宿主机上执行

    sysctl -w net.ipv6.conf.enp6s18.proxy_ndp=1
    sysctl net.ipv6.conf.default.forwarding=1
    sysctl net.ipv6.conf.all.forwarding=1
    ip -6 neigh add proxy 2409:8a1e:6a51:61e1:0:242:ac11:2 dev enp6s18 #这个ipv6地址是容器的ipv6地址
    

    最后一部的ip -6 neigh命令可以替换为npd6

    apt install npd6
    cd /etc/
    cp npd6.conf.examle npd6.conf
    

    配置

    prefix=2409:8a1e:6a51:61e1:2:
    interface = enp6s18

    systemctl enable npd6
    systemctl start npd6
    
    • SLAAC或DHCPv6分配公网IPv6

      目前没有找到方法

    总结下来就是还是NAT66最靠谱,其它方法都有各种局限性

发表回复