IPVLAN 是 Linux 内核中的一种网络虚拟化技术,它允许你在同一物理设备上创建多个虚拟网络接口,这些接口可以共享同一个 MAC 地址。IPVLAN 提供了两种工作模式:L2 模式和 L3 模式。
在 L2 模式下,所有的 IPVLAN 接口都在同一广播域内,它们可以像在同一个交换网络中一样直接通信。这类似于传统的以太网网络,其中的设备可以直接通过 MAC 地址通信。
ip link add ipvlan0 link eth0 type ipvlan mode l2
ip link set ipvlan0 up
ip addr add 192.0.2.1/24 dev ipvlan0
ip link add ipvlan1 link eth0 type ipvlan mode l2
ip link set ipvlan1 up
ip addr add 192.0.2.2/24 dev ipvlan1
root@vm-133:~# ip r
default via 192.168.9.1 dev eth0 onlink
192.0.2.0/24 dev ipvlan0 proto kernel scope link src 192.0.2.1
192.0.2.0/24 dev ipvlan1 proto kernel scope link src 192.0.2.2
192.168.9.0/24 dev eth0 proto kernel scope link src 192.168.9.133
root@vm-133:~# ping 192.0.2.2
PING 192.0.2.2 (192.0.2.2) 56(84) bytes of data.
64 bytes from 192.0.2.2: icmp_seq=1 ttl=64 time=0.012 ms
^C
--- 192.0.2.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.012/0.012/0.012/0.000 ms
root@vm-133:~# ping 192.0.2.2 -I ipvlan0
PING 192.0.2.2 (192.0.2.2) from 192.0.2.1 ipvlan0: 56(84) bytes of data.
^C
--- 192.0.2.2 ping statistics ---
75 packets transmitted, 0 received, 100% packet loss, time 75765ms
在 L2 模式下,所有的 IPVLAN 接口都在同一广播域中,并且共享同一 MAC 地址。这意味着,当 ipvlan0
接口发送一个数据包到 ipvlan1
接口时,数据包将通过硬件接口(例如 eth0
)发出,但由于 ipvlan1
接口共享同一 MAC 地址,它将忽略这个数据包
删除已存在的 IPVLAN 接口:
ip link delete ipvlan0
ip link delete ipvlan1
创建 L3 模式的 IPVLAN 接口:
ip link add ipvlan0 link eth0 type ipvlan mode l3
ip link add ipvlan1 link eth0 type ipvlan mode l3
启动 IPVLAN 接口:
ip link set ipvlan0 up
ip link set ipvlan1 up
为 IPVLAN 接口分配 IP 地址:
ip addr add 192.0.2.1/24 dev ipvlan0
ip addr add 192.0.2.2/24 dev ipvlan1
root@vm-133:~# ip r
default via 192.168.9.1 dev eth0 onlink
192.0.2.0/24 dev ipvlan0 proto kernel scope link src 192.0.2.1
192.0.2.0/24 dev ipvlan1 proto kernel scope link src 192.0.2.2
192.168.9.0/24 dev eth0 proto kernel scope link src 192.168.9.133
root@vm-133:~# ping 192.0.2.2 -I ipvlan0
PING 192.0.2.2 (192.0.2.2) from 192.0.2.1 ipvlan0: 56(84) bytes of data.
^C
--- 192.0.2.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3078ms
在 L3 模式下,每个 IPVLAN 接口都在自己的 L3 域中。即使它们共享同一物理设备和 MAC 地址,它们也不能直接通信。这是因为在 L3 模式下,IPVLAN 接口是通过 IP 地址进行通信的,而不是通过 MAC 地址。这意味着,即使两个 IPVLAN 接口在同一个网络命名空间中,它们也不能直接通信,除非有一个路由进程或设备将数据包从一个接口路由到另一个接口。
这种设计使 L3 模式的 IPVLAN 能够在网络层(即 IP 层)提供隔离,这是 L2 模式无法提供的。这对于某些使用场景来说是非常有用的,例如,在云环境中,你可能希望每个虚拟机或容器都在自己的网络命名空间中,并且只能通过 IP 地址进行通信。
为了使它们能够通信,我们需要将数据包从一个 IPVLAN 接口路由到另一个 IPVLAN 接口,这需要使用网络命名空间和路由规则。
#创建网络命名空间:
ip netns add ns1
ip netns add ns2
#创建 L3 模式的 IPVLAN 接口,然后将它们移动到新的网络命名空间:
ip link add ipvlan0 link eth0 type ipvlan mode l3
ip link set ipvlan0 netns ns1
ip link add ipvlan1 link eth0 type ipvlan mode l3
ip link set ipvlan1 netns ns2
#在新的网络命名空间中启动 IPVLAN 接口,并为它们分配 IP 地址:
ip netns exec ns1 ip link set ipvlan0 up
ip netns exec ns1 ip addr add 192.0.2.1/24 dev ipvlan0
ip netns exec ns2 ip link set ipvlan1 up
ip netns exec ns2 ip addr add 192.0.2.2/24 dev ipvlan1
不通网段网络通信,需要配置网关,否则不通,之后就变成一个路由器了
ip netns add net1
ip netns add net2
ip link add ipv1 link eth0 type ipvlan mode l3
ip link add ipv2 link eth0 type ipvlan mode l3
ip link set ipv1 netns net1
ip link set ipv2 netns net2
ip netns exec net1 ip link set ipv1 up
ip netns exec net2 ip link set ipv2 up
ip netns exec net1 ip addr add 10.0.1.10/24 dev ipv1
ip netns exec net2 ip addr add 192.168.1.10/24 dev ipv2
ip netns exec net1 ip route add default dev ipv1
ip netns exec net2 ip route add default dev ipv2
sysctl -w net.ipv4.ip_forward=1