Xem*_*emX 4 networking linux container docker
我有一个用例,我创建了一个 Docker macvlan 网络(默认桥接模式)并将这个网络连接到一个正在运行的 Docker 容器(例如 C1)。所以容器会有一个新的 macvlan 接口(例如 eth1)。
docker network create -d macvlan --subnet=172.16.16.0/24 --gateway=172.16.16.1 -o parent=ens224 macvlan-ens224
docker network connect macvlan-ens224 C1
Run Code Online (Sandbox Code Playgroud)
在容器 C1 中,我使用 macvlan (eth1) 接口和分配的 IP 创建了一个 macvtap 接口。
ip link add link eth1 name mymacvtap0 type macvtap mode private
ip addr add 172.17.17.2/24 dev mymacvtap0
ip link set up dev mymacvtap0
Run Code Online (Sandbox Code Playgroud)
现在,当我从容器内部 ping 子网 172.17.17.2/24 的某个 IP 时,使用容器 macvtap 接口的源 MAC 地址广播容器 ARP 请求。目标 IP 发回 ARP 回复。ARP 回复到达物理接口 ens224(从 tcpdump 中看到)。但是 Reply 永远不会到达容器内部。
有人请指出我在这里错过了什么?
这是 macvlan 驱动程序如何工作的主要方案:
+---------------+
| network stack |
+---------------+
| | | |
+---------+ | | +------------------+
| | +------------------+ |
| +------------------+ | |
| | | |
| aa +----------+ | | |
| eth0 +-----| macvlan0 |---+ | |
| / +----------+ | |
Wire +------+ +---------------+ bb +----------+ | |
--------| eth0 |------/ if dst mac is /--------| macvlan1 |------+ |
+------+ +---------------+ \ +----------+ |
\ cc +----------+ |
+-----| macvlan2 |---------+
+----------+
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,这种类型的接口按照下一个原则工作:它是在物理网卡上监听并只捕获自己的 mac 地址。
如果您将在 macvlan 底部添加任何其他接口。例如网桥或其他 macvlan/macvtap 接口,它会将来自它的任何流量传输到外部网络,但不会传输反向端。因为它只为自己的 mac 地址捕获流量。
为了解决您的问题,您应该使用 linux 网桥并通过 veth-interfaces 对将您的容器连接到网桥。
只有当它是端点时,您才应该使用 macvlan/macvtap 接口。
您可以在此处获取有关此类接口的更多信息:
| 归档时间: |
|
| 查看次数: |
4372 次 |
| 最近记录: |