群晖创建桥接网络-使容器和路由器一个网段
本文最后更新于 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 更新

打开网卡混杂模式

# 打开网卡混杂模式
ip link set ovs_eth0 promisc on

接下来创建docker桥接网络

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

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/

原创声明
本文由 NG6 于2020年03月08日发表在 sleele的博客
如未特殊声明,本站所有文章均为原创;你可以在保留作者及原文地址的情况下转载
转载请注明:群晖创建桥接网络-使容器和路由器一个网段 | sleele的博客

评论

  1. ZAYU
    Windows Edge
    1年前
    2023-1-11 14:49:46

    docker: Error response from daemon: failed to create the ipvlan port: operation not supported.
    大佬群晖dsm7.1无法用ipvlan怎么办啊

  2. bbbb
    Windows Chrome
    1年前
    2022-11-08 22:39:54

    message”:”failed to create the ipvlan port:

  3. MJ
    Windows Chrome
    已编辑
    3年前
    2021-3-06 13:59:56

    补充一下,这样群晖本机IP 192.168.1.92,和使用bridge-host的docker就不能互相访问。

    转载:【Docker】macvlan网络模式下容器与宿主机互通
    https://rehtt.com/index.php/archives/236/

    0x00
    一般在macvlan模式下同网段的其他机器可以和容器互通,但宿主不能和容器互通,这是在macvlan模式设计的时候为了安全而禁止了宿主机和容器直接通信。

    如果想要实现互通,有个曲线救国的方法,就是macvlan与macvlan之间可以互通,只需要在宿主机再创建一个macvlan网络,然后修改路由,让数据经过这个macvlan达到互通的目的。

    0x01
    假设现有网段为192.168.1.0/24的网络:
    名字 ip 接口
    群晖 192.168.1.200 eth0
    容器1 192.168.1.253 macvlan
    容器2 192.168.1.254 macvlan
    建立一个名为macvlan2的macvlan接口,并分配一个ip:

    名字 ip 接口
    macvlan2 192.168.1.200 macvlan
    命令:
    ip link add macvlan2 link ovs_eth0 type macvlan mode bridge
    ip addr add 192.168.1.200 dev macvlan2
    ip link set macvlan2 up

    修改路由,让宿主机到容器(192.168.1.20)的数据经过macvlan2:
    ip route add 192.168.1.253 dev macvlan2
    ip route add 192.168.1.254 dev macvlan2

    0x02
    宿主机 访问 容器1的ip:192.168.1.253
    宿主机 访问 容器2的ip:192.168.1.254
    容器1和2访问 宿主机ip:192.168.1.200

    • NG6
      MJ
      博主
      Macintosh Chrome
      3年前
      2021-3-06 18:17:20

      @MJ 优质评论👍
      当时我也发现,宿主机不能和容器互通,并且桥接的docker容器也不能和macvlan模式下的容器通讯,但是后来就没有深入研究了

  4. 匿名
    Macintosh Chrome
    4年前
    2020-3-23 1:13:10

    你好,我所有的步骤都是按你的教程设定的,但是创建好的容器没有网络,是因为我的主路由虚拟机装的lede的原因吗?

    • NG6
      匿名
      博主
      Macintosh Safari
      4年前
      2020-3-23 10:40:09

      @匿名 看一下你网段对不对,还有网关和掩码

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