0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Docker开启IPv6

马哥Linux运维 来源:rectcircle.cn 2023-01-10 09:24 次阅读

背景知识

Docker 网络

在 Docker 中,网络是一个重要抽象。一个 Docker 可以有多个网络,每个容器可以连接到一个或多个中。

docker 安装完成后,会自动创建三个网络,分别是 bridge、host 和 none。通过 docker network ls 命令可以查看:

NETWORKIDNAMEDRIVERSCOPE
11da7fc827b4bridgebridgelocal
4cd2eae9c4cdhosthostlocal
12730ca5becanonenulllocal

其中名字为 bridge 的 bridge 类型网络,就是 docker 的默认网络(docker run 默认使用的网络)。

默认网络的实现是在宿主机环境创建一个名为 docker0 的 bridge 设备,并为其配置一个私有网段的网关 IP 地址。通过 ip addr show docker0 可以查看更该设备信息

3:docker0:mtu1500qdiscnoqueuestateUPgroupdefault
link/ether02xxxx:xxbrdffffff:ff
inet172.17.0.1/16brd172.17.255.255scopeglobaldocker0
valid_lftforeverpreferred_lftforever
inet6fe80:xxxxxx/64scopelink
valid_lftforeverpreferred_lftforever

docker bridge 网络,在 IPv4 场景下拓扑如下所示(来自于:KVM + LinuxBridge 的网络虚拟化解决方案实践):

+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
|Host|Container1|Container2|
||||
|+------------------------------------------------+|+-------------------------+|+-------------------------+|
||NewworkProtocolStack|||NewworkProtocolStack|||NewworkProtocolStack||
|+------------------------------------------------+|+-------------------------+|+-------------------------+|
|↑↑|↑|↑|
|............|.............|.....................................|...................|.....................|....................|....................|
|↓↓|↓|↓|
|+------++--------+|+-------+|+-------+|
||.3.101||.9.1|||.9.2|||.9.3||
|+------++--------++-------+|+-------+|+-------+|
||eth0||br0|<--->|veth|||eth0|||eth0||
|+------++--------++-------+|+-------+|+-------+|
|↑↑↑|↑|↑|
|||+-------------------------------------------+|||
||↓||||
||+-------+||||
|||veth|||||
||+-------+||||
||↑||||
||+-------------------------------------------------------------------------------|--------------------+|
|||||
|||||
|||||
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
↓
PhysicalNetwork(192.168.3.0/24)

通过 docker network inspect bridge 可以查看某该默认网络配置:

[
{
"Name":"bridge",
"Id":"11da7fc827b4dxxx",
"Created":"2021-11-22T1203.408536176+08:00",
"Scope":"local",
"Driver":"bridge",
"EnableIPv6":false,
"IPAM":{
"Driver":"default",
"Options":null,
"Config":[
{
"Subnet":"172.17.0.0/16",
"Gateway":"172.17.0.1"
}
]
},
"Internal":false,
"Attachable":false,
"Ingress":false,
"ConfigFrom":{
"Network":""
},
"ConfigOnly":false,
"Containers":{
"0d744147030829f0247xx":{
"Name":"container1",
"EndpointID":"6f539a054ae35cbxx",
"MacAddress":"02xxxx:xx",
"IPv4Address":"172.17.0.14/16",
"IPv6Address":""
},
},
"Options":{
"com.docker.network.bridge.default_bridge":"true",
"com.docker.network.bridge.enable_icc":"true",
"com.docker.network.bridge.enable_ip_masquerade":"true",
"com.docker.network.bridge.host_binding_ipv4":"0.0.0.0",
"com.docker.network.bridge.name":"docker0",
"com.docker.network.driver.mtu":"1500"
},
"Labels":{}
}
]

可以通过 docker network create 命令,创建一个自定义 bridge 网络。关于,默认网络和自定义 bridge,有如下不同:

