写在前面

今天来讲点硬货,因为张大妈上玩NAS的博主,很少有可以精通网络的。所以它们很难把docker的macvlan讲透彻,尤其是IPv6这部分。于是大部分人跟着教程,看着就会云里雾里,很难搞明白。

但是在公网IPv4地址稀缺、国家又在大力推广IPv6的状态下,你家可能没有公网IPv4,但大概率会有公网IPv6,这就成了很多人提高BT/PT下载速度、内网穿透等的神器。但是,docker默认状态的bridge网络是不带IPv6支持的,即便修改docker配置文件使其支持IPv6,也会产生不少问题。因此,在docker上配置一个macvlan网络,给每个容器分配独立的IPv4地址和IPv6地址,就成了目前最佳的选择。

但是,在众多博主的教程中,搞明白macvlan网络似乎是一件很复杂的事情。那今天本薇就告诉你,配置macvlan网络这事很简单,给它加上IPv6支持也不是什么难事!所以,一起来看看吧。

注1:本文使用设备为威联通TS-h973AX,支持QuTS hero操作系统,支持3.5寸、2.5寸和U.2固态,虽然已经是三年前发布的了,但仍然是目前很值得入手的万兆NAS。

京东

威联通(QNAP)TS-h973AX8G9盘位万兆nas网络存储服务器混合式硬盘配置私有云盘(无内置硬盘)
商品好评率98%
¥7800
去购买

注2:本文教程适用于Linux版本的docker,其余Mac、Windows等客户端均不支持macvlan网络。

注3:阅读本文前的必备教程有三篇,其中《不影响整体网络稳定性——iKuai只向特定设备分配IPV6地址》请一定要看一下,无论你是否使用了iKuai作为主路由使用,这篇文章都会帮助你更好地理解本文内容。

文章

不影响整体网络稳定性——iKuai只向特定设备分配IPV6地址
冥冰薇
2023-06-14

46
文章

一文为你讲清楚IPv6是什么?怎么用
冥冰薇
2023-06-15

30
文章

bridge?host?macvlan?——今天聊聊傻傻分不清的docker网络模式及其应用
冥冰薇
2023-02-27

80

Macvlan网络的定义和工作原理

这个之前在第三期已经简单讲过原理了,今天就偷个懒,不画新图了,简单提一下,详细可以参考一下本专栏第三期,了解一下docker的三种网络模式下到底有什么区别。

Macvlan是一种特殊类型的网络设备,它允许单个物理设备拥有多个MAC地址。这样做的结果是,你可以在物理网络接口上创建一个新的虚拟网络接口,这个接口有自己的MAC地址,IP地址,以及其他网络设置。

Macvlan工作的原理是通过在数据链路层插入虚拟网络接口,使得每个接口都有自己的MAC地址,从而可以独立的接收和发送数据包。这种设计使得Macvlan设备看起来就像一台独立的物理机器,连接在同一网络中

通俗来说,就是创建了Macvlan网络之后,如果你的容器接入了该网络,那么它就像是一台电脑,有胳(网)膊(口)有腿(网线),接在了你的路由器上,这样就可以直接获取到和你其他设备同网段的IP地址,而不需要有docker0接口再进行一层NAT,分配到一个类似于172.17.0.3的地址。

Macvlan网络的优点和缺点

Macvlan网络有一些显著的优点。首先,由于Macvlan设备直接在数据链路层工作,它们可以提供接近物理网络的性能。其次,由于Macvlan设备有自己的MAC和IP地址,它们可以直接访问网络,无需通过宿主机进行路由或NAT转换。

然而,Macvlan网络也有一些限制。最重要的一点是,由于以太网的工作原理,Macvlan设备不能和宿主机直接通信。这是因为宿主机和Macvlan设备都在同一物理网络接口上,一个网络接口不能接收到自己发送的数据包。这意味着,如果你的应用需要和宿主机通信,你需要使用其他的解决方案,例如创建一个ipvlan设备或者另一个Macvlan网络使得宿主机和docker容器进行通信。

