记录我的一些生活写照、无聊的牢骚、内心世界的活动 注册 | 登陆

Docker搭建macvlan网络模式实现IPv4&IPv6双通

Docker搭建macvlan网络模式实现IPv4&IPv6双通
macvlan网络模式的创建,参考官网
在NAS的网络环境中,Docker默认的就三种网络模式:
XML/HTML代码
  1. bridge: 桥接模式 [默认网络模式]
  2. host: 主机模式
  3. none: 无网络模式 [不常用-测试用]
所以我们首先需要创建macvlan网络模式。
输入命令【docker network ls】确认我们当前docker的网络详情。我这边还是之前说的默认三种网络模式,请确认你那边也是一样,最主要是没有macvlan网络。如果有请删掉重新配置。删除命令为【docker network rm XXXX】,XXXX是你那边的macvlan网络名字。
接着输入命令【ifconfig】并回车查询当前网卡信息,可以得到以下结果:
XML/HTML代码
  1. 接口名称:eth0(网卡接口)
  2. ipv4网段/网关:192.168.0.XXX(其实就是局域网的网段/网关)
  3. ipv6网段/网关:2408:XXXX:XXXX:XXXX/64(这里的ipv6需要用到Global前面的地址才是公网ipv6,下面一个fe80是内网ipv6地址,不需要,)  
  4. 常见 IP 段,2408 中国联通,2409 中国移动, 240e  中国电信,2001 国内高校
  5. https://hello.fe80.cn/pages/ipv6/index.html
  6. ipv6地址后面的60,62, 64要看运营商分配,也就是系统显示,根据自己实际情况进行修改。
接着输入macvlan网络的创建命令:
XML/HTML代码
  1. docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 --ipv6 --subnet=2408:XXXX:XXXX:XXXX::/64 --gateway=2408:XXXX:XXXX:XXXX::1 -o parent=eth0 macnet 
XML/HTML代码
  1. docker network create -d macvlan #指定创建的网络类型是macvlan  
  2. --subnet=192.168.0.0/24 #macvlan的ipv4网段,这里写你的内网网段即可,最后一位是0(/24默认不要动)  
  3. --gateway=192.168.0.1 #macvlan的ipv4网关,最后一位是1(其实就是路由器的本地IP地址)  
  4. --ipv6 #启用ipv6支持  
  5. --subnet=2408:XXXX:XXXX:XXXX::/64 #macvlan的ipv6前缀::/64(前缀取公网ipv6前4个网段即可,最后的 /64 默认不要动)  
  6. --gateway=2408:XXXX:XXXX:XXXX::1 #macvlan的ipv6网关(其实就是前缀前4个网段::1)  
  7. -o parent=eth0 #桥接网络走的是eth0接口(也就是前面我们ifconfig命令得出的接口名称)  
  8. macnet #macvlan网络的名称(我这里名称就叫做macnet,你那边可以随意更改)  
实测即使你写入的Ipv6公网信息变了或者不是你最新的,系统照样可以获取正确的Ipv6地址,只不过系统网卡显示三个Ipv6地址,即一个正常的,一个你设置的不能用的,还有一个局域网的,只需要使用正常的Ipv6地址就可以。也就是说只要你的macvlan开启了Ipv6的公网支持(不能用内网ip地址),不管是否正确系统都可以通过路由在获取一个正常的Ipv6地址。
XML/HTML代码
  1. docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 --ipv6 --subnet=2408:8220:723:45a1::/64 --gateway=2408:8220:723:45a1::1 -o parent=eth0 macnet
这里顺便说下,如果你不启用ipv6,仅启用ipv4,只需要将--ipv6以及后面的ipv6的信息去掉即可,也就是:
XML/HTML代码
  1. docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macnet
gateway是IP地址的第一个也就是::1, 如果输入 fe80 开头的是内网网关,创建 macvlan 会失败。
创建一个容器测试下ipv6地址是否可用
XML/HTML代码
  1. docker run --name typecho -e PHP_TZ=Asia/Shanghai -e PHP_MAX_EXECUTION_TIME=600 --rm --net macnet  --ip 192.168.0.210 80x86/typecho:latest  
临时建立一个typecho的博客 --rm 表示这个容器停止后自动删除。
查看此容器的ip地址
XML/HTML代码
  1. docker exec -it typecho  ifconfig  
