新手教程
🎨新手教程:将 Docker 的自定义网络绑定到第二个网口
00 分钟
2023-9-21
2024-3-22
type
status
date
slug
summary
tags
category
icon
password
由于目前不少人习惯将 unRAID 的网关地址设置为旁路由(透明网关)的 IP 地址,以此来让 unRAID 可以走代理来使用。
关于 unRAID 的代理,大家可以了解博主的另一篇文章《新手教程:CA 应用商店代理》
但在这种使用方法下,unRAID 的所有流量都会发送给旁路由。比如说即使你给一个 qBittorrent Docker 容器设置了一个固定 IP 地址,那么这个 QB 容器也一样会将所有的下载请求发送给旁路由,因此在没有专门处理的情况下,P2P 下载就可能会使用代理。
为了避免这个问题,可以通过给 QB 容器设置一个固定的 IP 地址,然后在旁路由的代理工具中去控制这个 IP 的流量不走代理;又或者你也可以通过端口屏蔽(如果代理工具有这个功能的话)来让代理工具不去代理所有经过这个端口的流量。
例如:ShadowSocksR Plus+ 局域网控制功能
ShadowSocksR Plus+ 局域网控制功能
ShadowSocksR Plus+ 局域网控制功能
上述的这种方式主要针对的是 unRAID 只有一个网口可以使用的情况,如果说你的 unRAID 可以使用两个网口,那么其实你可以将另一网口专门用于 Docker 下载。
关于单独给 Docker 分配一个网口的方法,博主在另一篇文章《unRAID macvlan 失联问题解析(以及如何给Docker分配独立网口)》做过介绍(给 Docker 分配一个独立的网口还可以解决因 Macvlan 导致的失联问题,如果大家有遇到此问题可以去了解此文章)。

1. 实现条件

1.1 有第二个物理网口可以使用

最基本的条件是必须要有第二个网口可以使用,目前不少主板都提供了双网口,如果你的主板只有一个网口,那么如果有 PCIE 网卡的话也可以将网卡的网口分配给 unRAID 去使用。

1.2 从绑定中释放网口

(1)第二个网口不能绑定到“绑定成员”或者“桥接成员”中

如果你打开了网络设置中的“启用绑定”或者“启用桥接”功能,那么请按照下面的方法将 eth1 (或是 eth2、eth3 之类的,取决于你想用哪个)从其成员中列表中剔除;或者如果你不打算使用“绑定”或者“桥接”功能了,那么你直接关闭“启动绑定”或者“启用桥接”功能即可。
如果你开启了绑定功能,那么取消第二个网口作为绑定成员(比如 eth1),将其从成员中剔除,如下图所示:
取消勾选绑定成员中的 eth1
取消勾选绑定成员中的 eth1
如果你开启了桥接功能,那么取消第二个网口作为桥接成员(比如 eth1),将其从成员中剔除,如下图所示:
取消勾选桥接成员中的 eth1
取消勾选桥接成员中的 eth1

(2)同时这个网口也不能绑定到 VFIO-PCI 中

如果你的主板只有一个网口,但是你有 PCIE 网卡,那么你需要保证不要将 PCIE 网卡的所有网口都绑定到 VFIO-PCI ,你需要将其中一个取消绑定。
例如作者板载网口只有一个,但是有一个四口的 PCIE 千兆网卡,此时就不能将所有网口都绑定到 VFIO-PCI ,你需要将其中一个释放出来:
notion image

2. 设置方法

2.1 网络设置

当你释放出一个网口之后,在网络设置中看起来是这样的:
notion image
此时你需要对 eth1 进行如下设置:
notion image
  1. 不需要“启用绑定”;
  1. 也不需要“启用桥接”;
  1. 如果不需要给 Docker 容器非配 IPv6 地址,那么选择“仅 IPv4”即可;如果你需要给容器分配 IPv6 地址,那么请参考下面的补充说明
  1. 地址分配不需要开启。

2.2 Docker 自定义网络设置

“设置 - Docker” ,打开 Docker 右上角的“高级视图”:
notion image
notion image
  1. Docker 自定义网络类型:选择 Macvlan 。
  1. 主机访问自定义网络:不需要启用。
  1. 保留用户定义网络:如果你在使用 Docker 的时候使用了 Docker network create … 命令创建了自定义网络,那么你需要启用这里的设置,否则重启 unRAID 之后原先创建的自定义网络会消失。
  1. 接口上 IPv4 自定义网络 eth0 (可选):这里指的是针对 eth0 也就是管理口的 Docker 自定义网络设置,由于我们启用了第二个网口来给到 Docker 去使用,所以不需要启用 eth0 的设置。
  1. 接口上 IPv4 自定义网络 eth1 (可选):启用并将子网设置为你的内网网段,例如 192.168.1.0/24 ,网关设置为主路由的 IP 地址(而不是旁路由的地址),DHCP 池可以启用也可以不启用。
至此,我们就配置好了给到 Docker 使用的第二个网口。

3. 给 Docker 容器使用第二个网口

notion image
在给 Docker 分配网络时只需要选择 Custom:eth1 并分配一个固定的 IP 地址即可,当 Docker 运行时就会使用第二个网口向外发送网络请求,所有的流量也会经过第二个网口出去。
由于第二个网口的网关指向的是主路由地址而不是旁路由,所以使用了第二个网口的 Docker 容器就不会将流量发送到旁路由上,也就避免了走了代理这种情况。
可以看到,给 Docker 容器分配网络的方式是使用固定内网网段 IP ,我曾想实现第二个网口 eth1 上去创建 Bridge 或者 Macvlan 网络,但是使用起来仍然是会使用管理口与外界通信,所以目前我也没弄清楚要如何去实现,如果大家有了解的欢迎评论区留言。