自定义 bridge 网络会使用 docker 内嵌的 dns server 服务,配置地址为 127.0.0.11,通过 iptables 转发到 43747 端口。因此可以直接通过 container name 访问同一个自定义网络下的其他容器网络。而默认网络则不支持。

自定义 bridge 有更好的隔离性。

一个容器可以在运行时动态的连接/断开一个自定义 bridge,默认网络只能重新创建。

自定义 bridge 可以在创建的时候配置 Linux bridge,如果要修改默认网络的 bridge 则需要重启 docker daemon。因此,官方更推荐在生产环境使用自定义 bridge 而非默认网络。

默认网络支持 IPv6

本章节介绍的是如何配置默认的 bridge 网络支持 ipv6。(未经过测试,仅供参考)

前置条件:确保自己的设备被分配了一个 IPv6。通过 ip addr show 查看当前设备的 IPv6。其输出的物理网卡存在包含 inet6 和 scope global 的行时,表示该网卡支持 IPv6。需要注意的是:其 IPv6 地址的前缀不能是 /128,如果是 /128,建议通过 IPv6NAT 方式去支持 IPv6。

2:eth0:mtu1500qdiscmqstateUPgroupdefaultqlen1000
link/etherfaxxxx:xxbrdffffff:ff
inet10.227.8.141/22brd10.227.11.255scopeglobaleth0
valid_lftforeverpreferred_lftforever
inet62xxx:xxxx/64scopeglobal
valid_lftforeverpreferred_lftforever
inet6fe80:xxxxxxxx/64scopelink
valid_lftforeverpreferred_lftforever

修改 /etc/docker/daemon.json,其中 fixed-cidr-v6 是上一步获取到的 IPv6 网段的子网(配置默认网络,前缀长度最大为 /80)。

{
"ipv6":true,
"fixed-cidr-v6":"2xxx:/80"
}

reload 配置,docker daemon 将会使用 IPv6 网络。

sudosystemctlreloaddocker

通过 docker network inspect bridge 命令检查是否生效。若生效,则 EnableIPv6 值为 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

注意经测试,如下场景可能不会生效:

/etc/docker/daemon.json 存在 "live-restore": true 字段。

reload 时有容器仍然存在。

根据众多博客的说法,还需如下两步:

/etc/sysctl.conf 添加,并执行 sysctl -f,配置宿主机和 docker0 网卡支持 NDP proxy。

#docker0是docker默认的网桥(bridge)
net.ipv6.conf.docker0.proxy_ndp=1
#eth0表示物理网卡,注意替换为物理网卡
net.ipv6.conf.eth0.proxy_ndp=1

默认的 ndp 邻居发现配置仅允许单个 IP 配置。需要安装 ndppd 服务来转发邻居发现消息(这一步还有一个替代方案:手动为每一个容器配置如:ip -6 neigh add proxy 2xxx:1 dev ens3,其中,2xxx:1 为容器的分配的 IPv6,ens3 为宿主机绑定 IPv6 的网卡)。

apt-getupdate-y
apt-getinstall-yndppd
cp/usr/share/doc/ndppd/ndppd.conf-dist/etc/ndppd.conf