总的来说,Macvlan网络提供了一种强大而灵活的方式,可以让Docker容器直接访问物理网络。但是,你也需要了解其局限性,以确保它适合你的应用需求。在下一部分中,我们将深入讨论如何在Docker中创建和配置Macvlan网络,包括如何配置IPv6地址。

建立macvlan

先放命令,然后我们来一步一步告诉你怎么根据自己的网络进行修改。

doer network create -d cvlan
–subnet=10.10.10.0/24
–gateway=10.10.10.1
–ipv6
–subnet=fd1e:6551:6c39::/64
–gateway=fd1e:6551:6c39::1
-o parent=eth2
mbw-net

这个命令将创建一个名为mbw-net的Docker网络,它使用macvlan驱动,IPv4子网为10.10.10.0/24,IPv4网关为10.10.10.1,IPv6子网为你提供的fd1e:6551:6c39::/64,IPv6网关为fd1e:6551:6c39::1,并且将网口指定为eth2

首先我们要先查看我们的网卡信息,这里使用ifconfig命令:

查看网卡信息查看网卡信息

然后找到当前正在使用的网卡信息,我这里确认为eth2;

找到正在使用的网卡找到正在使用的网卡

稍微有点网络尝试的人应该都知道IPv4这部分怎么设置,即只要设置成和你当前设备同网段的就行

重点我们来看一下IPv6部分……

其实不用看,这里建议直接照抄。因为这部分属于我在IPv6科普文章中讲过的唯一区域地址,只能在本地网络中使用。因此其与宿主机和路由器没有任何关系,它的用途只会出现在设置docker容器时,选择与它同网段的即可。

如果,你非常有个性,实在不想照抄,那就自己随机生成一个吧:

你可以使用以下命令在fd00::/8范围内随机生成一个/64子网

printf ‘fd%x:%x:%x::/64n’ $((RANDOM%256)) $((RANDOM%65536)) $((RANDOM%65536))

这将生成一个像fd3c:9b2d:c5c3::/64这样的地址。然后你可以在Docker网络创建命令中使用这个地址作为你的IPv6子网,IPv6网关通常设置为子网的第一个地址,如fd3c:9b2d:c5c3::1

随机生成IPv6本地地址随机生成IPv6本地地址

然后根据你的实际需要运行上述命令,即可新建一个macvlan网络。

最后,可以去Portainer中查看结果。

macvlan网络macvlan网络

容器使用macvlan网络

这里以qb为例:

第一步:下载容器镜像;

下载qb镜像下载qb镜像

第二步:映射文件夹;

映射文件夹映射文件夹

第三步:设置网络;

设置网络设置网络

第四步:更改自动重启策略;

更改自动重启策略更改自动重启策略

注:这里因为每个加入macvlan网络的容器都有自己独立的IP,所以不需要映射网络端口或更改-e参数。

第五步:建立容器。

测试

IPv4测试:

IPv4访问成功IPv4访问成功

使用IPv6:

这里再强调一遍,请先看下列教程,不然你很难搞明白我在干什么。

文章

不影响整体网络稳定性——iKuai只向特定设备分配IPV6地址
冥冰薇
2023-06-14

46

网络环境:iKuai主路由,开启IPv6,使用无状态+无状态绑定模式。

ikuai网络设置ikuai网络设置

Portainer进入容器详情页,打开容器终端;

连接容器终端连接容器终端

点击连接点击连接

输入ifconfig命令,找到链路本地地址:

找到IPv6链路本地地址找到IPv6链路本地地址

复制这个地址,加入前缀静态分配

加入前缀静态分配加入前缀静态分配

再次使用ifconfig命令,就能看到获取到的公网IPv6地址了

获取到公网IPv6地址获取到公网IPv6地址

宿主机与容器互通?

有必要吗?

根据前面基础知识的铺垫,我们知道,建立在macvlan的容器不能与宿主机互通。但是这仅仅是不能与宿主机通信,建立在macvlan网络下的docker容器之间是可以互通的