此时会看到网卡的ipv4和ipv6地址,在浏览器输入 http://[ipv6] 就可以看到网页,表示成功获取外网ipv6地址并可以正常访问。
在其他的容器中,如果提示没有 ifconfig 这个命令,可以根据系统底层自行安装 net-tools 这个组件。
如果一切正常,则可以在有ipv6环境中用ipv6的公网地址做服务器,任意端口都是开放的,如果路由的防火墙没有限制的话。
结合前面的ipv6的ddns就可以实现域名访问此服务器,非常方便。
如果第一步就没有ipv6地址那就是系统不支持,根据系统不同,自行打开ipv6即可。
目前大部分运营商都给了ipv6地址,个别家用路由不支持,手机流量全都有ipv6。
是否有ipv6地址可以用以下网站测试:
打通宿主机和macvlan网络容器互访
前面说过,原宿主机和当前macvlan网络下的容器采用的是相互独立的网卡,默认是无法相通(也是为了安全的考量),也就是无法访问的。根据macvlan网络的特性,既然宿主机和当前macvlan网络下的容器不能相同,但是macvlan网络与macvlan网络之间可以互通的,所以只需要用ip link手动再创一个macvlan网卡即可。
具体操作如下:
XML/HTML代码
  1. ip link add NETLINK link eth0 type macvlan mode bridge  
  2. ip addr add 192.168.0.201 dev NETLINK  
添加一个 NETLINK (名字随意)的macvlan网卡,然后给每个容器的独立ip地址添加进去,宿主机立马可以ping到此容器,重启宿主机此设置失效。
只设置只适合临时用宿主机登录macvlan的容器进行管理,如果局域网其他设备是可以正常访问宿主机和容器的,无需设置。
几个检测容器ipv6地址的命令:
XML/HTML代码
  1. #查看本机ipv6公网地址  
  2. curl api6.ipify.org  
  3. #检测容器ipv6是否通畅  
  4. docker run --rm -it busybox ping -6 -c4 ipv6-test.com  
  5. #查看容器ipv6地址  
  6. docker run --rm -it busybox ifconfig  
XML/HTML代码
  1. #查看本机ipv6公网地址  
  2. curl api6.ipify.org  
  3. #检测容器ipv6是否通畅  
  4. docker run --rm -it --net macnet --ip 192.168.0.210 busybox ping -6 -c4 ipv6-test.com  
  5. #查看容器ipv6地址  
  6. docker run --rm -it --net macnet --ip 192.168.0.210 busybox ifconfig  
XML/HTML代码
  1. # 查询本机外网IPv4地址  
  2. curl 4.ipw.cn  
  3. # 查询本机外网IPv6地址  
  4. curl 6.ipw.cn  
  5. # 测试网络是IPv4还是IPv6访问优先(访问IPv4/IPv6双栈站点,如果返回IPv6地址,则IPv6访问优先)  
  6. curl test.ipw.cn  
使用 /etc/docker/daemon.json 打开ipv6地址支持,容器可以获取ipv6地址,但是经过检测,无法通过ipv6联网,只能看到ipv6地址但是没用。所以,用macvlan方法可以同时获取ipv4和ipv6地址,并且都可以使用,还可以用这个v4-v6互转,十分方便。
常用的Linux查看IP命令:
设置网卡自动获取IPv6地址:iface eth0 inet6 dhcp
查看ipv6的网关:ip -6 route show,如果有:default via fe80::20c:29ff:fe0f:3032 dev eth0 metric 1 pref medium,类似这样的出现,说明ipv6一切正常。如果没有ipv6的网关,手动增加:route -A inet6 add default gw fe80::20c:29ff:fe0f:3032 dev eth0,如果不知道ipv6的网关是什么,用命令:ip -6 route show dev eth0 查看。也可以用 ifconfig 命令查看,如果没有找到这个命令,可以安装 net-tools 组件。
注:例如alpine默认开启ipv6,使用ifconfig可以看到ipv6地址是
XML/HTML代码
  1. inet6 addr: 2408:8220:723:45a1:268:3ff:fe29:296/64 Scope:Global
使用ip -6 route show可以看到网关地址是
XML/HTML代码
  1. 2408:8220:723:45a1::/64 dev eth0  metric 256  expires 0sec
从而得到如下参数
XML/HTML代码
  1. --ipv6 --subnet=2408:8220:723:45a1::/64 --gateway=2408:8220:723:45a1::1
::是ipv6的网段,::1是这个网段的第一个地址也就是网关。在爱快中看Ipv6信息中Lan的ipv6信息,只看::前面的信息。

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):