<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/ DTD/wml_1.1.xml">

<wml>
<head>
<meta http-equiv="cache-control" content="max-age=180,private" />
</head>
<card title="Docker搭建macvlan网络模式实现IPv4&amp;IPv6双通">
<p>
作者:<a href="index.php?action=showuser&amp;userid=1&amp;hash=">admin</a><br />时间:2023-05-29 07:46<br />分类:<a href="index.php?action=list&amp;cid=3&amp;hash=">电脑技术</a><br />内容:Docker搭建macvlan网络模式实现IPv4&amp;IPv6双通


macvlan网络模式的创建,参考官网

在NAS的网络环境中，Docker默认的就三种网络模式：





XML/HTML代码


    bridge: 桥接模式 [默认网络模式]

    host: 主机模式

    none: 无网络模式 [不常用-测试用]




所以我们首先需要创建macvlan网络模式。

输入命令【docker network ls】确认我们当前docker的网络详情。我这边还是之前说的默认三种网络模式，请确认你那边也是一样，最主要是没有macvlan网络。如果有请删掉重新配置。删除命令为【docker network rm XXXX】，XXXX是你那边的macvlan网络名字。


接着输入命令【ifconfig】并回车查询当前网卡信息，可以得到以下结果：



XML/HTML代码


    接口名称：eth0（网卡接口）

    ipv4网段/网关：192.168.0.XXX（其实就是局域网的网段/网关）

    ipv6网段/网关：2408:XXXX:XXXX:XXXX/64(这里的ipv6需要用到Global前面的地址才是公网ipv6，下面一个fe80是内网ipv6地址，不需要，）  

    常见 IP 段，2408 中国联通，2409 中国移动， 240e  中国电信，2001 国内高校

    https://hello.fe80.cn/pages/ipv6/index.html

    ipv6地址后面的60，62, 64要看运营商分配，也就是系统显示，根据自己实际情况进行修改。




接着输入macvlan网络的创建命令：



XML/HTML代码


    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代码


    docker network create -d macvlan #指定创建的网络类型是macvlan  

    --subnet=192.168.0.0/24 #macvlan的ipv4网段，这里写你的内网网段即可，最后一位是0（/24默认不要动）  

    --gateway=192.168.0.1 #macvlan的ipv4网关，最后一位是1（其实就是路由器的本地IP地址）  

    --ipv6 #启用ipv6支持  

    --subnet=2408:XXXX:XXXX:XXXX::/64 #macvlan的ipv6前缀::/64（前缀取公网ipv6前4个网段即可，最后的 /64 默认不要动）  

    --gateway=2408:XXXX:XXXX:XXXX::1 #macvlan的ipv6网关（其实就是前缀前4个网段::1）  

    -o parent=eth0 #桥接网络走的是eth0接口（也就是前面我们ifconfig命令得出的接口名称）  

    macnet #macvlan网络的名称（我这里名称就叫做macnet，你那边可以随意更改）  




实测即使你写入的Ipv6公网信息变了或者不是你最新的，系统照样可以获取正确的Ipv6地址，只不过系统网卡显示三个Ipv6地址，即一个正常的，一个你设置的不能用的，还有一个局域网的，只需要使用正常的Ipv6地址就可以。也就是说只要你的macvlan开启了Ipv6的公网支持（不能用内网ip地址），不管是否正确系统都可以通过路由在获取一个正常的Ipv6地址。



XML/HTML代码


    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代码


    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代码


    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代码


    docker exec -it typecho  ifconfig  




此时会看到网卡的ipv4和ipv6地址，在浏览器输入 http://[ipv6] 就可以看到网页，表示成功获取外网ipv6地址并可以正常访问。

在其他的容器中，如果提示没有 ifconfig 这个命令，可以根据系统底层自行安装 net-tools 这个组件。

如果一切正常，则可以在有ipv6环境中用ipv6的公网地址做服务器，任意端口都是开放的，如果路由的防火墙没有限制的话。

结合前面的ipv6的ddns就可以实现域名访问此服务器，非常方便。

如果第一步就没有ipv6地址那就是系统不支持，根据系统不同，自行打开ipv6即可。

目前大部分运营商都给了ipv6地址，个别家用路由不支持，手机流量全都有ipv6。

是否有ipv6地址可以用以下网站测试：

http://test-ipv6.com/

打通宿主机和macvlan网络容器互访


前面说过，原宿主机和当前macvlan网络下的容器采用的是相互独立的网卡，默认是无法相通（也是为了安全的考量），也就是无法访问的。根据macvlan网络的特性，既然宿主机和当前macvlan网络下的容器不能相同，但是macvlan网络与macvlan网络之间可以互通的，所以只需要用ip link手动再创一个macvlan网卡即可。

具体操作如下：



XML/HTML代码


    ip link add NETLINK link eth0 type macvlan mode bridge  

    ip addr add 192.168.0.201 dev NETLINK  




添加一个 NETLINK (名字随意)的macvlan网卡，然后给每个容器的独立ip地址添加进去，宿主机立马可以ping到此容器，重启宿主机此设置失效。

只设置只适合临时用宿主机登录macvlan的容器进行管理，如果局域网其他设备是可以正常访问宿主机和容器的，无需设置。

几个检测容器ipv6地址的命令：



XML/HTML代码


    #查看本机ipv6公网地址  

    curl api6.ipify.org  

    #检测容器ipv6是否通畅  

    docker run --rm -it busybox ping -6 -c4 ipv6-test.com  

    #查看容器ipv6地址  

    docker run --rm -it busybox ifconfig  





XML/HTML代码


    #查看本机ipv6公网地址  

    curl api6.ipify.org  

    #检测容器ipv6是否通畅  

    docker run --rm -it --net macnet --ip 192.168.0.210 busybox ping -6 -c4 ipv6-test.com  

    #查看容器ipv6地址  

    docker run --rm -it --net macnet --ip 192.168.0.210 busybox ifconfig  








XML/HTML代码


    # 查询本机外网IPv4地址  

    curl 4.ipw.cn  

    # 查询本机外网IPv6地址  

    curl 6.ipw.cn  

    # 测试网络是IPv4还是IPv6访问优先(访问IPv4/IPv6双栈站点，如果返回IPv6地址，则IPv6访问优先)  

    curl test.ipw.cn  






使用 /etc/docker/daemon.json 打开ipv6地址支持，容器可以获取ipv6地址，但是经过检测，无法通过ipv6联网，只能看到ipv6地址但是没用。所以，用macvlan方法可以同时获取ipv4和ipv6地址，并且都可以使用，还可以用这个v4-v6互转，十分方便。


参考1  参考2  参考3  参考4

常用的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代码


    inet6 addr: 2408:8220:723:45a1:268:3ff:fe29:296/64 Scope:Global




使用ip -6 route show可以看到网关地址是

XML/HTML代码


    2408:8220:723:45a1::/64 dev eth0  metric 256  expires 0sec






从而得到如下参数



XML/HTML代码


    --ipv6 --subnet=2408:8220:723:45a1::/64 --gateway=2408:8220:723:45a1::1




::是ipv6的网段，::1是这个网段的第一个地址也就是网关。在爱快中看Ipv6信息中Lan的ipv6信息，只看::前面的信息。

注意：以上仅适用于固定IP段的v6地址，现在运营商都是动态IPv6，故以上方法不合适，可以采用以下方法创建Macvlan。



XML/HTML代码


    docker network create -d macvlan \

      --subnet=192.168.0.0/24  \

      --gateway=192.168.0.1 \

      --ipv6 --subnet=fd00:8::/80 \

      -o parent=eth0 \

      -o macvlan_mode=bridge macnet




创建容器测试



XML/HTML代码


    docker run -itd --name test --ip=192.168.0.201 --network macnet busybox




然后就可以是容器直接从主路由获取IPv6地址。


如果不需要IPv4的，只需要IPv6的（纯IPv6网络）



XML/HTML代码


    docker network create -d macvlan --ipv6 --subnet=fd00:8::/80 \

      -o parent=eth0 \

      -o macvlan_mode=bridge macnet6




创建一个公网IPv6的容器



XML/HTML代码


    docker run -itd --name test --network macnet6 busybox




以上方便创建的IPv6地址是从路由器直接获取的公网地址，会跟着路由更新，推荐用此法创建。也不推荐用修改 daemon.json 配置文件方法创建，此法创建的V6地址要不就是没有公网V6，要不就是宿主机V6示例，最为可靠还是macvlan的方法。

单IPv6容器玩法：

1、启用 TUN 网卡

Debian/Ubuntu/Alpine Linux



XML/HTML代码


    加载 TUN 模块

    modprobe tun

    验证 TUN 设备是否已创建

    ls /dev/net/tun

    配置自动加载 TUN 模块

    echo &quot;tun&quot; | tee -a /etc/modules

    或者

    sed -i '$ a tun' /etc/modules






CentOS/RHEL



XML/HTML代码


    加载 TUN 模块

    modprobe tun

    验证 TUN 设备是否已创建

    ls /dev/net/tun

    配置自动加载 TUN 模块

    echo &quot;tun&quot; | tee -a /etc/modules-load.d/tun.conf

    或者

    sed -i '$ a tun' /etc/modules-load.d/tun.conf




2、创建纯IPv6容器（赋予容器权限bing）



XML/HTML代码


    docker run -itd --name alpine --network macnet6 --device /dev/net/tun --privileged --restart unless-stopped alpine

    或者

    docker run -itd --name debian --network macnet6 --device /dev/net/tun --privileged --restart unless-stopped debian




3、双栈IPv4/IPv6


warp：https://gitlab.com/fscarmen/warp



XML/HTML代码


    wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh &amp;&amp; bash menu.sh




创建双栈IP后就可以通过IPv4/IPv6同时访问网络了，否则只能访问V6网络，只有V4的网站就无法访问，比如github就只能通过V4网络访问。

在国内以上warp几乎连不上，故可以采用NAT64公共服务器实现双栈访问网络

将系统配置为使用以下域名服务器：



XML/HTML代码


    2a00:1098:2b::1

    2a01:4f9:c010:3f02::1

    2a01:4f8:c2c:123f::1






命令直接添加



XML/HTML代码


    echo -e &quot;nameserver 2a00:1098:2b::1\nnameserver 2a01:4f9:c010:3f02::1\nnameserver 2a01:4f8:c2c:123f::1&quot; | tee /etc/resolv.conf &gt; /dev/null






切记，resolv.conf只能用上面的dns，v4的不用保留，因为压根不通，其他的v6的dns也必须删掉，否则解析到正常的v4 ip也是无法访问的。

经测试，目前我这里可用的也就是上面的一组，其他的都无法正常访问V6网络。 



XML/HTML代码


    2001:67c:2960::64

    2001:67c:2960::6464

    2001:67c:2b0::6

    2602:fc59:11:1::64






XML/HTML代码


    echo -e &quot;nameserver 2602:fc59:11:1::64&quot; | tee /etc/resolv.conf &gt; /dev/null






以上是从nat64.xyz筛选的几个速度较快，可以正常使用的NAT64的dns服务器。










</p><p>
<a href="index.php?action=login&amp;hash=">立即登陆发表评论</a><br />
</p>
<p><a href="index.php?action=list&amp;hash=">返回日志列表</a><br /><a href="index.php?action=index&amp;hash=">返回主页</a></p>
</card>
</wml>
