我在 openstack 上启动了 ubuntu.20.04 VM,它有 1 个中继端口,有来自同一网络的多个子端口,映射到 1 个父接口和多个子接口。例如,如果子网为192.168.64.0/24
,我有父接口 ip(VM IP)192.168.64.100
和多个子端口,例如192.168.64.101, 192.168.64.102
具有不同的 VLAN ID。我最初尝试使用以下命令手动设置子接口。
ubuntu@kp-proxy:~$ sudo ip link add link ens3 name ens3.101 type vlan id 101
ubuntu@kp-proxy:~$ sudo ip link set dev ens3.101 address fa:16:3e:ac:11:40
ubuntu@kp-proxy:~$ sudo ip link set ens3.101 up
ubuntu@kp-proxy:~$ sudo dhclient ens3.101
但是在上述情况下,dhclient 一直挂起,因此我/etc/netplan/50-cloud-init.yaml
手动修改了 dhcp 的 idfr,使用 mac 地址。更新后的文件如下所示。现在,当我应用 netplan 时,虽然命令似乎没有卡在 dhclient 命令中,但我看到子接口也具有与父接口相同的 mac 地址,因此没有从 openstack 的 dhcp 服务器检索到 ip 地址。
50-cloud-init.yaml 文件
network:
version: 2
renderer: networkd
ethernets:
ens3:
dhcp4: true
macaddress: fa:16:3e:b1:2b:16
mtu: 1450
vlans:
ens3.101:
link: ens3
id: 101
macaddress: fa:16:3e:ac:11:40
dhcp4: yes
dhcp-identifier: mac
ip 地址的输出:
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:b1:2b:16 brd ff:ff:ff:ff:ff:ff
inet 192.168.64.100/24 brd 192.168.64.255 scope global dynamic ens3
valid_lft 85261sec preferred_lft 85261sec
inet6 fe80::f816:3eff:feb1:2b16/64 scope link
valid_lft forever preferred_lft forever
3: ens3.101@ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
link/ether fa:16:3e:b1:2b:16 brd ff:ff:ff:ff:ff:ff
inet6 fe80::f816:3eff:feb1:2b16/64 scope link
valid_lft forever preferred_lft forever
如何为 ubuntu-20.04 正确配置 VLAN,我已经验证了centos-8.4
使用上述命令,它似乎有效,并且我能够获取具有 IP 地址的子接口,并且能够从其他机器 ping 到两个接口。
答案1
请解释为什么您需要在一台设备上使用多个 MAC 地址。如果您需要为一台设备的多个接口分配多个动态 IP 地址,请使用下面的解决方案 #2。但每个接口的 IP 地址必须位于分离IP 网络,不在同一个网络中,正如您所建议的 (192.168.64.0/24)。在解决方案 #2 中,只需一个 DHCP 服务器并将更多 DHCP 作用域分配给更多 IP 网络就足够了,一个作用域对应一个 IP 网络。
同一IP网络中各个节点的特殊IP设置可以通过DHCP服务器中的IP预留来解决。
情况
也许我错了,请纠正我。但我认为这是您对 VLAN 和 IP 接口的误解。
VLAN 是与 OSI 模型的第 2 层 (L2) 相关的设置。它使用数据帧、802.1Q 标记和 MAC 地址进行操作。VLAN 标记将一个平面 L2 网络拆分为多个 L2 网络,这些网络可以在同一物理基础设施上独立运行。这就像将一个网络交换机划分为多个独立的交换机。交换机可以通过 L3 路由器连接。在这种情况下,L2 分离(广播域等)仍然存在,但网络可以通过路由器进行通信。路由器可以过滤 IP 通信、阻止广播帧并执行其他有用的操作。
你写了:
例如,如果子网是 192.168.64.0/24,则我的父接口 ip(VM IP)为 192.168.64.100,以及多个子端口,例如 192.168.64.101、192.168.64.102,具有不同的 VLAN ID。
VLAN 通常用于将完整的 IP 网络彼此分隔,但不能用于分隔同一 IP 网络中的各个 IP 地址!这意味着一个 VLAN 应通过这种方式连接到一个 IP 网络(示例):
- VLAN 10 <--> 192.198.110.0/24
- VLAN 20 <--> 192.198.120.0/24
- VLAN 300 <--> 192.198.5.0/24
- ETC。
IP 网络和地址位于 OSI 模型的 L3 层。它是更高级别,在大多数概念中,IP 网络是“里面”L2网络,即里面VLAN。
在该概念中,通常应创建具有多个接口的用于 VLAN 间路由的路由器,每个接口位于一个 VLAN 中。例如:
- eth0.10,VLAN 10,IP 192.168.110.1
- eth0.20,VLAN 20,IP 192.168.120.1
- eth0.300,VLAN 300,IP 192.168.5.1
您提到的子端口(192.168.64.101、192.168.64.102 ...)如果位于同一 IP 网络中,则不能位于分离的 VLAN 中。这是颠倒的 VLAN 概念。我提到过分离交换机的示例。如果将一台交换机分离为多个虚拟交换机,然后将所有这些交换机连接到一个 IP 网络,则将失去分离。如果交换机通过同一 IP 网络和同一广播域互连,则交换机分离是没有意义的。
任何网络节点,包括 PC、VM 或 VLAN 间路由器,都不能在同一个 IP 网络或子网中拥有多个 IP 接口,因为这种情况下不存在规则来告诉节点必须使用哪个同级同网络接口来与同一网络中的对等节点进行通信。
可能的解决方案
可能性 #1
根本不要使用 VLAN。使用具有多个 IP 节点的一个 IP 网络。一个节点是您的主机,第二个节点是您的第一个虚拟机,第三个节点是您的第二台 VM 等等。您的主机上只需要一个 IP 接口即可与所有虚拟机进行通信。
可能性 #2
- 创建多个 (L2) VLAN。创建多个 (L3) IP 网络并一对一分配:VLAN 到 IP 网络。
- 在主机中创建 VLAN 间路由器。创建更多 IP 接口并将每个接口设置为一个 VLAN。参见上文中我的列表,其中有 eth0.10、eth.20... 接口。
- 在您的主机中启用 IP 路由。
- 为每个虚拟机分配一个 IP 接口。每个虚拟机将位于单独的 IP 网络和单独的 VLAN 中。只有主机中的路由器允许,虚拟机才能相互通信。