虚拟网卡veth+虚拟局域网vlan

虚拟网卡veth+虚拟局域网vlan

敲得码黛 338 2024-05-22

前言

在过去的几十年里,互联网发展得非常快。许多新兴技术迅速崛起,也有不少曾经的主流技术被淘汰。然而,有些技术因为其基础性和核心地位,一直在不断进步中保持着重要作用。
计算机网络就是其中之一。虽然网络架构和传输协议在不断更新,但其核心概念和原理一直都在发挥着关键作用,支撑着全球的信息交换。在这些技术中,网卡作为计算机连接网络的桥梁,起到了至关重要的作用。

网卡是什么?

网卡属于计算机硬件的一部分,是实现计算机数据传输的关键部件,最常见的有无线网卡和有线网卡,通常是直接或间接集成在计算机主板中,
它可以将计算机产生的数据发送到另一个网络,也可以将另一个网络的数据传递给我们的主机。

什么是虚拟网卡?

虚拟网卡是一种软件实现的网络接口,模拟了物理网卡的功能,使操作系统和应用程序可以通过它发送和接收网络流量。虚拟网卡在虚拟化、容器化的网络环境中发挥着重要的作用。

VETH——创建虚拟网卡及多个内部网络

环境:腾讯云轻量级应用服务器、CentOS 7操作系统

结构图

image-20240517101944754

Shell

# 创建三个网络命名空间用于隔离内部网络(查看命名空间:ip netns)
> ip netns add n1
> ip netns add n2
> ip netns add n3
# 创建三对虚拟网卡(查看网卡:ip link)
> ip link add veth0 type veth peer name veth1
> ip link add veth2 type veth peer name veth3
> ip link add veth4 type veth peer name veth5
# 为veth0、veth2、veth4分配ip地址
> ip addr add 192.168.0.1/24 dev veth0
> ip addr add 192.168.100.1/16 dev veth2
> ip addr add 192.167.0.1/16 dev veth4
# 将veth1、veth3、veth5分别移动到网络命名空间n1、n2、n3中
> ip link set veth1 netns n1
> ip link set veth3 netns n2
> ip link set veth5 netns n3
# 为veth1、veth3、veth5分配ip地址(ip netns exec前缀用来指定具体的网络命名空间)
> ip netns exec n1 ip addr add 192.168.0.2/24 dev veth1
> ip netns exec n2 ip addr add 192.168.100.2/16 dev veth3
> ip netns exec n3 ip addr add 192.167.0.2/16 dev veth5
# 启动网卡
> ip link set veth0 up
> ip netns exec n1 ip link set veth1 up
> ip link set veth2 up
> ip netns exec n2 ip link set veth3 up
> ip link set veth4 up
> ip netns exec n3 ip link set veth5 up

# 网络连通测试(仅用veth0、veth1示例,其他两对同理) 
> ping -I veth0 192.168.0.2
> ip netns exec n1 ping 192.168.0.1

小结

网络命名空间(netns)用来隔离三个虚拟以太网,成对出现的虚拟网卡(veth)在这里起到了类似于物理网线的作用。

VLAN——使用虚拟网桥连接多个局域网

结构图

image-20240517113259688

shell

# 创建虚拟网桥
> ip link add br-mybridge type bridge
# 将 veth0、veth2、veth4桥接到网桥中
> ip link set veth0 master br-mybridge
> ip link set veth2 master br-mybridge
> ip link set veth4 master br-mybridge
# 启动网桥
> ip link set br-mybridge up
# 修改主机路由表(删除旧路由+添加新路由)
> ip route del 192.168.0.0/24 dev veth0
> ip route del 192.168.0.0/16 dev veth2
> ip route del 192.167.0.0/16 dev veth4
> ip route add 192.168.0.0/16 dev br-mybridge
> ip route add 192.167.0.0/16 dev br-mybridge
# 添加命名空间内部的路由
> ip netns exec n1 ip route del 192.168.0.0/24 dev veth1
> ip netns exec n1 ip route add 192.168.0.0/16 dev veth1
> ip netns exec n1 ip route add 192.167.0.0/16 dev veth1
> ip netns exec n2 ip route add 192.167.0.0/16 dev veth3
> ip netns exec n3 ip route add 192.168.0.0/16 dev veth5
# 删除veth0、veth2、veth4的ip地址
> ip addr del 192.168.0.1/24 dev veth0
> ip addr del 192.168.100.1/16 dev veth2
> ip addr del 192.167.0.1/16 dev veth4
# 网络连通测试(仅用n1网络作为示例,其他两个网络同理) 
> ip netns exec n1 ping 192.168.100.2
> ip netns exec n1 ping 192.167.0.2

小结

虚拟网桥类似于物理交换机的作用,通过将多个虚拟网卡串联在一起实现内部通信功能。

深入思考:为什么网桥不需要设置ip地址?

因为网桥和物理交换机一样是工作在数据链路层基于mac地址转发帧(frame)的一种设备。如果该设备仅用来做转发功能,那么ip地址对其来说是可选的。

深入思考:为什么桥接后不修改路由表时,内部网络无法ping通原主机?

猜测:设置了桥接模式后,veth0/veth2/veth4的作用就仅仅是转发数据链路层的帧(frame)。此时ping命令产生的arp请求会转发给网桥br-mybridge进行处理,或许是网桥进行arp广播的时候veth0/veth2/veth4没有处理arp请求,所以导致无法通信。

NAT——使用iptables打通vlan和互联网

结构图

image-20240522145240147

shell

# 打开内核的ip转发功能:将net.ipv4.ip_forward=0 变更为 net.ipv4.ip_forward=1
> vim /etc/sysctl.conf
# 检查ip转发功能是否开启
> sysctl -p 
# 设置网关ip地址
> ip addr add 192.168.0.1/16 dev br-mybridge
# 设置子网的网关地址
> ip netns exec n1 ip route add default via 192.168.0.1 dev veth1
> ip netns exec n2 ip route add default via 192.168.0.1 dev veth3
> ip netns exec n3 ip route add default via 192.168.0.1 dev veth4
# (可选)关闭firewalld防火墙,因为firewalld防火墙是基于iptables的,所以会有很多规则可能会影响测试结果。生产环境切勿贸然尝试
> systemctl stop firewalld
# 添加br-mybridge与eth0的转发规则
> iptables -A FORWARD -i br-mybridge -o eth0 -j ACCEPT
> iptables -A FORWARD -i eth0 -o br-mybridge -j ACCEPT
# 添加nat规则
> iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 互联网连通测试(仅用n1网络作为示例,其他两个网络同理) 
> ip netns exec n1 curl baidu.com
> ip netns exec n1 ping 192.167.0.2

小结

通过iptables实现了虚拟网桥的路由功能,此时这里的虚拟网桥(br-mybridge)已经不仅仅只是做数据帧转发工作,同时还将基于ip协议转发网络层的数据包。所以这里br-mybridge的作用更相近于路由器

总结

本文通过veth讲解了虚拟局域网的通信方式,并通过虚拟网桥、iptables、nat等技术模拟了生活中比较常见的一些网络结构。