Netavark 和 Aardvark-dns v1.14 已发布。感谢我们的贡献者,Netavark 的发布规模较大,增加了不少功能。让我们来看看这些功能;所有功能都假定您同时使用 Podman v5.4。
DHCP 主机名
Netavark 现在将容器主机名作为 DHCP 请求的一部分发送。因此,您的 DHCP 服务器知道主机名,并可以在其界面中显示给您。这样,如果您设置了自定义主机名,就可以轻松地将 IP 地址与容器主机名关联起来。如果您不希望为每个容器使用自定义主机名,可以在 containers.conf 文件的 [containers]
部分添加一个新选项 container_name_as_hostname
。如果未设置主机名,则默认为容器名称,而不是容器 ID 的前 12 个字符。
非托管桥接选项
桥接网络驱动程序增加了一些新功能。它现在支持一个名为 mode 的新选项,可以设置为 managed
(默认和当前行为)或 unmanaged
。在 unmanaged
模式下,桥接驱动程序预期桥接接口已存在于主机上,然后它将仅根据您的配置添加虚拟以太网设备 (veth) 对和 IP 地址。它不会配置任何 sysctl 选项或创建任何防火墙规则。此模式允许用户避免地址的网络地址转换 (NAT),并通过桥接将容器直接暴露到其局域网。这类似于 macvlan 驱动程序的工作方式。但是,macvlan 会绕过主机命名空间,无法连接到主机。使用桥接时,这可以正常工作,并且您的主机端防火墙规则将适用。
这是一个如何使用它的示例;我使用名为 br0
的桥接
[root@fedora ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 52:57:00:72:2c:5c brd ff:ff:ff:ff:ff:ff
altname enx525700722c5c
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:57:00:72:2c:5c brd ff:ff:ff:ff:ff:ff
inet 192.168.122.18/24 brd 192.168.122.255 scope global dynamic noprefixroute br0
valid_lft 1842sec preferred_lft 1842sec
inet6 fe80::e819:63e0:d546:ce4d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@fedora ~]# podman network create --interface-name br0 --opt mode=unmanaged --disable-dns unmanaged-br0
unmanaged-br0
[root@fedora ~]# podman run --network unmanaged-br0 --name c1 -d quay.io/libpod/testimage:20241011 top
d1c3623a0257c306c11f54dd343eb2224846d61af644bb552af445ca9af85f91
[root@fedora ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 52:57:00:72:2c:5c brd ff:ff:ff:ff:ff:ff
altname enx525700722c5c
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:57:00:72:2c:5c brd ff:ff:ff:ff:ff:ff
inet 192.168.122.18/24 brd 192.168.122.255 scope global dynamic noprefixroute br0
valid_lft 3552sec preferred_lft 3552sec
inet6 fe80::e819:63e0:d546:ce4d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: veth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000
link/ether 72:f6:6c:e0:28:bc brd ff:ff:ff:ff:ff:ff link-netns netns-ffab1a5f-7d3f-8211-caa8-1acceea8d53c
inet6 fe80::8cb9:e7ff:fe90:3354/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
[root@fedora ~]# podman exec c1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host proto kernel_lo
valid_lft forever preferred_lft forever
2: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether fe:d6:a4:f0:74:11 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.89.0.2/24 brd 10.89.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::fcd6:a4ff:fef0:7411/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
请注意,在非托管模式下创建网络时仍然存在两个问题。首先,如果您尝试为网络指定主机上已使用的子网,它将失败。一种解决方法是,在网络创建后手动修复网络配置文件中的子网 (https://github.com/containers/common/issues/2322)。其次,如果网络的网关 IP 未分配给桥接,aardvark-dns 目前无法与它一起使用,因此在创建网络时必须使用 `--disable-dns` (https://github.com/containers/netavark/issues/1177)。我计划在未来的版本中解决这些问题。
与桥接驱动程序一起使用 DHCP
到目前为止,DHCP 只能与 macvlan 驱动程序一起使用。现在,当与非托管模式结合使用时,它也可以与桥接驱动程序一起使用。
首先,确保您已启用/启动 netavark-dhcp-proxy 套接字,就像 macvlan 所需的那样。
[root@fedora ~]# systemctl start netavark-dhcp-proxy.socket
[root@fedora ~]# podman network create --interface-name br0 --opt mode=unmanaged --ipam-driver dhcp --disable-dns dhcp-br0
dhcp-br0
[root@fedora ~]# podman run --network dhcp-br0 --name c1 quay.io/libpod/testimage:20241011 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host proto kernel_lo
valid_lft forever preferred_lft forever
2: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 4a:5d:ee:60:48:fd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.122.159/24 brd 192.168.122.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::485d:eeff:fe60:48fd/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
[root@fedora ~]# podman start --attach c1
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host proto kernel_lo
valid_lft forever preferred_lft forever
2: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether a6:54:f3:5e:78:29 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.122.159/24 brd 192.168.122.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a454:f3ff:fe5e:7829/64 scope link tentative proto kernel_ll
valid_lft forever preferred_lft forever
如上所示,容器启动了两次,并且在这两种情况下,即使 MAC 地址不同,也分配了相同的 IP 地址。这是因为我们现在使用容器 ID 作为 DHCP 客户端标识符。因此,即使对于同一个容器,DHCP 服务器也会继续分配相同的 IP 地址。
桥接驱动程序支持 VLAN
在更复杂的网络设置中,您可能有一个桥接接口,它使用 VLAN 进行更好的网络隔离,在我的案例中,我使用 br-vlan
。
[root@fedora ~]# podman network create --interface-name br-vlan --opt mode=unmanaged --opt vlan=10 --disable-dns vlan10
vlan10
[root@fedora ~]# podman network create --interface-name br-vlan --opt mode=unmanaged --opt vlan=20 --disable-dns vlan20
vlan20
[root@fedora ~]# podman run --network vlan10 -d quay.io/libpod/testimage:20241011 top
1c342a2419a7dbdfccccd0a7d08856653bbf09214e8f535a2f1b18932bb6025e
[root@fedora ~]# podman run --network vlan20 -d quay.io/libpod/testimage:20241011 top
a18795cde2810ed35374be51511d49c84555e1149d385ada03e9865fd624144a
[root@fedora ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 52:57:00:72:2c:5c brd ff:ff:ff:ff:ff:ff
altname enx525700722c5c
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:57:00:72:2c:5c brd ff:ff:ff:ff:ff:ff
inet 192.168.122.18/24 brd 192.168.122.255 scope global dynamic noprefixroute br0
valid_lft 2133sec preferred_lft 2133sec
inet6 fe80::e819:63e0:d546:ce4d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
9: br-vlan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 1e:3e:f7:25:9b:8a brd ff:ff:ff:ff:ff:ff
inet6 fe80::1c3e:f7ff:fe25:9b8a/64 scope link tentative proto kernel_ll
valid_lft forever preferred_lft forever
11: veth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-vlan state UP group default qlen 1000
link/ether 72:f6:6c:e0:28:bc brd ff:ff:ff:ff:ff:ff link-netns netns-5ad070e5-f1c2-e238-0fa9-db65111ef764
inet6 fe80::2c65:4bff:fec8:f91d/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
12: veth1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-vlan state UP group default qlen 1000
link/ether 1e:3e:f7:25:9b:8a brd ff:ff:ff:ff:ff:ff link-netns netns-e8b58acc-1cf9-ecd6-c190-1cee21b4c7cf
inet6 fe80::b01d:e3ff:febd:e868/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
[root@fedora ~]# bridge vlan show
port vlan-id
enp1s0 1 PVID Egress Untagged
br-vlan 1 PVID Egress Untagged
veth0 1 Egress Untagged
10 PVID Egress Untagged
veth1 1 Egress Untagged
20 PVID Egress Untagged
如您所见,veth0 已在桥接上分配了 vlan 10,第二个容器的 veth1 分配了 vlan 20。它们默认也保持连接到 vlan 1,这是因为内核总是将默认的 pvid 分配给连接到桥接的接口。可以通过将默认 pvid 设置为 0 来避免这种情况,例如 ip link set br-vlan type bridge vlan_default_pvid 0
Firewalld
Firewalld 驱动程序得到了改进,并解决了主要的未解决错误,但仍被认为是实验性的。新增了手册页 netavark-firewalld(7),用于记录一些 firewalld 交互。
总结
新的 mode=unmanaged 桥接选项允许更好地集成到已存在桥接接口的现有网络设置中。它不创建防火墙规则,这意味着管理员可以随意配置规则,而无需担心 podman 绕过防火墙规则。通过使用 DHCP 和 VLAN 选项,它可以进一步集成到网络设置中。
如果您遇到任何问题或有其他想法,请随时通过我们的 GitHub https://github.com/containers/netavark/issues(用于错误和功能请求)和 https://github.com/containers/netavark/discussions(用于一般问题)与我们联系。
发表评论