核心概念:Linux 虚拟网络架构
在 Ubuntu 中,虚拟网络功能主要由内核模块和用户空间工具实现,核心组件包括:

-
网络命名空间:这是虚拟化网络的核心,每个网络命名空间都有一个独立的网络栈,包括自己的网卡、路由表、ARP 表、iptables 规则等,这使得不同的容器或虚拟机可以拥有完全隔离的网络环境,即使它们运行在同一台物理主机上。
-
虚拟以太网设备:这是连接不同网络命名空间的桥梁,它成对创建,
veth0和veth1,数据从一端进入,会从另一端原封不动地出来,常用于将容器连接到主机的docker0网桥。 -
网桥:虚拟交换机,它在 OSI 模型的第二层(数据链路层)工作,可以连接多个网络接口(无论是物理的还是虚拟的),并让它们在同一个二层网络中通信,当数据帧到达网桥时,网桥会根据 MAC 地址表决定将其转发到哪个端口。
-
VLAN (Virtual LAN):在物理交换机上,可以通过 VLAN 技术将一个物理网络划分为多个逻辑上独立的广播域,Linux 也支持创建 VLAN 设备,将一个物理网卡“虚拟”出多个 tagged 网络接口。
(图片来源网络,侵删) -
iproute2工具集:这是现代 Linux 网络配置的基石,取代了老旧的ifconfig和route命令,我们主要使用ip命令来管理上述所有组件。
基础配置:使用 iproute2 工具
iproute2 是进行高级网络配置的基础,我们先来看一些最常用的命令。
查看网络状态
# 查看所有网络接口 ip addr show # 或者简写 ip a # 查看路由表 ip route show # 或者简写 ip r # 查看网络连接状态 (类似 netstat) ip -s link show
创建和管理虚拟以太网对
# 创建一对名为 veth0 和 veth1 的虚拟网卡 sudo ip link add veth0 type veth peer name veth1 # 查看创建结果 ip link show | grep veth # 启用这两个网卡 sudo ip link set veth0 up sudo ip link set veth1 up # 可以给它们分配 IP 地址 sudo ip addr add 192.168.100.1/24 dev veth0 sudo ip addr add 192.168.100.2/24 dev veth1 # 测试连通性 ping 192.168.100.2 # 从 veth0 ping veth1
创建和管理网桥
# 创建一个名为 mybr0 的网桥 sudo ip link add name mybr0 type bridge # 启用网桥 sudo ip link set mybr0 up # 将一个物理网卡(如 ens33)加入网桥 # 注意:加入网桥后,物理网卡自身不能再配置 IP 地址,网桥将接管 sudo ip link set ens33 master mybr0 # 将之前创建的 veth0 加入网桥 sudo ip link set veth0 master mybr0 # 给网桥分配 IP 地址,作为整个虚拟网络的网关 sudo ip addr add 192.168.50.1/24 dev mybr0 # veth1 可以通过 mybr0 与 ens33 所在的物理网络通信(如果路由配置正确) # veth1 的 IP 可以设置为 192.168.50.2/24 sudo ip addr add 192.168.50.2/24 dev veth1 ping 192.168.50.1 # 测试
实际应用场景:Docker 容器网络
Docker 是虚拟网络最典型的应用,理解了 Docker 的网络模型,就能很好地理解上述概念。
Docker 默认网络
当你安装 Docker 后,它会自动创建一个名为 docker0 的虚拟网桥。