测试

同上,我们再建立一个qb2容器:

配置qb2网络配置qb2网络

经过测试,我们发现qb1和qb2之间可以相互ping通

容器之间可以相互ping通容器之间可以相互ping通

但容器无法ping通宿主机:

无法ping通宿主机无法ping通宿主机

所以如果我们的容器需求比较少,且都建立在macvlan网络下,那就没必要建立宿主机与容器之间的通信。比如我们常用的nastool容器,其关联容器都可以建立在macvlan网络下,那么他们之间可以相互访问,就基本没必要和宿主机连通

简易版思路

那都写到这了,肯定还是要讲一下宿主机如何和macvlan网络之间通信的。

我们刚刚写到macvlan网络是绑定网口的,那么我们可以将宿主机的另一个网口和这个绑定的网口,同时接到交换机上,然后把宿主机的需要用到的服务绑定到另一个网口,那么理论上就实现了宿主机和macvlan网络之间通信。

但是这种方法需要系统支持,比如威联通就支持绑定服务到特定端口。因此局限性较大。

威联通启用服务绑定威联通启用服务绑定

通用方法

因为macvlan网路之间可以互访,那么我们只需要再另外建立一个macvlan网络,使得主机通过另一个macvlan网络来访问当前docker的macvlan网络。

第一步,在原网卡上新建macvlan网络;

ip link add cvlan-mbw link eth2 type cvlan mode bridge

第二步,设置虚拟接口IP,使其位于同一网段内;

ip addr add 10.10.10.254 dev cvlan-mbw

第三步,启动接口;

ip link set cvlan-mbw up

第四步,将建立在macvlan网络上的容器路由至该虚拟接口即可。

ip route add 10.10.10.21 dev cvlan-mbw
ip route add 10.10.10.22 dev cvlan-mbw

以上命令会在重启后失效,因此需要建立脚本进行固化操作。

群晖系统可以把这些命令写入计划任务即可

好的,根据你给出的脚本,我们可以按照以下步骤将其设置为系统启动脚本:

  1. 首先,把你的脚本保存为一个文件。我们可以把它命名为macvlan_setup.sh。确认它的内容如下:

    #!/bin/ship link add cvlan-mbw link eth2 type cvlan mode bridge
    ip addr add 10.10.10.254 dev cvlan-mbw
    ip link set cvlan-mbw up
    ip route add 10.10.10.21 dev cvlan-mbw
    ip route add 10.10.10.22 dev cvlan-mbw

  2. 把这个脚本文件移动到/etc/init.d/目录下(或者/etc/rc.d/,取决于你的系统)。

    sudo mv cvlan_setup.sh /etc/init.d/

  3. 确保脚本具有可执行权限:

    sudo cod +x /etc/init.d/cvlan_setup.sh

  4. 现在,你需要使用chkconfigupdate-rc.d将你的脚本添加到系统服务中。这个步骤依赖于你的系统:

  • 在基于Red Hat的系统中(如CentOS或Fedora),你可以使用chkconfig命令:

  • sudo chkconfig —add macvlan_setup.sh

  • 在基于Debian的系统中(如Ubuntu或Debian本身),你可以使用update-rc.d命令:

  • sudo update-rc.d macvlan_setup.sh defaults

以上步骤在系统启动时将会执行你的脚本。但是需要注意,该脚本运行所需的所有权限都必须在系统启动时可用。换句话说,如果你的脚本需要特定的用户权限或环境变量,你需要确保这些在系统启动时已经设置好。

总结

今天基本就把docker的macvlan网络模式的应用基本讲清楚了,值友们在使用过程中有什么问题或者本文有什么疏漏,欢迎各位在评论区批评指正。

这就是本期的全部内容了,如果这篇文章对您有帮助的话,欢迎您在评论区多多讨论,也欢迎关注、点赞、打赏一键三连,您的支持对我非常重要。

我是冥冰薇,点个关注不迷路,我们下期再见。