更改 proxy eth0 { 行到宿主机绑定 IPv6 的网卡,如:proxy ens3 {。更改 rule 1111:: { 行为需要暴露的网段 2xxx:/80 {。最后执行 systemctl restart ndppd

注意:

本方法仅针对新装 Docker 场景

本章节 和 自定义网络支持 IPv6 配置的 IPv6 和 docker 默认 IPv4 是不同的。容器的 IPv6 用的不是私有网段,而是宿主机网络或者是宿主机网络的一个子网。因此,宿主机所在的网络的所有实例可以直接通过 IPv6 的地址。也就是说:容器的所有端口对于 IPv6 来说都是公开的,而无需 public。而容器的 IPv4 分配的是私有网段,因此,容器网段和宿主机网段是通过 NAT 转发数据的,因此宿主机所在网络的其他实例是无法直接访问容器。也就是说:容器的所有端口对于 IPv4 来说都是私有的,需 public 到 host 网络才能被外部访问到。

自定义网络支持 IPv6

本章节介绍的是如何创建一个支持 IPv6 的 bridge 网络。(未经过测试,仅供参考)

前置条件:确保自己的设备被分配了一个 IPv6。

创建一个支持 IPv6 的 bridge 网络。其中 --subnet 参数为上一步获取到的 IPv6 网段的子网(自定义 bridge 网络,前缀长度不限制,可以大于于 80)。

dockernetworkcreatemy-net-ipv6--ipv6--subnet="2xxx:/80"

通过 docker network inspect my-net-ipv6 命令检查是否生效。若生效,则 EnableIPv6 值为 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

创建容器时,通过 --network my-net-ipv6 参数,给容器开启 IPv6 网络,如 docker run --network my-net-ipv6 -it busybox ip addr show,可以看到,网卡被分配了 IPv6 地址。

通过 IPv6NAT 方式支持 IPv6

测试可行,推荐使用该方式。

上文也提到,上文展示的方案,容器获得的 IPv6 IP 并不是私有网络 IP,是和外部网络直接连通,而不会经过 NAT。在如下场景下,以上方式可能不能满足要求:

安全性,要求容器的网络是私有的,需要容器的网络行为和 Docker IPv4 的行为一致,只有特定端口才能访问。

宿主机处于一个很小范围的网段(前缀大于 /80),如 xxx::xx/128,没有多余的 IPv6 可以分给容器。此时就需要,给容器配置一个私有 IPv6 网段,并启用 NAT。

但是 Docker 官方并没有内置 IPv6 的 NAT,如果想要使用 IPv6 NAT,需要安装外挂的 IPv6 启动,参见:https://github.com/robbertkl/docker-ipv6nat。

有这些准备后,实施步骤如下所示:

使用如下命令,后台启动 IPv6 NAT(通过 --restart always 配置了开机自启)。

dockerrun-d--nameipv6nat--privileged--networkhost--restartalways-v/var/run/docker.sock:/var/run/docker.sock:ro-v/lib/modules:/lib/modules:rorobbertkl/ipv6nat

和 自定义网络支持 IPv6 类似,创建一个支持 IPv6 的 bridge 网络。其中 --subnet 参数为 fe80::/10 的一个子网。

dockernetworkcreatemy-net-ipv6--ipv6--subnet="fd00:1/80"--gateway="fd00:1"

通过 docker network inspect my-net-ipv6 命令检查是否生效。若生效,则 EnableIPv6 值为 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

创建容器时,通过 --network my-net-ipv6 参数,给容器开启 IPv6 网络,如 docker run --network my-net-ipv6 -it busybox sh:

ip addr show ,可以看到,网卡被分配了 IPv6 地址。 wget https://ipv6.icanhazip.com -O /dev/stdout 2>/dev/null 可以看到出网 IPv6 地址。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网络
    +关注

    关注

    14

    文章

    7511

    浏览量

    88605
  • IPv6
    +关注

    关注

    6

    文章

    682

    浏览量

    59318
  • 容器
    +关注

    关注

    0

    文章

    492

    浏览量

    22041
  • 命令
    +关注

    关注

    5

    文章

    678

    浏览量

    21981
  • Docker
    +关注

    关注

    0

    文章

    454

    浏览量

    11807

原文标题:Docker 开启 IPv6

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STMCUBE如何设置IPV6地址?

    小弟最近在学习开发STMCUBE,请问遇到一个问题,STMCUBE 在设置LWIP关于IPV6配置的时候,如何设置IPV6地址,我在电脑PING IPV6的时候,PING哪个地址
    发表于 04-18 07:41

    3种开启宽带IPv6的方法,免费得IPV6公网地址,免费看IPTV直播

    IPv6
    jf_97106930
    发布于 :2023年05月19日 12:22:13

    IPv6地址是什么,IPv6的意思

    IPv6是Internet Protocol Version 6的缩写,其中Internet Protocol译为“互联网协议”。它是IETF设计的用于替代现行版本IP协议-IPv4-的下一代IP
    发表于 01-25 16:39

    基于IPv6的Winsock网络编程

    Protocol”,1995年底确定了IPng的协议规范,并称为“IP版本6”,即IPv6。0 IPv6概述IPv6指的是网络协议版本6
    发表于 05-08 06:14

    IPv6的特色应用

    业务匮乏一直是制约IPv6发展的重要因素。随着移动互联网的发展,IPv6的特色应用业务渐渐浮出水面。1 IPv6与家庭网络“家庭网络”已经成为全业务运营商大力发展家庭用户的重要业务举措。然而,由于
    发表于 07-15 08:18

    IPv6,IPv6的应用,IPv6的原理是什么?

    IPv6,IPv6的应用,IPv6的原理是什么? IPv6是Internet Protocol Version 6的缩写,其中Intern
    发表于 03-29 17:19 2077次阅读

    IPv6结构,什么是IPv6结构

    IPv6结构,什么是IPv6结构 本文将阐述IPv6 报头的结构并将其与IPv4 报头相比较。此外还将讨论Extension(扩展)报头,这是
    发表于 04-06 17:06 1056次阅读

    IPv6的地址,什么是IPv6的地址

    IPv6的地址,什么是IPv6的地址 和IPv4相比,IPv6的主要改变就是地址的长度为128位,也就是说可以有2的128次方的IP地址
    发表于 04-06 17:07 683次阅读

    浅谈IPV6(介绍IPV6的特点和功能)

    摘要: 随着互联网的快速发展,正在兴起新的互联网协议一一IPv6。本文系统的介绍了IPv6的特点、功能, 并与当前的互联网协 议进行了全面的比较, 阐明了IPv6的优越性, 以及IPv6
    发表于 02-12 09:28 73次下载

    ipv6是什么_ipv6有什么用

    IPv6 已经开发了20年了,最初的工作是在1992年展开的,叫做“IP Next Generation”,在1998年被标准化为 IPv6。在2008年在因特网上部署,并且2008年的奥运会
    发表于 12-26 08:45 6.1w次阅读

    IPv6环境获取IPV6地址的优点

    DHCPv6(Dynamic Host Configuration Protocol for IPv6,支持 IPv6 的动态主机配置协议)是针对 IPv6 编址方案设计的,为主机分配
    的头像 发表于 03-22 17:22 3614次阅读
    <b class='flag-5'>IPv6</b>环境获取<b class='flag-5'>IPV6</b>地址的优点

    什么是ipv6 ipv4与ipv6的区别

    ipv6的英文全称是Internet Protocol Version 6,中文为互联网协议第6版。ipv6是互联网工程任务组设计的用于替代IPv
    的头像 发表于 09-03 16:03 2.2w次阅读

    什么是ipv4什么是ipv6 ipv6技术的优缺点

    IPv4和IPv6的地址格式不同,它们之间没有直接的换算方法。但是,可以使用IPv4与IPv6的双栈机制,实现IPv4地址到
    发表于 05-17 18:12 5283次阅读

    ipv6功能有什么用 ipv6开启好还是关闭好

    。本文将探讨IPv6的功能,以及为什么开启IPv6可能更好。 IPv6的功能: 扩展地址空间:IPv6的主要功能是扩展地址空间,由于
    的头像 发表于 02-05 10:06 3.5w次阅读

    什么是IPv6隧道技术

    随着互联网的快速发展,IPv4地址资源逐渐枯竭,IPv6作为下一代互联网协议应运而生。然而,IPv6的部署并非一蹴而就,许多现有的IPv4网络设备和应用尚未支持
    的头像 发表于 10-30 09:17 194次阅读