# 查看 docker0 网桥
ip addr show docker0
# 通常它的 IP 是 172.17.0.1/16
# 启动一个容器,Nginx
docker run -d --name mynginx nginx
# 查看容器的网络命名空间
# 首先找到容器的 PID
docker inspect -f '{{.State.Pid}}' mynginx # 假设输出是 12345
# 然后查看该 PID 的网络命名空间
ls /proc/12345/net
# 或者使用 ip 命令
sudo ip netns identify 12345 # 会显示容器的命名空间 ID
# 进入容器的网络命名空间查看
sudo ip netns exec <namespace_id> ip addr show
# 你会看到一个名为 eth0 的虚拟网卡,IP 地址是 172.17.0.x
工作原理:
- Docker 创建了
docker0网桥。 - 当你启动一个容器时,Docker 会:
a. 创建一个新的网络命名空间。
b. 创建一对 veth 设备(
vethXXX和vethYYY)。 c. 将一端(vethXXX)连接到docker0网桥。 d. 将另一端(vethYYY)放入容器的命名空间,并命名为eth0。 e. 为eth0分配一个docker0网段内的 IP 地址。
创建自定义 Docker 网络
Docker 允许你创建更复杂的网络,bridge、overlay(跨主机)或 macvlan。
# 创建一个自定义的 bridge 网络,并指定子网 docker network create --driver bridge --subnet=192.168.100.0/24 --gateway=192.168.100.1 my_custom_net # 启动一个容器并连接到这个新网络 docker run -d --name app1 --network my_custom_net nginx # 再启动一个容器连接到同一个网络 docker run -d --name app2 --network my_custom_net nginx # 测试两个容器之间的通信 docker exec -it app1 ping app2 # 可以通过容器名 ping 通,因为 Docker 内置了 DNS
高级配置:VLAN 和 Open vSwitch (OVS)
当需要更复杂的网络功能(如 VLAN 标记、流量监控、多租户隔离)时,会使用更强大的工具。
Linux 内置 VLAN 支持
假设你的物理网卡是 ens33,你想让它处理 VLAN 10 的流量。
# 创建一个 VLAN 10 的虚拟接口,它基于 ens33 sudo ip link add link ens33 name ens33.10 type vlan id 10 # 启用 VLAN 接口 sudo ip link set ens33.10 up # 给 VLAN 接口分配 IP 地址 sudo ip addr add 10.10.10.2/24 dev ens33.10 # 所有发送到 ens33.10 的数据包都会被打上 VLAN 10 的标签 # 物理交换机的对应端口需要配置为 Trunk 模式,允许 VLAN 10 的流量通过。
使用 Open vSwitch (OVS)
OVS 是一个功能极其强大的虚拟交换机,被广泛用于 OpenStack、Kubernetes CNI 等场景。
安装 OVS:
sudo apt update sudo apt install openvswitch-switch
基本操作:
# 创建一个名为 br0 的 OVS 网桥 sudo ovs-vsctl add-br br0 # 将物理网卡 ens33 加入网桥,并设置端口为 trunk 模式,允许 VLAN 10 和 20 sudo ovs-vsctl add-port br0 ens33 set port ens33 trunks=10,20 # 创建一个内部端口(用于管理),并分配 IP sudo ovs-vsctl add-port br0 int_br0 sudo ip addr add 192.168.200.1/24 dev int_br0 sudo ip link set int_br0 up # 创建一个 VLAN 端口(相当于 Linux 内置的 VLAN) sudo ovs-vsctl add-port br0 vlan10 set port vlan10 tag=10 # 连接到 vlan10 端口的虚拟机/容器,就会在 VLAN 10 中通信
排错与管理技巧
-
查看命名空间列表:
sudo ip netns list
-
进入命名空间执行命令:
# 假设命名空间 ID 是 ns1 sudo ip netns exec ns1 ip addr show
-
查看网桥的 MAC 地址表:
# 对于 Linux Bridge bridge fdb show # 对于 Open vSwitch sudo ovs-vsctl show sudo ovs-ofctl dump-flows br0
-
持久化配置:
iproute2命令是临时的,重启后会丢失。- Ubuntu/Debian: 使用
/etc/network/interfaces文件(传统方式)或netplan(现代方式,Ubuntu 18.04+)来配置物理网卡和 IP 地址。 - 虚拟组件: 对于 veth、bridge 等临时创建的虚拟组件,如果需要持久化,通常需要编写
systemd服务或使用cloud-init,或者依赖像 Docker、Kubernetes 这样的编排工具来管理。
| 功能/概念 | 核心工具/命令 | 典型应用场景 |
|---|---|---|
| 基础网络配置 | ip addr, ip link, ip route |
手动配置虚拟网卡、路由,进行网络测试 |
| 虚拟以太网对 | ip link add ... type veth peer name ... |
连接不同网络命名空间,如 Docker 容器 |
| 虚拟网桥 | ip link add ... type bridge |
创建虚拟交换机,连接多个虚拟/物理设备 |
| 网络命名空间 | ip netns, unshare |
容器、虚拟机的网络隔离 |
| VLAN | ip link add ... type vlan |
在单台主机上划分多个二层网络 |
| Docker 网络 | docker network create, docker run --net |
容器间通信、容器与主机通信 |
| 高级虚拟交换机 | openvswitch-switch, ovs-vsctl |
OpenStack、Kubernetes、复杂网络虚拟化 |
掌握这些概念和工具,你将能够深入理解和管理 Ubuntu 系统中的各种虚拟网络环境,这对于从事运维、开发、虚拟化和云计算相关工作至关重要。
