虛擬網卡技術讓單張物理網卡承載多個邏輯介面,支援多 IP 服務、容器網路、VLAN 隔離、VPN 穿透等場景。本文系統梳理六大主流模式原理、配置方法與適用場景。
ip addr add 192.168.10.10/24 dev eth0 label eth0:0
# 或舊指令
ifconfig eth0:0 192.168.10.10 netmask 255.255.255.0 up
CentOS/RHEL (ifcfg):
# /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=static
IPADDR=192.168.10.10
NETMASK=255.255.255.0
ONBOOT=yes
Ubuntu Netplan:
network:
version: 2
ethernets:
eth0:
addresses:
- 192.168.1.100/24
- 192.168.10.10/24 # 直接多 IP,無需 alias 標籤
systemd-networkd:
[Network]
Address=192.168.1.100/24
Address=192.168.10.10/24
| 模式 | 特性 | 適用場景 |
|---|---|---|
| Private | 嚴格隔離,macvlan 間無法通訊,需經上層路由 | 多租戶強隔離 |
| VEPA | 流量送上游交換機,由交換機髮夾回傳(需交換機支援) | 交換機層面安全策略 |
| Bridge | macvlan 間可直接通訊(預設、最常用) | 容器網路、虛擬機直通 |
| Passthru | 單一 macvlan 直通物理介面 | 單容器獨佔網卡 |
# 臨時
ip link add link eth0 name macvlan0 type macvlan mode bridge
ip addr add 192.168.10.20/24 dev macvlan0
ip link set macvlan0 up
# 持久化 systemd-networkd
# /etc/systemd/network/20-macvlan0.netdev
[NetDev]
Name=macvlan0
Kind=macvlan
[MACVLAN]
Mode=bridge
# /etc/systemd/network/25-macvlan0.network
[Match]
Name=macvlan0
[Network]
Address=192.168.10.20/24
docker network create -d macvlan \
--subnet=192.168.10.0/24 \
--gateway=192.168.10.1 \
-o parent=eth0 \
macvlan_net
docker run --net=macvlan_net --ip=192.168.10.50 -it ubuntu bash
⚠️ 限制:宿主機無法直接與 macvlan 容器通訊(需建立同模式 macvlan 或經路由)。
ip link add link eth0 name ipvlan0 type ipvlan mode l3
ip addr add 192.168.10.30/24 dev ipvlan0
ip link set ipvlan0 up
# 需在宿主機啟用路由轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
# 臨時
ip link add link eth0 name eth0.100 type vlan id 100
ip addr add 192.168.100.10/24 dev eth0.100
ip link set eth0.100 up
# 持久化 ifcfg
# /etc/sysconfig/network-scripts/ifcfg-eth0.100
DEVICE=eth0.100
BOOTPROTO=static
IPADDR=192.168.100.10
NETMASK=255.255.255.0
VLAN=yes
ONBOOT=yes
# Netplan
network:
version: 2
vlans:
eth0.100:
id: 100
link: eth0
addresses: [192.168.100.10/24]
# 安裝工具
yum install -y bridge-utils
# 或 iproute2 (ip link)
# 臨時
ip link add name br0 type bridge
ip link set eth0 master br0
ip addr add 192.168.1.10/24 dev br0
ip link set br0 up
ip link set eth0 up
# 持久化 systemd-networkd
# /etc/systemd/network/10-br0.netdev
[NetDev]
Name=br0
Kind=bridge
# /etc/systemd/network/20-br0.network
[Match]
Name=br0
[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
DNS=114.114.114.114
# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0
[Network]
Bridge=br0
# 建立 TAP 裝置
ip tuntap add dev tap0 mode tap user $(whoami)
ip link set tap0 master br0
ip link set tap0 up
# 或使用 tunctl (舊工具)
tunctl -t tap0 -u $(whoami)
brctl addif br0 tap0
| 類型 | 層級 | 處理封包 | 典型應用 |
|---|---|---|---|
| TUN | L3 (IP) | IP 封包 | VPN (OpenVPN、WireGuard)、路由器 |
| TAP | L2 (Ethernet) | 乙太網幀 | 虛擬機 (QEMU/KVM)、橋接 VPN、L2TP |
import os, fcntl, struct
TUNSETIFF = 0x400454ca
IFF_TUN = 0x0001
IFF_TAP = 0x0002
IFF_NO_PI = 0x1000
tun = os.open('/dev/net/tun', os.O_RDWR)
ifr = struct.pack('16sH', b'tun0', IFF_TUN | IFF_NO_PI)
fcntl.ioctl(tun, TUNSETIFF, ifr)
# 現在可從 tun 讀寫 IP 封包
需要獨立 MAC 位址?
├── 是 → 需要 L2 隔離/廣播域?
│ ├── 是 → macvlan (Bridge/VEPA 模式) / VLAN
│ └── 否 → ipvlan L3 / macvlan Private
└── 否 → 只是多 IP 服務?
├── 是 → IP Alias / Netplan 多 Address / systemd-networkd 多 Address
└── 否 → 容器/虛擬機網路?
├── 虛擬機 (KVM/QEMU) → Bridge + TAP
├── 容器 (Docker/Podman) → macvlan / ipvlan / bridge (docker0) / host
└── VPN → TUN (L3) / TAP (L2)
# 查看所有介面
ip -br link
ip -br addr
# 查看 Bridge 狀態
bridge link
bridge fdb show dev br0
# 查看 VLAN
cat /proc/net/vlan/eth0.100
# 查看 macvlan/ipvlan
ip -d link show macvlan0
# 抓取特定虛擬介面封包
tcpdump -i macvlan0 -nn
tcpdump -i br0 -nn