4. 补充说明

如果你在按照上面的配置方法配置之后不成功,例如在创建 Docker 容器的时候没有 Custom: eth1 自定义网络可以选择,那么就说明你可能没有正确配置相关的网络设置,你可以参考下面的说明来进行解决。

4.1 两个网口的 IP 地址不能同网段。

💡
注意:这里的网络设置特指“设置(Settings) - 网络设置(Network Settings)”中的相关配置。
关于网络设置中的 IP 地址分配有个需要大家注意的地方,那就是如果你打算给第二个网口分配 IP 地址(比如说本文的 eth1 ),那么这个 IP 地址不能与原来 unRAID 的 IP 地址同处一个网段。
那为什么要给第二个网口分配固定的 IP 地址,不分配不行吗? 如果你不需要给 Docker 容器分配 IPv6 地址,那么第二个网口不需要设置任何固定 IP 地址(正如前面的操作方法);但如果说你希望给 Docker 容器分配 IPv6 地址,那你就必须在 Docker 专用网卡上配置一个固定的 IPv4 地址,而这个固定的 IPv4 地址就得避开这里所说的问题 —— 不能与其他网口的 IP 同网段。具体关于给容器分配 IPv6 地址的方法你可以参考下文的说明
例如 unRAID 的 IP 地址是 192.168.1.10 ,那么第二个网口就不能分配如 192.168.1.11 这样的同网段地址,而应该使用不同网段 IP ,如 192.168.2.10 ,比如下图所示:
notion image
之所以不能分配同网段 IP 是出于网络稳定性的考虑,虽然 unRAID 在设置上并没有禁止用户在其他网口上设置同网段的 IP 地址,但是这么做的话可能会导致网络出现问题,并且还会有个副作用就是如果这个网口要拿去给 Docker 配置自定义网络,那么这时候是不能正常配置 Docker 自定义网络并给到 Docker 容器去使用的。
此问题所涉及到的具体原理叫做 ARP Flux Problem ,大家感兴趣的可以去搜索相关的资料了解。
举个错误的例子,比如说我的 eth0 网卡和 eth1 网卡都设置成了相同网段的 IP ,如下图:
notion image
然后 Docker 自定义网络如下配置(也是错误的配置):
notion image
然后当你创建 Docker 想要分配对应网卡的自定义网络时就会发现没有 Custom: eth1 可选:
notion image

4.2 给 Docker 容器分配 IPv6 地址的方法

如果你希望 Docker 容器也能够使用 IPv6 地址,那么你需要:
  1. “网络协议”选择“IPv4 + IPv6”;
  1. 设置一个固定的 IPv4 地址,并且不能与其他网口的网段相同。例如,假设 eth0 管理口的 IP 地址是 192.168.1.10,那么 eth1 口的 IP 地址就不能使用 192.168.1.x 同网段的 IP 地址;
  1. IPv6 地址可以选择自动分配。
之所以需要这么进行处理,是因为在 Unraid 中如果需要给 Docker 容器分配 IPv6 地址,那么是需要有一个固定的 IPv4 地址与之进行绑定。配置可以参考下图:
notion image
notion image
给 Docker 容器分配 IPv6 地址:
当你看到 固定 IP 地址(可选) 那一栏设置出现了 IPv6 地址,那就说明你对自定义网络的 IPv6 配置是有效的
当你看到 固定 IP 地址(可选) 那一栏设置出现了 IPv6 地址,那就说明你对自定义网络的 IPv6 配置是有效的
  1. 选择 eth1 口所对应的自定义网络类型;
  1. 设置一个固定的 IPv4 地址。

4.3 给其他网口分配不同的网段 IP 需要路由器支持

前面说了,我们在给其他的网口分配 IP 的时候需要分配不同网段的 IP 地址,但是这么做有个前提就是你的路由器必须支持这一做法,否则默认情况下两个不同网段的 IP 是不能互相访问的。
排除 VLAN 的情况下,最简单的条件就是你的路由器可以实现“拓展 IP”或者“主从 IP”功能。
例如在 iKuai 系统中,我们可以在 LAN 口的网络设置中配置多个扩展 IP 网段,如:
notion image
当我在 iKuai 的拓展 IP 中添加了一个 192.168.2.1 的 IP 之后,那么就意味着当前网段可以与 192.168.2.0/24 网段的 IP 进行通信了,那么这时候我就可以给我 Unraid 上面的第二个网口设置一个 192.168.2.X/24 IP 地址,这样既不会与 eth0 口的网段产生冲突,而且彼此网段之间也可以正常通信。
当然这么做也是有缺点的,那就是会扩大广播域,设备多了就会造成网络通信效率下降。
而在华为交换机中,同样的功能叫做“主从 IP”:
notion image
当我们在路由器上面使用了这个功能之后,Unraid 上面其他网口的不同网段 IP 就可能正常的与当前主网段的 IP 进行通信了。
如果你的路由器不支持这个功能,那么只能是从 VLAN 的角度去处理了。
另外,OpenWRT 也是可以实现同样的目的,那就是在 LAN 口之上创建子接口,我之前写过类似的文章,参考:

评论