群晖创建桥接网络-使容器和路由器一个网段

admin


本文最后更新于 2022年05月10日

前言

这段时间在研究infuse结合Plex,群晖默认nat桥接网络下是无法使用DLNA和infuse添加plex服务器的(虽然我到现在也没搞明白为什么还是添加不了,不过我觉得问题可能在于infuse那边出问题了,host模式也不行)

群晖创建桥接网络 macvlan

首先ssh进群晖,切换root权限,这个我之前讲过,这里就不再重复了

终端中输入ip addr查看网络信息,找到你群晖ip地址所在的那行

我的是群晖IP所在网络接口是ovs_eth0,我估计大部分单网口的应该都是这个数值,复制这个ovs_eth0

2020.04.23 更新

打开网卡混杂模式

Code example
1
2
# 打开网卡混杂模式
ip link set ovs_eth0 promisc on

接下来创建docker桥接网络

Code example
1
2
3
4
5
docker network create -d macvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.1 \
    -o parent=ovs_eth0 \
    bridge-host

需要自己修改的地方我都备注了是什么意思,大家需要根据自己的情况自行修改

注意!

一旦选错网口,虽然这个桥接网络可以创建,但是创建容器指定这个网络的时候将会提示Docker API失败。请访问Docker日志以获得更多信息。,所以一定要看好我一开始就看成eth0了,结果怎么弄都出错,后来一细看,原来搞错了

创建出于这个桥接网络下的容器

如图所示,在创建容器的网络页面添加这个网络,之后删除群晖默认的桥接网络

这样创建的容器的IP是不固定的,重启容器的时候可能会变,并且也不太好查ip,需要进路由器里看

所以我建议是在终端里创建容器,并指定ip,群晖的docker控制台实在是太简陋了,虽然易用,但是这种功能都不集成

创建容器并指定ip

Code example
1
docker create --name plex --network bridge-host --ip=192.168.1.5 linuxserver/plex

简单说明一下,用create容器是因为,大量的基础设置都没做,可以创建完容器后修改容器配置

预览

这样创建好的容器可以一个容器占用一个ip的所有端口,所以也就不需要做端口转发了,很多容器的高级功能都需要在这样的网络下,所以有的时候还是会用得上。

emby的话,需要DLNA功能也需要这样创建容器

docker macvlan 官方文档

docker macvlan 官方文档写的非常详细,有具体的例子可以参考

https://docs.docker.com/network/macvlan/#bridge-mode

有些应用程序,特别是传统的应用程序或监控网络流量的应用程序,希望直接连接到物理网络。在这种类型的情况下,你可以使用macvlan网络驱动为每个容器的虚拟网络接口分配一个MAC地址,使其看起来是一个直接连接到物理网络的物理网络接口。在这种情况下,你需要在你的Docker主机上指定一个物理接口用于macvlan,以及macvlan的子网和网关。你甚至可以使用不同的物理网络接口来隔离你的macvlan网络。请记住以下几点。

由于IP地址耗尽或 “VLAN扩散”,很容易在无意中损坏你的网络,这是你的网络中的唯一MAC地址数量不当的情况。

你的网络设备需要能够处理 “混杂模式”,即一个物理接口可以分配多个MAC地址。

如果你的应用可以使用桥接(在单个Docker主机上)或叠加(在多个Docker主机之间进行通信),从长远来看,这些解决方案可能会更好。

教程完

之后有空的话会去写sonarr和radarr的相关文章,追剧讲究个全流程自动化

2020.04.23 已写完

https://sleele.com/2020/03/16/高阶教程-追剧全流程自动化/

可惜目前群晖的docker还不支持ipvlan,DSM7.0还遥遥无期

Error response from daemon: plugin "ipvlan" not found

2022年5月10日 更新 群晖DSM 7.1 docker ipvlan network

DSM 7.1和群晖下的最新版本docker已经支持 ipvlan

现在可以在群晖下添加docker ipvlan network

docker network create -d ipvlan \    --subnet=192.168.1.0/24 \    --gateway=192.168.1.1 \    -o parent=ovs_eth0 \    -o ipvlan_mode=l3 bridge-host

IPVlan 简介

IPVlan 和 macvlan 类似,都是从一个主机接口虚拟出多个虚拟网络接口。一个重要的区别就是所有的虚拟接口都有相同的 macv 地址,而拥有不同的 ip 地址。因为所有的虚拟接口要共享 mac 地址,所有有些需要注意的地方:

  • DHCP 协议分配 ip 的时候一般会用 mac 地址作为机器的标识。这个情况下,客户端动态获取 ip 的时候需要配置唯一的 ClientID 字段,并且 DHCP server 也要正确配置使用该字段作为机器标识,而不是使用 mac 地址

ipvlan 是 linux kernel 比较新的特性,linux kernel 3.19 开始支持 ipvlan,但是比较稳定推荐的版本是 >=4.2(因为 docker 对之前版本的支持有 bug)。

两种模式

ipvlan 有两种不同的模式:L2 和 L3。一个父接口只能选择一种模式,依附于它的所有虚拟接口都运行在这个模式下,不能混用模式。

L2 模式

ipvlan L2 模式和 macvlan bridge 模式工作原理很相似,父接口作为交换机来转发子接口的数据。同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。

L3 模式

L3 模式下,ipvlan 有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相 ping 通对方,因为 ipvlan 会在中间做报文的转发工作。

ipvlan

L3 模式下的虚拟接口不会接收到多播或者广播的报文,为什么呢?这个模式下,所有的网络都会发送给父接口,所有的 ARP 过程或者其他多播报文都是在底层的父接口完成的。需要注意的是:外部网络默认情况下是不知道 ipvlan 虚拟出来的网络的,如果不在外部路由器上配置好对应的路由规则,ipvlan 的网络是不能被外部直接访问的。

参考文章

Use IPvlan networks:https://docs.docker.com/network/ipvlan/

Use macvlan networks:https://docs.docker.com/network/macvlan/

linux 网络虚拟化: ipvlan:https://cizixs.com/2017/02/17/network-virtualization-ipvlan/



1.367100s