Linux的NetworkManager的nmcli con add type vlan
中的: ifname
, dev
,vlan.parent
, id
,vlan.id
nmcli con add type vlan
参数详解:ifname
, dev
, vlan.parent
, id
, vlan.id
在配置 VLAN 时,这些参数密切关联但各有特定作用。以下是这些参数的详细解析和相互关系:
一、参数关系图
二、参数详解与对应关系
命令行参数 | 配置文件属性 | 功能描述 | 必需性 | 示例 |
---|---|---|---|---|
ifname |
connection.interface-name |
定义 VLAN 接口的系统名称 | 必需 | ifname vlan10 |
dev |
vlan.parent |
指定 VLAN 的父设备 | 必需 | dev eth0 |
id |
vlan.id |
设置 VLAN ID | 必需 | id 100 |
vlan.id |
vlan.id |
id 的完整形式 |
同 id |
vlan.id 100 |
vlan.parent |
vlan.parent |
dev 的完整形式 |
同 dev |
vlan.parent eth0 |
⚠️ 关键说明:
id
和vlan.id
是等价参数,作用完全相同dev
和vlan.parent
是等价参数,作用完全相同- 完整形式 (
vlan.id
,vlan.parent
) 用于明确作用域
三、参数使用对比
1. 等价写法示例
bash
# 简写形式
sudo nmcli con add type vlan \
ifname vlan10 \
dev eth0 \
id 100
# 完整形式
sudo nmcli con add type vlan \
connection.interface-name vlan10 \
vlan.parent eth0 \
vlan.id 100
2. 配置文件映射
ini
# /etc/NetworkManager/system-connections/vlan10.nmconnection
[connection]
id=vlan10
type=vlan
interface-name=vlan10 # ifname 的值
[vlan]
parent=eth0 # dev 或 vlan.parent 的值
id=100 # id 或 vlan.id 的值
四、技术实现细节
1. 内核层面处理
2. 数据包处理流程
scss
[发送数据包]
1. 应用 → vlan10 接口 (ifname)
2. 内核添加 VLAN 标签 (id/vlan.id)
3. 通过 eth0 (dev/vlan.parent) 发送
[接收数据包]
1. eth0 (dev/vlan.parent) 接收帧
2. 内核检测 VLAN 标签 (id/vlan.id)
3. 转发到 vlan10 接口 (ifname)
五、最佳实践指南
1. 参数选择建议
场景 | 推荐参数 | 原因 |
---|---|---|
简单配置 | ifname , dev , id |
简洁易记 |
脚本编写 | vlan.parent , vlan.id |
明确作用域 |
批量操作 | 混合使用 | 根据上下文 |
2. 完整配置示例
bash
# 生产环境推荐写法
sudo nmcli con add type vlan \
con-name "prod-vlan100" \
ifname vlan-prod \
vlan.parent bond0 \ # 使用完整形式明确作用域
id 100 \ # 使用简写形式
ipv4.method manual \
ipv4.addresses 192.168.100.10/24
3. 参数优先级规则
-
显式优于隐式 :
vlan.id
显式覆盖id
(如果两者同时存在) -
作用域优先 :
vlan.parent
优先级高于dev
(同时存在时) -
错误处理:
bash# 当 id 和 vlan.id 冲突时 sudo nmcli con add type vlan \ ifname vlan10 \ dev eth0 \ id 100 \ vlan.id 200 # 此设置会覆盖 id 100
六、高级应用场景
1. 多级 VLAN (QinQ)
bash
# 第一层 VLAN
sudo nmcli con add type vlan \
ifname qinq_base \
dev eth0 \
id 1000
# 第二层 VLAN
sudo nmcli con add type vlan \
ifname customer_vlan \
vlan.parent qinq_base \ # 使用上一级 VLAN 作为父设备
vlan.id 200 # 完整形式明确作用域
2. 动态父设备绑定
bash
# 根据接口状态动态选择父设备
sudo nmcli con add type vlan \
ifname dynamic-vlan \
vlan.parent +"$(ip route | awk '/default/ {print $5}')" \
id 50
3. VLAN 标志配置
bash
sudo nmcli con add type vlan \
ifname vlan-flags \
dev eth0 \
id 75 \
vlan.flags 0x1 \ # 启用 reorder_hdr
vlan.ingress-qos-map "0:1,1:2" # QoS 映射
七、故障排查命令
1. 验证参数映射
bash
# 查看配置详情
nmcli -g all con show prod-vlan100 | grep -E "ifname|parent|id"
# 输出示例:
connection.interface-name:vlan-prod
vlan.parent:bond0
vlan.id:100
2. 检查内核状态
bash
# 查看接口信息
ip -d link show vlan-prod
# 输出片段:
10: vlan-prod@bond0: <BROADCAST,MULTICAST> mtu 1500 ...
vlan protocol 802.1Q id 100 <REORDER_HDR>
3. 监控数据包
bash
# 捕获带 VLAN 标签的流量
sudo tcpdump -i eth0 -e -vvv vlan
# 输出:
00:11:22:33:44:55 > 00:aa:bb:cc:dd:ee, ethertype 802.1Q (0x8100), vlan 100, # id=100
八、参数关系总结
关键要点:
ifname
:定义 VLAN 接口在系统中的可见名称dev
/vlan.parent
:指定 VLAN 的物理承载设备id
/vlan.id
:设置 VLAN 的逻辑标识符- 简写 vs 完整形式 :
dev
=vlan.parent
id
=vlan.id
- 功能相同,完整形式更明确
通过合理组合这些参数,您可以精确控制 VLAN 的各个方面:
- 网络可见性 (
ifname
) - 物理依赖 (
dev
/vlan.parent
) - 逻辑隔离 (
id
/vlan.id
) - 实现灵活可靠的 VLAN 配置
nmcli con add type vlan
参数详解:ifname
, dev
, vlan.parent
, id
, vlan.id
在 nmcli con add type vlan
命令中,这些参数用于配置 VLAN 接口的不同方面。它们之间存在等价关系和层次结构,下面我将详细解析每个参数的作用、区别和最佳实践。
核心参数关系图解
关键结论:
dev
和vlan.parent
完全等价id
和vlan.id
完全等价ifname
是独立参数
参数详解
1. dev
与 vlan.parent
(完全等价)
| 特性 | 说明 |
|-----------|-------------------------------------|-----------------|
| 作用 | 指定 VLAN 的父接口(物理或逻辑接口) |
| 是否必需 | 是 |
| 等价关系 | dev eth0
= vlan.parent eth0
|
| 使用场景 | 基础配置用 dev
,需要明确属性时用 vlan.parent
|
| 取值范围 | 已存在的接口名(eth0
, bond0
, team0
等) |
| 验证命令 | `ip -d link show <VLAN接口> | grep 'master'` |
| 配置优先级 | 命令行中最后出现的有效值生效 |
示例比较:
bash
# 两种写法完全等效
nmcli con add type vlan dev eth0 id 100
nmcli con add type vlan vlan.parent eth0 vlan.id 100
2. id
与 vlan.id
(完全等价)
| 特性 | 说明 |
|----------|--------------------------------------|------------------|
| 作用 | 指定 VLAN ID(虚拟局域网标识符) |
| 是否必需 | 是 |
| 等价关系 | id 100
= vlan.id 100
|
| 使用场景 | 基础配置用 id
,需要明确属性时用 vlan.id
|
| 取值范围 | 1-4094 |
| 验证命令 | `ip -d link show <VLAN接口> | grep 'vlan id'` |
| 特殊值 | ID 0(优先级标记),ID 1(默认VLAN),ID 4095(保留) |
示例比较:
bash
# 两种写法完全等效
nmcli con add type vlan ifname vlan100 dev eth0 id 100
nmcli con add type vlan ifname vlan100 vlan.parent eth0 vlan.id 100
3. ifname
(独立参数)
特性 | 说明 |
---|---|
作用 | 指定 VLAN 接口的名称 |
是否必需 | 否(默认生成 <dev>.<id> 格式) |
等价参数 | 无独立等价参数 |
取值范围 | 唯一接口名(长度≤15字符,允许 a-z, 0-9, _, -) |
验证命令 | ip link show |
最佳实践 | 生产环境建议明确指定 |
命名示例:
bash
# 自动命名(不指定 ifname)
nmcli con add type vlan dev eth0 id 100 # 生成 eth0.100
# 自定义命名
nmcli con add type vlan ifname mgmt_vlan dev eth0 id 100
参数组合使用示例
基础配置(最小参数)
bash
# 使用 dev 和 id(自动生成接口名 eth0.100)
nmcli con add type vlan dev eth0 id 100
完整配置(所有参数)
bash
nmcli con add type vlan \
con-name "Server-Mgmt" \
ifname mgmt_vlan \ # 自定义接口名
vlan.parent bond0 \ # 等价于 dev bond0
vlan.id 200 \ # 等价于 id 200
ipv4.method manual \
ipv4.addresses 192.168.100.5/24
混合使用风格
bash
# 混合使用不同风格参数
nmcli con add type vlan \
ifname storage_net \ # 自定义接口名
dev em1 \ # 父接口(等价 vlan.parent)
vlan.id 300 \ # VLAN ID(等价 id)
ethernet.mtu 9000
参数优先级与冲突处理
1. 当同时指定等价参数时
bash
# 示例:同时指定 dev 和 vlan.parent
nmcli con add type vlan \
dev eth0 \ # 指定父接口
vlan.parent bond0 \ # 覆盖前值
id 100
# 实际生效值:vlan.parent bond0
规则:最后出现的参数值生效
2. 当参数缺失时
缺失参数 | 系统行为 | 解决方案 |
---|---|---|
dev /vlan.parent |
命令失败(Error: 'dev' argument required) | 必须提供父接口 |
id /vlan.id |
命令失败(Error: 'id' argument required) | 必须提供 VLAN ID |
ifname |
自动生成 <dev>.<id> 格式接口名 |
建议显式指定以提高可读性 |
配置验证与查看
1. 查看生成配置
bash
# 查看连接配置
nmcli con show "Server-Mgmt" | grep -E 'ifname|vlan\.(parent|id)'
# 输出示例:
connection.interface-name: mgmt_vlan
vlan.parent: bond0
vlan.id: 200
2. 查看系统接口
bash
ip -d link show mgmt_vlan
# 输出关键信息:
5: mgmt_vlan@bond0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue state DOWN
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
vlan protocol 802.1Q id 200 <REORDER_HDR>
3. 查看配置文件
/etc/NetworkManager/system-connections/Server-Mgmt.nmconnection
:
ini
[connection]
id=Server-Mgmt
type=vlan
interface-name=mgmt_vlan # ifname 指定
[vlan]
parent=bond0 # dev/vlan.parent 指定
id=200 # id/vlan.id 指定
最佳实践指南
1. 企业级配置推荐
bash
# 清晰明确的参数风格
nmcli con add type vlan \
con-name "Prod-DataVLAN" \
ifname data_vlan300 \ # 描述性接口名
vlan.parent team0 \ # 明确使用属性名
vlan.id 300 \ # 明确使用属性名
ipv4.method manual \
ipv4.addresses 10.30.0.10/24
2. 参数风格选择原则
场景 | 推荐风格 | 示例 |
---|---|---|
简单临时配置 | 短参数 (dev , id ) |
dev eth0 id 100 |
生产环境持久配置 | 完整属性名 | vlan.parent bond0 vlan.id 200 |
脚本自动化 | 一致风格 | 统一使用 vlan.parent 和 vlan.id |
3. 避免的常见错误
bash
# 错误1:混合使用导致混淆
nmcli con add type vlan \
dev eth0 \ # 父接口
vlan.id 100 \ # 正确
id 200 # 冲突!覆盖 vlan.id
# 错误2:重复指定
nmcli con add type vlan \
vlan.parent eth0 \ # 父接口
dev eth1 \ # 冲突!覆盖 vlan.parent
vlan.id 100
高级应用场景
1. 嵌套配置(QinQ)
bash
# 第一层 VLAN
nmcli con add type vlan \
con-name "QinQ-Outer" \
ifname qinq_outer \
dev eth0 \
id 1000
# 第二层 VLAN
nmcli con add type vlan \
con-name "QinQ-Inner" \
ifname qinq_inner \
vlan.parent qinq_outer \ # 基于第一层VLAN
vlan.id 200
2. 绑定接口上的 VLAN
bash
# 创建绑定
nmcli con add type bond \
con-name TrunkBond \
ifname bond0 \
bond.options "mode=802.3ad"
# 添加物理接口
nmcli con add type bond-slave ifname eth1 master bond0
nmcli con add type bond-slave ifname eth2 master bond0
# 在绑定上创建 VLAN
nmcli con add type vlan \
con-name "BondVLAN400" \
ifname vlan400 \
dev bond0 \ # 基于绑定接口
id 400
3. 带标志的 VLAN 配置
bash
nmcli con add type vlan \
ifname secure_vlan \
dev eth0 \
id 500 \
vlan.flags reorder_hdr \ # VLAN标志
ethernet.mtu 9000
故障排除与验证
1. 参数冲突错误处理
bash
# 错误:Cannot set 'vlan.id': property is already set
# 原因:同时使用了 id 和 vlan.id
nmcli con add type vlan dev eth0 id 100 vlan.id 200
# 解决方案:只使用一种形式
nmcli con add type vlan dev eth0 vlan.id 100
2. 接口创建失败
bash
# 错误:Interface name 'eth0.100' already exists
# 解决方案1:删除冲突连接
nmcli con delete "vlan-eth0-100"
# 解决方案2:使用自定义 ifname
nmcli con add type vlan ifname custom_vlan dev eth0 id 100
3. VLAN 流量验证
bash
# 1. 检查 VLAN 标签
tcpdump -i eth0 -nn -e vlan
# 2. 验证父接口状态
ethtool -S eth0 | grep vlan
# 3. 检查内核支持
lsmod | grep 8021q
总结与选择建议
参数选择矩阵
使用场景 | 推荐参数组合 | 示例 |
---|---|---|
简单快速配置 | dev + id |
dev eth0 id 100 |
脚本/自动化 | vlan.parent + vlan.id |
vlan.parent bond0 vlan.id 200 |
明确接口名 | ifname + 父接口/VLAN ID 任一形式 |
ifname mgmt_vlan dev eth0 id 100 |
高可读性配置 | ifname + vlan.parent + vlan.id |
ifname data_vlan vlan.parent team0 vlan.id 300 |
黄金实践法则
- 一致性原则:在整个环境中保持参数风格一致
- 明确性原则 :生产环境总是指定
ifname
- 简洁性原则 :脚本中使用
dev
和id
简化命令 - 验证原则 :创建后执行
ip -d link show <接口名>
验证 - 文档原则:复杂配置添加注释说明
bash
# 创建管理VLAN:
# - 基于绑定接口 bond0
# - VLAN ID 100
# - 自定义接口名 mgmt_vlan
nmcli con add type vlan \
con-name "Management-VLAN" \
ifname mgmt_vlan \
vlan.parent bond0 \
vlan.id 100
通过理解这些参数的关系和区别,您可以更高效地使用 nmcli
配置 VLAN 网络,避免常见错误,并创建出易于维护的网络配置。
在 nmcli con add type vlan
命令中,ifname
、dev
、vlan.parent
、id
和 vlan.id
这些参数密切相关但各有特定用途。以下是它们的详细解释和相互关系:
核心参数解析
-
ifname
(接口名称)- 作用:指定 VLAN 虚拟接口的操作系统名称
- 特性 :
- 可选参数
- 默认值:
<父接口>.<VLAN ID>
(如eth0.100
) - 命名规则:必须符合 Linux 接口命名规范
- 示例 :
ifname vlan100
-
dev
(父设备)- 作用 :指定承载 VLAN 的物理或逻辑接口(
vlan.parent
的别名) - 特性 :
- 必需参数
- 与
vlan.parent
完全等价,可互换使用 - 必须是系统中已存在的接口
- 示例 :
dev eth0
或vlan.parent eth0
- 作用 :指定承载 VLAN 的物理或逻辑接口(
-
vlan.parent
(父设备)- 作用 :与
dev
完全相同,指定 VLAN 的底层承载接口 - 特性 :
- 必需参数
- 与
dev
参数互斥(只需使用其中一个) - 推荐使用更简洁的
dev
- 示例 :
vlan.parent bond0
- 作用 :与
-
id
(VLAN ID)- 作用 :指定 VLAN 标识符(
vlan.id
的别名) - 特性 :
- 必需参数
- 与
vlan.id
完全等价,可互换使用 - 取值范围:1-4094
- 示例 :
id 100
- 作用 :指定 VLAN 标识符(
-
vlan.id
(VLAN ID)- 作用 :与
id
完全相同,指定 VLAN 标签值 - 特性 :
- 必需参数
- 与
id
参数互斥(只需使用其中一个) - 推荐使用更简洁的
id
- 示例 :
vlan.id 200
- 作用 :与
参数关系总结
参数 | 等效参数 | 必需性 | 作用 | 推荐使用 |
---|---|---|---|---|
ifname |
无 | 可选 | 设置虚拟接口名称 | ✓ |
dev |
vlan.parent |
必需 | 指定父接口 | ✓(更简洁) |
vlan.parent |
dev |
必需 | 指定父接口 | |
id |
vlan.id |
必需 | 设置 VLAN ID | ✓(更简洁) |
vlan.id |
id |
必需 | 设置 VLAN ID |
实际使用中的组合方式
正确组合(推荐)
bash
# 最简洁写法(推荐)
nmcli con add type vlan \
con-name "VLAN100" \
ifname vlan100 \ # 可选
dev eth0 \ # 必需(等价于 vlan.parent)
id 100 # 必需(等价于 vlan.id)
# 完整参数写法
nmcli con add type vlan \
con-name "VLAN100" \
ifname vlan100 \
vlan.parent eth0 \
vlan.id 100
错误组合
bash
# 错误:同时使用 dev 和 vlan.parent(冗余)
nmcli con add type vlan dev eth0 vlan.parent eth0 id 100
# 错误:同时使用 id 和 vlan.id(冗余)
nmcli con add type vlan dev eth0 id 100 vlan.id 100
# 错误:缺少父接口(必需)
nmcli con add type vlan ifname vlan100 id 100
# 错误:缺少 VLAN ID(必需)
nmcli con add type vlan ifname vlan100 dev eth0
技术原理图解
diff
+---------------------+
| 物理接口 (eth0) |
+----------+----------+
|
| 携带 VLAN 标签
↓
+----------+----------+
| VLAN 虚拟接口 |
| - ifname: vlan100 |
| - vlan.id: 100 |
+---------------------+
创建后的系统表现
使用以下命令创建 VLAN:
bash
nmcli con add type vlan \
con-name "server-vlan" \
ifname mgmt_vlan \
dev enp5s0 \
id 150
在系统中将看到:
bash
$ ip -d link show mgmt_vlan
6: mgmt_vlan@enp5s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
vlan protocol 802.1Q id 150 <REORDER_HDR> # VLAN ID 和父接口
最佳实践建议
-
参数选择:
- 优先使用
dev
代替vlan.parent
- 优先使用
id
代替vlan.id
- 始终指定
ifname
以便管理
- 优先使用
-
命名规范:
bashifname vlan_{function}_{id} # 如 vlan_mgmt_100
-
复杂拓扑示例(在绑定接口上创建 VLAN):
bash# 创建绑定 nmcli con add type bond con-name bond0 ifname bond0 bond.options mode=802.3ad # 添加物理接口 nmcli con add type bond-slave ifname eth1 master bond0 nmcli con add type bond-slave ifname eth2 master bond0 # 在绑定上创建 VLAN nmcli con add type vlan \ con-name vlan_prod \ ifname vlan_prod \ dev bond0 \ # 父接口是绑定设备 id 200
-
配置持久性:
- 所有配置自动保存到
/etc/NetworkManager/system-connections/
- 使用
nmcli con reload
重载配置
- 所有配置自动保存到
理解这些参数的关系后,您可以根据需要选择最简洁或最明确的参数组合来创建 VLAN 配置,确保网络分段既符合技术要求又便于管理维护。
nmcli con add type vlan
参数详解:ifname
, dev
, vlan.parent
, id
, vlan.id
在 nmcli con add type vlan
命令中,这些参数共同定义了 VLAN 接口的完整配置。以下是它们的详细解释和相互关系:
一、参数关系表
参数 | 等价参数 | 作用 | 是否必需 | 示例 | 配置文件字段 |
---|---|---|---|---|---|
ifname |
无 | VLAN接口名称 | 必需 | ifname vlan10 |
interface-name |
dev |
vlan.parent |
父设备指定 | 必需 | dev eth0 |
vlan.parent |
id |
vlan.id |
VLAN ID | 必需 | id 20 |
vlan.id |
二、详细参数解析
1. ifname
- VLAN接口名称
-
功能:定义操作系统中的VLAN接口名称
-
特点 :
- 必须是唯一的系统标识符
- 用于所有网络命令(
ip
,ping
,ss
等) - 在
/sys/class/net/
中创建对应设备
-
示例 :
bashifname vlan-finance
2. dev
和 vlan.parent
- 父设备指定
-
功能:指定VLAN依赖的底层设备
-
特点 :
dev
是vlan.parent
的简写形式- 两者完全等价,可互换使用
- 必须是已存在的物理或虚拟接口
-
示例 :
bashdev eth0 # 简写形式 vlan.parent eth0 # 完整形式
3. id
和 vlan.id
- VLAN标识符
-
功能:设置802.1Q VLAN标签号
-
特点 :
id
是vlan.id
的简写形式- 两者完全等价,可互换使用
- 范围:1-4094
-
示例 :
bashid 30 # 简写形式 vlan.id 30 # 完整形式
三、参数等价性演示
等效配置示例
bash
# 简写形式(推荐)
sudo nmcli con add type vlan \
con-name "vlan-sales" \
ifname vlan20 \
dev eth0 \
id 20
# 完整形式
sudo nmcli con add type vlan \
con-name "vlan-sales" \
ifname vlan20 \
vlan.parent eth0 \
vlan.id 20
配置文件中的表示
ini
# /etc/NetworkManager/system-connections/vlan-sales.nmconnection
[connection]
id=vlan-sales
type=vlan
interface-name=vlan20 # ifname
[vlan]
parent=eth0 # dev/vlan.parent
id=20 # id/vlan.id
四、参数使用指南
1. 推荐使用形式
bash
# 最佳实践(简洁明了)
nmcli con add type vlan \
ifname <接口名> \
dev <父设备> \
id <VLAN ID>
2. 完整参数形式(特殊场景)
bash
# 当需要明确参数含义时使用
nmcli con add type vlan \
ifname <接口名> \
vlan.parent <父设备> \
vlan.id <VLAN ID>
3. 混合使用(不推荐)
bash
# 可行但不推荐(降低可读性)
nmcli con add type vlan \
ifname vlan30 \
dev eth1 \ # 简写
vlan.id 30 # 完整
五、参数依赖关系图
六、实际配置示例
1. 基础配置
bash
# 使用简写参数
sudo nmcli con add type vlan \
con-name "vlan-admin" \
ifname vlan-admin \
dev enp3s0 \
id 100
2. 完整参数配置
bash
# 使用完整参数名
sudo nmcli con add type vlan \
con-name "vlan-guest" \
ifname vlan-guest \
vlan.parent wlp4s0 \
vlan.id 200
3. 在绑定接口上创建VLAN
bash
# 创建绑定
sudo nmcli con add type bond con-name bond0 ifname bond0
# 在绑定上创建VLAN
sudo nmcli con add type vlan \
ifname vlan-bond \
dev bond0 \ # 使用绑定接口作为父设备
id 50
七、查看参数配置
1. 查看连接详情
bash
nmcli -p con show vlan-admin
# 输出包含:
# vlan.parent: enp3s0
# vlan.id: 100
# connection.interface-name: vlan-admin
2. 查看设备信息
bash
nmcli -p dev show vlan-admin
# 输出包含:
# GENERAL.DEVICE: vlan-admin
# VLAN.PARENT: enp3s0
# VLAN.ID: 100
八、参数修改方法
参数 | 是否可修改 | 修改方法 |
---|---|---|
ifname |
是 | nmcli con mod <name> ifname <new-name> |
dev /vlan.parent |
否 | 需删除后重建 |
id /vlan.id |
否 | 需删除后重建 |
bash
# 修改接口名
sudo nmcli con mod "vlan-admin" ifname admin-vlan
# 修改父设备或VLAN ID需要重建
sudo nmcli con delete "vlan-admin"
sudo nmcli con add ... dev enp4s0 id 101
九、常见错误及解决
错误:参数冲突
bash
# 错误:同时使用dev和vlan.parent
sudo nmcli con add type vlan \
ifname vlan30 \
dev eth0 \
vlan.parent eth0 \
id 30
# Error: property 'vlan.parent' is given multiple times
解决 :只使用一种形式(dev
或 vlan.parent
)
错误:缺少必需参数
bash
sudo nmcli con add type vlan ifname vlan40
# Error: VLAN connection needs 'dev' and 'id' properties
解决:补全所有必需参数
十、最佳实践
-
参数使用原则:
- 日常使用:
ifname
,dev
,id
- 脚本/文档:
ifname
,vlan.parent
,vlan.id
(更明确)
- 日常使用:
-
命名规范:
bash# 统一命名方案 ifname <功能>-v<ID> # 如 finance-v50
-
配置验证:
bash# 创建后立即验证 ip -d link show <ifname> nmcli con show <con-name>
-
批量配置脚本:
bash#!/bin/bash # 创建多个VLAN for i in {10..20}; do sudo nmcli con add type vlan \ ifname vlan$i \ dev eth0 \ id $i done
通过理解这些参数的关系和区别,您可以更灵活高效地使用 nmcli
配置 VLAN 网络,满足不同场景的需求。
在 nmcli con add type vlan
命令中,ifname
、dev
、vlan.parent
、id
和 vlan.id
这几个参数密切相关但作用不同。以下是它们的完整解析和关系说明:
参数关系总览
命令行参数 | 配置文件中属性 | 作用对象 | 功能描述 | 必要性 |
---|---|---|---|---|
dev |
vlan.parent |
物理接口 | 指定承载 VLAN 的底层物理设备 | 必填 |
id |
vlan.id |
VLAN 逻辑 | 指定 VLAN ID (1-4094) | 必填 |
ifname |
connection.interface-name |
虚拟接口 | 指定 VLAN 虚拟接口名称 | 可选 |
- | connection.id |
连接配置 | 连接配置名称(通过 con-name 设置) |
必填 |
详细解释
1. dev
与 vlan.parent
-
命令行参数 :
dev
-
配置文件属性 :
vlan.parent
-
作用 :指定 VLAN 的底层物理接口
-
特点 :
- 必须是系统中存在的物理接口(如
eth0
,enp3s0
) - 在命令行中使用
dev
,但在配置文件中存储为vlan.parent
- 必须是系统中存在的物理接口(如
-
示例 :
bashnmcli con add type vlan dev eth0 ...
生成配置文件:
ini[vlan] parent=eth0 # dev 映射为 vlan.parent
2. id
与 vlan.id
-
命令行参数 :
id
-
配置文件属性 :
vlan.id
-
作用 :定义 802.1Q VLAN 标签号
-
规则 :
- 范围:1-4094
- 必须与网络设备(交换机)配置匹配
-
示例 :
bashnmcli con add type vlan id 100 ...
生成配置文件:
ini[vlan] id=100 # id 映射为 vlan.id
3. ifname
(无直接配置文件等价属性)
-
命令行参数 :
ifname
-
配置文件属性 :
connection.interface-name
-
作用 :指定 VLAN 虚拟接口名称
-
特点 :
- 默认自动生成格式:
{父接口}.{VLAN ID}
(如eth0.100
) - 显式命名可提高可读性(如
vlan-finance
)
- 默认自动生成格式:
-
示例 :
bashnmcli con add type vlan ifname vlan-office ...
生成配置文件:
ini[connection] interface-name=vlan-office
参数依赖关系
完整命令示例与配置文件映射
命令:
bash
nmcli con add type vlan \
con-name office-vlan \ # 连接配置名称 → connection.id
ifname vlan-office \ # 虚拟接口名 → connection.interface-name
dev eth0 \ # 父接口 → vlan.parent
id 100 \ # VLAN ID → vlan.id
ipv4.method manual \
ipv4.addresses 192.168.100.5/24
生成的配置文件 (/etc/NetworkManager/system-connections/office-vlan.nmconnection
):
ini
[connection]
id=office-vlan # con-name 的值
type=vlan
interface-name=vlan-office # ifname 的值
[vlan]
parent=eth0 # dev 的值
id=100 # id 的值
[ipv4]
address1=192.168.100.5/24
method=manual
常见错误场景
-
dev
与物理接口不匹配:bash# 错误:物理接口 eth1 不存在 nmcli con add type vlan dev eth1 id 100 # 报错:Error: Failed to find parent device 'eth1'
-
id
超出范围:bash# 错误:VLAN ID 5000 无效 nmcli con add type vlan dev eth0 id 5000 # 报错:Error: vlan.id must be between 1 and 4094
-
ifname
冲突:bash# 错误:接口名 vlan-office 已存在 nmcli con add type vlan ifname vlan-office dev eth0 id 100 # 报错:Interface 'vlan-office' already exists
管理技巧
-
查看配置映射关系:
bashnmcli -g connection.interface-name,vlan.parent,vlan.id con show office-vlan
输出:
vlan-office eth0 100
-
修改参数:
bash# 更改父接口(更新 dev/vlan.parent) nmcli con modify office-vlan dev eth2 # 更改接口名(更新 ifname/connection.interface-name) nmcli con modify office-vlan ifname vlan-new
-
创建临时 VLAN(不保存配置):
bashnmcli --nocheck con add type vlan \ dev eth0 id 100 ifname temp-vlan \ save no autoconnect no
最佳实践
-
显式命名三要素:
bashnmcli con add type vlan \ con-name <配置名> \ ifname <接口名> \ dev <物理接口> \ id <VLAN ID>
-
生产环境推荐:
- 始终指定
ifname
(避免自动命名冲突) - 使用描述性名称(如
vlan100-mgmt
) - 将
con-name
与ifname
保持一致提高可维护性
- 始终指定
-
验证命令:
bash# 创建后立即验证 nmcli con up office-vlan && \ ip -br link show vlan-office && \ nmcli -g vlan.parent,vlan.id con show office-vlan
nmcli con add type vlan
参数深度解析:ifname
, dev
, vlan.parent
, id
, vlan.id
在创建 VLAN 连接时,这些参数定义了 VLAN 接口的关键属性。它们之间存在等价关系和依赖关系,下面进行详细解析:
参数关系图
参数详解
1. 父接口指定参数
参数 | 类型 | 作用 | 必需 | 示例 |
---|---|---|---|---|
dev |
主参数 | 指定承载VLAN的物理或逻辑接口 | 是 | dev eth0 |
vlan.parent |
属性参数 | dev 的替代写法,功能完全相同 |
是 | vlan.parent bond0 |
特点:
-
dev
和vlan.parent
完全等价,只需使用其中一个 -
必须是系统中已存在的接口:
baship link show # 查看可用接口
-
可以是:
- 物理接口:
eth0
,enp3s0
- 逻辑接口:
bond0
,br0
,vlan100
- 物理接口:
2. VLAN ID 指定参数
参数 | 类型 | 作用 | 必需 | 范围 | 示例 |
---|---|---|---|---|---|
id |
主参数 | 指定 802.1Q VLAN 标签值 | 是 | 1-4094 | id 100 |
vlan.id |
属性参数 | id 的替代写法,功能完全相同 |
是 | 1-4094 | vlan.id 200 |
特点:
id
和vlan.id
完全等价,只需使用其中一个- 特殊值:
- 0:优先级标记(非标准VLAN)
- 4095:保留值(禁止使用)
- 同一父接口上 ID 必须唯一
3. VLAN 接口指定参数
参数 | 类型 | 作用 | 必需 | 示例 | 命名建议 |
---|---|---|---|---|---|
ifname |
主参数 | 定义 VLAN 虚拟接口名称 | 是 | ifname eth0.100 |
<父接口>.<VLAN ID> |
特点:
-
长度 ≤ 15 字符
-
允许字符:字母、数字、下划线、点号
-
推荐命名格式:
<父接口短名>.<VLAN ID>
bashifname enp3s0.100 # 标准命名 ifname mgmt_vlan # 描述性命名
参数等价关系
等价组 1:父接口指定
bash
# 以下两种写法完全等价
dev eth0
vlan.parent eth0
等价组 2:VLAN ID 指定
bash
# 以下两种写法完全等价
id 100
vlan.id 100
完整命令示例
标准写法(推荐)
bash
nmcli con add type vlan \
con-name "VLAN100" \
ifname eth0.100 \ # VLAN接口名
dev eth0 \ # 父接口
id 100 \ # VLAN ID
ipv4.method manual \
ipv4.addresses 192.168.100.2/24
替代写法(功能相同)
bash
nmcli con add type vlan \
con-name "VLAN100" \
ifname eth0.100 \
vlan.parent eth0 \ # 替代dev
vlan.id 100 \ # 替代id
ipv4.addresses 192.168.100.2/24 \
ipv4.gateway 192.168.100.1
错误写法示例
bash
# 错误1:重复指定父接口
nmcli con add type vlan \
dev eth0 \
vlan.parent eth0 # 冲突!
# 错误2:重复指定VLAN ID
nmcli con add type vlan \
id 100 \
vlan.id 100 # 冲突!
# 错误3:缺少必需参数
nmcli con add type vlan \
ifname vlan100 # 缺少父接口和VLAN ID!
参数依赖关系
1. 创建 VLAN 必需的最小参数集
bash
type vlan + ifname + (dev 或 vlan.parent) + (id 或 vlan.id)
2. 典型工作流程
高级用法
1. 在绑定接口上创建 VLAN
bash
nmcli con add type vlan \
ifname bond0.200 \
dev bond0 \ # 基于绑定接口
id 200
2. 在网桥上创建 VLAN
bash
nmcli con add type vlan \
ifname br0.300 \
vlan.parent br0 \ # 基于网桥
vlan.id 300
3. 使用 VLAN 标志
bash
nmcli con add type vlan \
ifname eth0.400 \
dev eth0 \
id 400 \
vlan.flags reorder_hdr # 启用包头重排
验证与调试
1. 查看创建结果
bash
# 查看连接详情
nmcli -p con show VLAN100
# 检查VLAN关联
ip -d link show eth0.100
# 输出应包含: vlan id 100
# 查看内核VLAN配置
cat /proc/net/vlan/eth0.100
2. 参数优先级
当使用混合参数时,优先级为:
python
vlan.parent > dev
vlan.id > id
示例:
bash
# 最终使用 eth1 和 VLAN ID 200
nmcli con add type vlan \
dev eth0 \
vlan.parent eth1 \ # 优先级更高
id 100 \
vlan.id 200 # 优先级更高
最佳实践
-
一致性原则:
bash# 推荐使用统一风格 dev + id # 或 vlan.parent + vlan.id
-
命名规范:
bash# ifname: 物理接口.VLAN ID ifname enp3s0.100 # con-name: 功能+VLAN ID con-name Servers-VLAN100
-
生产环境建议:
bash# 1. 先测试临时连接 nmcli con add ... save no # 2. 验证功能 nmcli con up VLAN-TEST # 3. 创建永久连接 nmcli con add ... save yes
-
备份配置:
bash# 导出连接设置 nmcli con export VLAN100 > vlan100-backup.nmconnection
通过理解这些参数的关系和区别,您可以更精确地控制 VLAN 接口的创建过程,构建出稳定可靠的虚拟网络拓扑。
在 nmcli con add type vlan
命令中,参数 ifname
、dev
、vlan.parent
、id
和 vlan.id
虽然功能相关,但存在重要区别。以下是它们的详细解析和相互关系:
核心参数关系表
命令行参数 | 等效属性参数 | 配置文件位置 | 功能描述 | 必需性 |
---|---|---|---|---|
ifname |
- | [connection] interface-name |
指定 VLAN 接口名称 | 可选 |
dev |
vlan.parent |
[vlan] parent |
指定父设备 | 必需 |
id |
vlan.id |
[vlan] id |
指定 VLAN ID | 必需 |
详细解析
1. ifname
(接口名称)
-
功能:设置 VLAN 虚拟接口的名称
-
特点 :
- 仅作为命令行参数存在,无等效属性参数
- 控制配置文件中的
interface-name
值 - 省略时自动生成
<父设备>.<VLAN ID>
格式名称
-
示例 :
bashnmcli con add type vlan ifname mgmt-vlan ... # 显式设置接口名
-
配置文件体现 :
ini[connection] interface-name=mgmt-vlan # <-- ifname 的值
2. dev
与 vlan.parent
(父设备)
-
功能:指定承载 VLAN 的底层物理/逻辑接口
-
关系 :
dev
是vlan.parent
的命令行快捷方式- 两者完全等价,作用相同
-
特点 :
- 必需参数(必须二选一)
- 指向已存在的接口(eth0, bond0 等)
-
示例 :
bash# 两种写法等效 nmcli con add type vlan dev eth0 ... # 快捷方式 nmcli con add type vlan vlan.parent eth0 ... # 完整属性
-
配置文件体现 :
ini[vlan] parent=eth0 # <-- dev/vlan.parent 的值
3. id
与 vlan.id
(VLAN ID)
-
功能:定义 802.1Q VLAN 标签号
-
关系 :
id
是vlan.id
的命令行快捷方式- 两者完全等价,作用相同
-
特点 :
- 必需参数(必须二选一)
- 取值范围 1-4094
-
示例 :
bash# 两种写法等效 nmcli con add type vlan id 100 ... # 快捷方式 nmcli con add type vlan vlan.id 100 ... # 完整属性
-
配置文件体现 :
ini[vlan] id=100 # <-- id/vlan.id 的值
参数组合使用场景
场景 1:基本 VLAN 创建
bash
# 使用快捷参数 (推荐)
nmcli con add type vlan \
con-name servers-vlan \
ifname mgmt-net \ # 自定义接口名
dev bond0 \ # 等效 vlan.parent
id 100 # 等效 vlan.id
# 使用完整属性
nmcli con add type vlan \
con-name servers-vlan \
ifname mgmt-net \
vlan.parent bond0 \
vlan.id 100
场景 2:高级配置(带 IP 和标志)
bash
# 混合使用快捷参数和属性
nmcli con add type vlan \
con-name trunk-vlan \
ifname trunk.200 \ # 显式接口名
dev enp5s0f0 \ # 父设备
id 200 \ # VLAN ID
vlan.flags 0x1 \ # 特殊标志(只能用完整属性)
ipv4.method manual \
ipv4.addresses 192.168.200.5/24
配置文件实例
命令:
bash
nmcli con add type vlan \
con-name office-vlan \
ifname office-net \
dev eno1 \
id 50
生成的配置文件 (/etc/NetworkManager/system-connections/office-vlan.nmconnection
):
ini
[connection]
id=office-vlan
type=vlan
interface-name=office-net # ifname 的值
[vlan]
parent=eno1 # dev 的值
id=50 # id 的值
[ipv4]
method=auto
[ipv6]
method=ignore
使用注意事项
-
参数优先级:
- 同时使用
dev
和vlan.parent
会报错(冲突) - 同时使用
id
和vlan.id
会报错(冲突)
bash# 错误示例:重复指定 nmcli con add type vlan dev eth0 vlan.parent eth1 id 100 vlan.id 200
- 同时使用
-
必需参数规则:
配置项 最小有效参数组合 父设备 dev
或vlan.parent
VLAN ID id
或vlan.id
-
特殊属性:
-
某些 VLAN 属性只能用完整形式 :
bash# 设置 VLAN 标志 (无快捷参数) nmcli con add type vlan \ vlan.parent eth0 \ vlan.id 100 \ vlan.flags 0x1 # 只能使用完整属性
-
-
修改配置:
bash# 修改父设备 (必须用完整属性名) nmcli con mod office-vlan vlan.parent eno2 # 修改 VLAN ID (必须用完整属性名) nmcli con mod office-vlan vlan.id 60 # 修改接口名 nmcli con mod office-vlan connection.interface-name "new-name"
最佳实践建议
-
日常使用推荐:
bash# 使用快捷参数 (更简洁) nmcli con add type vlan \ con-name prod-vlan \ ifname prod-net \ dev bond0 \ id 300
-
脚本中使用:
bash# 使用完整属性 (更明确) nmcli con add type vlan \ con-name "${VLAN_NAME}" \ connection.interface-name "${IF_NAME}" \ vlan.parent "${PARENT_DEV}" \ vlan.id "${VLAN_ID}"
-
避免自动命名冲突:
bash# 不推荐:依赖自动命名 (bond0.300) nmcli con add type vlan dev bond0 id 300 # 推荐:显式命名 nmcli con add type vlan ifname prod-vlan dev bond0 id 300
-
跨平台一致性:
-
在 Ansible/Puppet 等工具中统一使用完整属性:
yaml# Ansible 示例 - name: Add VLAN nmcli: type: vlan conn_name: "office-vlan" ifname: "office-net" vlan.parent: "{{ parent_dev }}" vlan.id: 50
-
参数关系图
理解这些参数的区别和等价关系,能帮助您更灵活地使用 nmcli
:
- 快捷参数 (
dev
,id
) :日常交互更高效 - 完整属性 (
vlan.parent
,vlan.id
) :脚本和自动化更明确 - 专用参数 (
ifname
) :独立存在,控制接口命名
nmcli con add type vlan
参数终极解析
在创建 VLAN 连接时,这些参数共同定义了 VLAN 的完整配置。以下是这些参数的详细解释、区别和相互关系:
参数关系图
参数详解表
参数 | 类型 | 必需 | 配置文件位置 | 功能描述 | 示例值 |
---|---|---|---|---|---|
ifname |
独立参数 | 否 | [connection] interface-name |
设置VLAN接口名称 | mgmt-vlan |
dev |
简写参数 | 是 | [vlan] parent |
指定父接口的简写形式 | enp3s0 |
vlan.parent |
完整参数 | 是 | [vlan] parent |
明确指定父接口 | bond0 |
id |
简写参数 | 是 | [vlan] id |
设置VLAN ID的简写形式 | 100 |
vlan.id |
完整参数 | 是 | [vlan] id |
明确指定VLAN ID | 200 |
关键区别与关系
1. ifname
(接口名称)
-
唯一独立参数,不与其他参数冲突
-
功能:定义VLAN接口在系统中的名称
-
默认值 :
vlan<ID>
(如vlan100
) -
配置文件位置 :
ini[connection] interface-name=mgmt-vlan
2. dev
vs vlan.parent
(父设备)
-
完全等价,只是不同表达形式
-
关系 :
dev
是vlan.parent
的简写 -
互斥:不能同时使用
-
功能:指定承载VLAN流量的底层接口
-
配置文件位置 :
ini[vlan] parent=enp3s0
3. id
vs vlan.id
(VLAN ID)
-
完全等价,只是不同表达形式
-
关系 :
id
是vlan.id
的简写 -
互斥:不能同时使用
-
功能:设置802.1Q VLAN标签号
-
配置文件位置 :
ini[vlan] id=100
参数组合规则
允许的组合
禁止的组合
-
同时使用
dev
和vlan.parent
:bash# 错误示例 nmcli con add type vlan dev enp3s0 vlan.parent bond0 id 100
-
同时使用
id
和vlan.id
:bash# 错误示例 nmcli con add type vlan dev enp3s0 id 100 vlan.id 200
-
缺少父设备或VLAN ID:
bash# 错误:缺少父设备 nmcli con add type vlan ifname vlan100 id 100 # 错误:缺少VLAN ID nmcli con add type vlan ifname vlan100 dev enp3s0
完整配置示例
场景1:使用简写参数(推荐)
bash
sudo nmcli con add type vlan \
con-name prod-vlan100 \ # 连接名称
ifname mgmt-vlan \ # 自定义接口名
dev bond0 \ # 父设备(简写)
id 100 # VLAN ID(简写)
场景2:使用完整参数
bash
sudo nmcli con add type vlan \
con-name backup-vlan \
ifname backup-interface \
vlan.parent enp5s0 \ # 父设备(完整)
vlan.id 200 # VLAN ID(完整)
场景3:混合使用参数
bash
sudo nmcli con add type vlan \
con-name hybrid-vlan \
dev br0 \ # 父设备(简写)
vlan.id 300 # VLAN ID(完整)
# ifname未指定,自动创建vlan300
生成的配置文件分析
示例1:简写参数配置
命令:
bash
nmcli con add type vlan con-name vlan100 ifname mgmt dev enp3s0 id 100
配置文件 (/etc/NetworkManager/system-connections/vlan100.nmconnection
):
ini
[connection]
id=vlan100
type=vlan
interface-name=mgmt # ifname的值
[vlan]
id=100 # id的值
parent=enp3s0 # dev的值
示例2:完整参数配置
命令:
bash
nmcli con add type vlan con-name vlan200 vlan.parent bond0 vlan.id 200
配置文件:
ini
[connection]
id=vlan200
type=vlan
interface-name=vlan200 # 自动生成
[vlan]
id=200 # vlan.id的值
parent=bond0 # vlan.parent的值
最佳实践指南
1. 参数选择策略
场景 | 推荐参数组合 | 理由 |
---|---|---|
简单配置 | dev + id |
简洁高效 |
脚本编写 | vlan.parent + vlan.id |
明确清晰 |
嵌套配置 | dev + vlan.id |
提高可读性 |
临时测试 | dev + id (不带ifname) |
快速直接 |
2. 命名规范建议
bash
# 连接名称:<位置>-<功能>-vlan<ID>
con-name dc1-mgmt-vlan100
# 接口名称:<功能>-vlan<ID>
ifname mgmt-vlan100
3. 高级配置技巧
bash
# 创建带额外参数的VLAN
sudo nmcli con add type vlan \
con-name full-featured-vlan \
ifname adv-vlan \
dev enp6s0 \
id 400 \
vlan.flags 1 \ # 启用REORDER_HDR
ethernet.mtu 9000 \ # 巨帧支持
ipv4.method manual \ # 静态IP
ipv4.addresses 10.4.0.10/24 \
ipv4.gateway 10.4.0.1
4. 验证命令
bash
# 检查参数对应关系
nmcli -g connection.interface-name,vlan.parent,vlan.id con show vlan100
# 查看内核VLAN配置
ip -d link show mgmt-vlan
# 检查父接口状态
ethtool -i enp3s0 | grep -E "driver|bus-info"
故障排除速查表
问题现象 | 可能原因 | 解决方案 |
---|---|---|
"vlan.parent: property can't be set..." | 同时使用dev和vlan.parent | 只选一种父设备参数 |
"vlan.id: property can't be set..." | 同时使用id和vlan.id | 只选一种VLAN ID参数 |
"parent: property is missing" | 缺少父设备参数 | 添加dev或vlan.parent |
"id: property is missing" | 缺少VLAN ID参数 | 添加id或vlan.id |
"Device not available" | 父接口不存在 | 检查设备名是否正确 |
"VLAN id already used" | VLAN ID冲突 | 更换VLAN ID |
总结:黄金法则
-
必需参数 :必须提供父设备(
dev
或vlan.parent
)和VLAN ID(id
或vlan.id
) -
参数等价 :
dev
≡vlan.parent
id
≡vlan.id
-
互斥规则 :
- 不能同时使用
dev
和vlan.parent
- 不能同时使用
id
和vlan.id
- 不能同时使用
-
可选参数 :
ifname
用于自定义接口名(否则自动生成) -
配置层级 :
graph LR A[物理接口] --> B[dev/vlan.parent] C[VLAN ID] --> D[id/vlan.id] B --> E[VLAN配置] D --> E E --> F[ifname] F --> G[操作系统接口]
通过理解这些参数的差异和相互关系,您可以高效、准确地创建各种复杂度的VLAN配置,满足从简单网络隔离到复杂云环境的所有需求。
在 nmcli con add type vlan
命令中,参数系统有些微妙之处。以下是关于 ifname
、dev
、vlan.parent
、id
和 vlan.id
的完整解析:
核心参数关系表
参数 | 等效参数 | 作用 | 必需性 | 示例 |
---|---|---|---|---|
dev |
vlan.parent |
指定父接口 | 必需 | dev=eth0 或 vlan.parent=eth0 |
vlan.id |
id |
指定 VLAN ID | 必需 | vlan.id=100 或 id=100 |
ifname |
- | 指定 VLAN 接口名 | 可选 | ifname=vlan100 |
详细说明
1. 父接口指定参数(等价)
-
dev
和vlan.parent
完全等效 -
作用:定义承载 VLAN 的底层接口
-
必需:是
-
特点 :
- 必须是系统中已存在的接口(物理网卡、绑定接口、网桥等)
- 实际处理带 VLAN 标签的数据帧
-
示例 :
bash# 两种写法效果相同 nmcli con add type vlan dev=eth0 ... nmcli con add type vlan vlan.parent=eth0 ...
2. VLAN ID 参数(等价)
-
vlan.id
和id
完全等效 -
作用:定义 802.1Q VLAN 标签值
-
必需:是
-
范围:1-4094
-
示例 :
bash# 两种写法效果相同 nmcli con add type vlan vlan.id=100 ... nmcli con add type vlan id=100 ... # 不推荐,易混淆
注意 :虽然
id
可用,但官方推荐始终使用vlan.id
以保持明确性
3. VLAN 接口名参数
-
ifname
(无等效参数) -
作用:定义新建的 VLAN 虚拟接口名称
-
必需:否(不指定时自动生成)
-
默认命名规则 :
<父接口>.<VLAN ID>
-
示例 :
bash# 显式命名 nmcli con add type vlan ifname=mgmt_net ... # 自动命名 (如 dev=eth0 + vlan.id=100 → eth0.100) nmcli con add type vlan ...
参数使用优先级
当同时指定多个等效参数时:
示例冲突处理:
bash
# 以下命令:
nmcli con add type vlan dev=eth0 vlan.parent=bond0 vlan.id=100 id=200
# 实际结果:
# parent = bond0 (最后出现的父接口参数)
# vlan.id = 200 (最后出现的 VLAN ID 参数)
完整命令示例
最佳实践(推荐写法)
bash
nmcli connection add \
type vlan \
con-name "VLAN-Engineering" \
ifname eng_vlan \ # 自定义接口名
vlan.parent eth1 \ # 明确父接口
vlan.id 300 # 明确 VLAN ID
等效写法(不推荐)
bash
nmcli connection add \
type vlan \
con-name "VLAN-Sales" \
dev bond0 \ # 等效 vlan.parent
id 400 # 等效 vlan.id (易混淆)
查看配置验证
创建后检查配置:
bash
nmcli connection show "VLAN-Engineering" | egrep -i 'ifname|parent|id'
输出示例:
yaml
connection.interface-name: eng_vlan # ifname
vlan.parent: eth1 # dev/vlan.parent
vlan.id: 300 # vlan.id/id
常见错误与陷阱
-
参数混淆:
bash# 错误:误用 id 作为接口名 nmcli con add type vlan id=vlan100 # 应改为 ifname=vlan100
-
重复参数冲突:
bash# 危险:父接口冲突 nmcli con add type vlan dev=eth0 vlan.parent=eth1 ... # 最终使用 eth1 (最后指定的参数)
-
无效 VLAN ID:
bash# 错误:ID 超出范围 nmcli con add type vlan vlan.id=5000 # Error: vlan.id must be between 1-4094
-
缺少必需参数:
bash# 错误:缺少父接口 nmcli con add type vlan vlan.id=100 # Error: vlan.parent or dev is required
使用建议
-
始终明确参数:
- 使用
vlan.parent
代替dev
- 使用
vlan.id
代替id
- 显式指定
ifname
- 使用
-
复杂环境示例(VLAN over 绑定接口):
bashnmcli connection add \ type vlan \ con-name "VLAN-Over-Bond" \ ifname bond0.500 \ vlan.parent bond0 \ # 父接口是绑定接口 vlan.id 500
-
配置持久化: 所有配置自动保存到:
bash/etc/NetworkManager/system-connections/VLAN-Engineering.nmconnection
通过精确理解这些参数的关系和优先级,可以避免配置冲突,确保 VLAN 配置的准确性和可维护性。
在 nmcli con add type vlan
命令中,ifname
、dev
和 vlan.id
是三个关键参数,它们共同定义了 VLAN 连接的配置。以下是它们的详细解释和区别:
核心参数说明
参数 | 作用 | 是否必需 | 示例值 |
---|---|---|---|
dev |
指定父接口(承载 VLAN 的物理/逻辑设备) | 必需 | dev=eth0 |
vlan.id |
指定 VLAN ID(802.1Q 标签) | 必需 | vlan.id=100 |
ifname |
指定 VLAN 接口名称(新建的虚拟接口) | 可选 | ifname=vlan100 |
详细解析
1. dev
(父设备)
- 作用 :指定 VLAN 流量实际通过的底层物理或逻辑接口
- 必需性 :必须提供
- 特点 :
- 必须是系统中已存在的接口(如
eth0
,bond0
,br0
) - 承载所有带 VLAN 标签的流量
- 物理接口需支持 VLAN 功能
- 必须是系统中已存在的接口(如
- 示例 :
dev=eth0
表示在物理网卡 eth0 上创建 VLAN
2. vlan.id
(VLAN 标识符)
- 作用 :定义 802.1Q VLAN 标签值(数据帧中的 VLAN ID)
- 必需性 :必须提供
- 特点 :
- 取值范围:1-4094
- 决定数据帧的 VLAN 归属
- 不同 VLAN ID 在相同
dev
上创建隔离的网络
- 示例 :
vlan.id=100
表示创建标签为 100 的 VLAN
3. ifname
(接口名称)
- 作用 :指定新建的虚拟 VLAN 接口的名称
- 必需性 :可选(不指定时自动生成)
- 特点 :
- 默认命名规则:
<父接口>.<VLAN ID>
(如eth0.100
) - 可自定义(如
mgmt_network
) - 名称必须在系统中唯一
- 默认命名规则:
- 示例 :
ifname=servers_vlan
会创建名为servers_vlan
的接口
三者的关系
dev
确定流量从哪个物理/逻辑接口进出vlan.id
确定数据帧的 VLAN 标签ifname
确定操作系统中该 VLAN 的表示名称
完整命令示例
示例 1:最小化配置(自动命名)
bash
nmcli con add type vlan \
con-name "VLAN100" \
dev eth0 \ # 必需:父接口
vlan.id 100 # 必需:VLAN ID
结果接口名:eth0.100
示例 2:自定义接口名
bash
nmcli con add type vlan \
con-name "Servers-Network" \
ifname srv_net \ # 自定义接口名
dev bond0 \ # 在绑定接口上创建
vlan.id 200 # VLAN 标签
结果接口名:srv_net
示例 3:复杂场景(VLAN over Bridge)
bash
nmcli con add type vlan \
con-name "VM-VLAN" \
ifname vm_vlan300 \ # 自定义名称
dev br-vmhost \ # 父设备是网桥
vlan.id 300 # VLAN 标签
关键注意事项
-
dev
必须存在执行命令前,父接口需已激活(如
eth0
必须存在且 UP) -
vlan.id
冲突检测同一父接口上不能创建重复 VLAN ID
-
ifname
命名规则:- 避免使用特殊字符(只允许
a-z
,0-9
,-
,_
) - 不能与现有接口重名
- 建议命名包含 VLAN ID(如
vlan100
)
- 避免使用特殊字符(只允许
-
查看配置:
bash# 查看创建结果 nmcli con show "VLAN100" | egrep 'dev|ifname|vlan.id' # 输出示例 connection.interface-name: vlan100 # ifname ethernet.mac-address: -- vlan.parent: eth0 # dev vlan.id: 100 # vlan.id
常见错误场景
错误 | 原因 | 解决方案 |
---|---|---|
Error: 'dev' not specified |
缺少父接口参数 | 添加 dev=<接口名> |
Error: vlan.id is required |
缺少 VLAN ID | 添加 vlan.id=<1-4094> |
Error: interface name 'eth0' exists |
ifname 与现有接口冲突 |
更换自定义名称 |
Error: device 'eth99' not available |
dev 指定的父接口不存在 |
检查接口名是否正确 |
正确理解这三个参数的关系,是配置 VLAN 网络的基础。在实际应用中:
- 数据中心网络:常用
dev=bond0
(聚合链路) - 虚拟化环境:常用
dev=br0
(网桥) - 管理网络:推荐自定义
ifname
(如mgmt_vlan
)
nmcli con add type vlan
参数深度解析:ifname
, dev
, vlan.parent
, id
, vlan.id
在创建 VLAN 连接时,这些参数相互关联但作用不同,理解它们的区别和关系对于正确配置 VLAN 至关重要:
参数关系图谱
参数详解
1. ifname
(接口名称)
-
作用: 指定 VLAN 接口在操作系统中的名称
-
配置文件位置 :
[connection]
部分的interface-name
-
特点 :
- 可选参数,不指定时自动生成
vlan<ID>
(如vlan100
) - 仅影响接口名称,不影响 VLAN 功能
- 必须唯一,不能与其他接口冲突
- 可选参数,不指定时自动生成
-
示例 :
bashifname mgmt-vlan # 自定义接口名
2. dev
(父设备 - 简写)
-
作用 : 指定 VLAN 的父接口的简写形式
-
等效参数 :
vlan.parent
-
特点 :
- 与
vlan.parent
功能完全相同 - 更简洁的命令行写法
- 与
-
示例 :
bashdev enp3s0 # 等价于 vlan.parent enp3s0
3. vlan.parent
(父设备 - 完整)
-
作用: 明确指定 VLAN 的父接口
-
配置文件位置 :
[vlan]
部分的parent
-
要求 : 必须参数
-
特点 :
- 必须是已存在的物理或逻辑接口
- 支持的类型: 物理网卡、bond、bridge、其他 VLAN
-
示例 :
bashvlan.parent bond0 # 基于绑定接口
4. id
(VLAN ID - 简写)
-
作用 : 指定 VLAN ID 的简写形式
-
等效参数 :
vlan.id
-
特点 :
- 与
vlan.id
功能完全相同 - 更简洁的命令行写法
- 与
-
示例 :
bashid 100 # 等价于 vlan.id 100
5. vlan.id
(VLAN ID - 完整)
-
作用: 明确指定 802.1Q VLAN 标签号
-
配置文件位置 :
[vlan]
部分的id
-
要求 : 必须参数
-
特点 :
- 取值范围: 1-4094
- 同一父接口上必须唯一
- 必须与网络设备配置匹配
-
示例 :
bashvlan.id 200 # 设置 VLAN ID 为 200
参数等价关系
简写参数 | 完整参数 | 配置文件位置 | 是否必需 |
---|---|---|---|
dev |
vlan.parent |
[vlan] parent= |
是 |
id |
vlan.id |
[vlan] id= |
是 |
ifname |
- | [connection] interface-name= |
否 |
典型用法示例
1. 完整参数写法
bash
sudo nmcli con add type vlan \
con-name vlan100 \
ifname vlan-mgmt \
vlan.parent enp3s0 \
vlan.id 100
2. 简写参数写法 (推荐)
bash
sudo nmcli con add type vlan \
con-name vlan100 \
ifname vlan-mgmt \
dev enp3s0 \ # 简写等价于 vlan.parent
id 100 # 简写等价于 vlan.id
3. 最小化配置 (使用自动命名)
bash
sudo nmcli con add type vlan \
con-name vlan100 \
dev enp3s0 \
id 100
# 自动创建接口 vlan100
配置文件解析
生成的配置文件 /etc/NetworkManager/system-connections/vlan100.nmconnection
:
ini
[connection]
id=vlan100
type=vlan
interface-name=vlan-mgmt # ifname 的值
[vlan]
id=100 # id/vlan.id 的值
parent=enp3s0 # dev/vlan.parent 的值
参数使用规则
-
互斥关系:
dev
和vlan.parent
不能同时使用 (二选一)id
和vlan.id
不能同时使用 (二选一)
-
依赖关系:
ifname
依赖id/vlan.id
的默认命名机制- 所有参数都依赖父接口 (
dev/vlan.parent
) 存在
-
优先级:
graph TB A[命令行参数] --> B{参数冲突?} B -->|是| C[使用显式参数] B -->|否| D[使用任意形式] C --> E[优先完整参数 vlan.parent/vlan.id]
高级用法
1. 动态父接口 (按 MAC 地址)
bash
sudo nmcli con add type vlan \
ifname dyn-vlan \
dev 00:11:22:33:44:55 \ # 父接口MAC地址
id 300
2. 嵌套 VLAN (QinQ)
bash
# 第一层 VLAN
sudo nmcli con add type vlan \
ifname qinq-base \
dev enp3s0 \
id 100
# 第二层 VLAN
sudo nmcli con add type vlan \
ifname qinq-inner \
dev qinq-base \ # 基于第一层VLAN
id 200
3. VLAN 标志配置
bash
sudo nmcli con add type vlan \
dev enp3s0 \
id 100 \
vlan.flags 1 # 启用REORDER_HDR
常见错误处理
错误 1: 参数冲突
bash
# 错误:同时使用 dev 和 vlan.parent
sudo nmcli con add type vlan dev enp3s0 vlan.parent bond0 id 100
# 错误信息:
# Error: vlan.parent: property can't be set at the same time as 'dev'
解决 :选择一种形式(推荐简写 dev
)
错误 2: 缺少必需参数
bash
# 错误:缺少父接口
sudo nmcli con add type vlan ifname vlan100 id 100
# 错误信息:
# Error: vlan.parent: property is missing
解决 :添加 dev
或 vlan.parent
错误 3: VLAN ID 冲突
bash
# 错误:同一父接口重复 ID
sudo nmcli con add type vlan dev enp3s0 id 100 # 已存在
# 错误信息:
# Error: Connection activation failed: Device vlan100 not available
解决:使用不同的 VLAN ID 或删除现有配置
最佳实践
-
命名规范:
bash# 连接名: <位置>-vlan<ID> con-name server1-vlan100 # 接口名: <功能>-vlan ifname mgmt-vlan
-
配置优先级:
bash# 推荐简写形式 nmcli con add type vlan dev enp3s0 id 100 # 需要明确时使用完整形式 nmcli con add type vlan vlan.parent bond0 vlan.id 200
-
验证命令:
bash# 检查参数对应关系 nmcli -g connection.interface-name,vlan.parent,vlan.id con show vlan100
-
批量操作脚本:
bash#!/bin/bash PARENT_IF="bond0" BASE_VLAN=100 COUNT=10 for i in $(seq 1 $COUNT); do VLAN_ID=$((BASE_VLAN + i)) nmcli con add type vlan \ con-name vlan-$VLAN_ID \ ifname vlan$VLAN_ID \ dev $PARENT_IF \ id $VLAN_ID done
总结表
参数类型 | 命令行简写 | 命令行完整 | 配置文件位置 | 必需 |
---|---|---|---|---|
接口名称 | ifname |
- | [connection] interface-name |
否 |
父设备 | dev |
vlan.parent |
[vlan] parent |
是 |
VLAN ID | id |
vlan.id |
[vlan] id |
是 |
黄金法则:
- 父接口 (
dev
/vlan.parent
) 和 VLAN ID (id
/vlan.id
) 是必需参数 dev
是vlan.parent
的简写,功能相同id
是vlan.id
的简写,功能相同ifname
是可选参数,用于自定义接口名称
通过合理组合这些参数,您可以精确控制 VLAN 的创建方式,满足从简单网络隔离到复杂云计算环境的各种需求。
nmcli con add type vlan
参数深度解析:ifname
、dev
、id
在创建 VLAN 连接时,ifname
、dev
和 id
是三个核心参数,它们共同定义了 VLAN 接口的关键属性。以下是详细解析:
参数关系图
1. dev
(父设备)
-
作用 :指定 VLAN 流量承载的底层物理或逻辑接口
-
特点 :
- 必须是已存在的网络接口
- 可以是:物理网卡、绑定接口、网桥等
- 决定 VLAN 流量的物理路径
-
示例 :
bashdev eth0 # 基于物理网卡 dev bond0 # 基于绑定接口 dev br0 # 基于网桥接口
-
验证存在 :
baship link show eth0 # 确认接口存在
2. id
(VLAN ID)
-
作用 :定义 802.1Q VLAN 标签的数值标识
-
特点 :
- 必需参数,范围 1-4094
- 决定数据包的 VLAN 标签值
- 同一父接口上 ID 必须唯一
-
示例 :
bashid 100 # 标准VLAN id 2000 # 扩展VLAN
-
特殊值 :
id 0
:优先级标记(非标准VLAN)id 4095
:保留值(禁止使用)
3. ifname
(接口名称)
-
作用 :指定创建的 VLAN 虚拟接口名称
-
特点 :
- 将在系统中创建的设备名称
- 推荐命名:
<父接口>.<vlan_id>
- 必须全局唯一
-
示例 :
bashifname eth0.100 # 传统命名 ifname vlan100 # 描述性命名 ifname mgmt_vlan # 功能命名
-
命名规则 :
- 长度 ≤ 15 字符
- 允许:字母、数字、下划线、点号
- 禁止:空格、特殊字符
三参数协同工作原理
创建过程
- 系统检查
dev
指定的父接口是否存在 - 验证
id
在有效范围且未被占用 - 创建名为
ifname
的新网络接口 - 将新接口与父接口和 VLAN ID 关联
数据流路径
完整命令示例
基础配置
bash
nmcli con add type vlan \
con-name "VLAN100" \ # 连接名称(管理用)
ifname eth0.100 \ # 创建的接口名
dev eth0 \ # 基于物理接口
id 100 \ # VLAN ID
ipv4.method manual \
ipv4.addresses 192.168.100.2/24
高级配置
bash
# 在绑定接口上创建VLAN
nmcli con add type vlan \
ifname bond0.200 \ # 接口名
dev bond0 \ # 基于绑定
id 200 \ # VLAN ID
vlan.flags reorder_hdr # 启用包头重排
# 在网桥上创建VLAN
nmcli con add type vlan \
ifname br0.300 \ # 接口名
dev br0 \ # 基于网桥
id 300 \ # VLAN ID
ipv6.method auto # 启用IPv6自动配置
常见错误及解决方案
错误现象 | 原因 | 解决方案 |
---|---|---|
Error: invalid device |
dev 指定接口不存在 |
用 ip link 确认接口可用 |
Error: vlan id is invalid |
id 超出 1-4094 范围 |
使用有效 VLAN ID |
Error: connection exists |
ifname 或 con-name 重复 |
使用唯一名称 |
VLAN 流量不通 | 交换机未配置 trunk 端口 | 确保交换机端口允许该 VLAN ID |
无法获取 IP | VLAN 接口未激活 | 执行 nmcli con up VLAN100 |
验证命令
bash
# 查看VLAN接口详情
ip -d link show eth0.100
# 输出关键字段:vlan protocol 802.1Q id 100
# 检查VLAN配置
cat /proc/net/vlan/eth0.100
# 查看NetworkManager连接
nmcli -p con show VLAN100
最佳实践
-
命名规范:
bash# 推荐格式 ifname <父接口短名>.<vlan_id> # 如 eth0.100 con-name vlan<id>-<用途> # 如 vlan100-mgmt
-
ID 规划原则:
- 1:默认 VLAN(通常保留)
- 2-100:基础设施 VLAN
- 101-500:用户 VLAN
- 501-1000:服务器 VLAN
- 1001-4094:特殊应用 VLAN
-
父接口选择:
bash# 高可用场景:基于绑定接口 dev bond0 # 虚拟化场景:基于网桥 dev br0 # 物理隔离场景:直连物理网卡 dev eth1
-
备份配置:
bash# 导出连接配置 nmcli con export VLAN100 > vlan100-backup.nmconnection # 恢复配置 nmcli con import type vlan file vlan100-backup.nmconnection
通过正确使用 ifname
、dev
和 id
这三个参数,您可以精确控制 VLAN 接口的创建和行为,构建出满足各种复杂网络需求的虚拟网络拓扑。
nmcli con add type vlan
中的 ifname
、dev
和 id
详解
在 nmcli con add type vlan
命令中,ifname
、dev
和 id
是三个关键参数,它们共同定义了 VLAN 接口的核心属性。以下是它们的详细解释和相互关系:
一、三参数对比表
参数 | 作用 | 是否必需 | 取值范围 | 配置层级 | 示例 |
---|---|---|---|---|---|
ifname |
定义 VLAN 接口在系统中的名称 | 必需 | 唯一字符串 | 操作系统接口层 | ifname vlan10 |
dev |
指定 VLAN 所基于的物理设备 | 必需 | 已存在的接口名 | 硬件依赖层 | dev eth0 |
id |
设置 VLAN 的 802.1Q 标签号 | 必需 | 1-4094 | 网络协议层 | id 20 |
二、参数详解
1. ifname
- VLAN 接口名称
-
功能:定义操作系统识别的 VLAN 接口名称
-
特点 :
- 在
/sys/class/net/
中创建对应的设备节点 - 用于所有网络操作命令(
ip addr
、ping
等) - 必须唯一,不能与现有接口冲突
- 在
-
示例 :
bashifname vlan-finance # 创建名为 "vlan-finance" 的接口
2. dev
- 父设备指定
-
功能:指定 VLAN 流量承载的底层设备
-
特点 :
- 可以是物理网卡(如
eth0
)或虚拟接口(如bond0
) - 设备必须已存在且可用
- 确定数据包的物理出口
- 可以是物理网卡(如
-
示例 :
bashdev enp3s0 # 基于物理网卡 enp3s0
3. id
- VLAN 标识符
-
功能:设置 802.1Q VLAN 标签号
-
特点 :
- 范围 1-4094(0 和 4095 为保留值)
- 同一父设备上必须唯一
- 决定数据包在交换机上的 VLAN 归属
-
示例 :
bashid 30 # 设置 VLAN ID 为 30
三、三参数协同工作示例
基本配置
bash
sudo nmcli con add type vlan \
con-name "vlan-accounting" \ # 连接名称(逻辑标识)
ifname vlan-acct \ # VLAN 接口名称
dev eth0 \ # 基于物理网卡 eth0
id 40 # VLAN ID
验证配置关系
bash
# 查看 VLAN 接口详情
ip -d link show vlan-acct
# 输出示例:
# 10: vlan-acct@eth0: <BROADCAST,MULTICAST> ...
# vlan protocol 802.1Q id 40 <REORDER_HDR>
# link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
四、参数关系图
五、高级配置场景
1. 在绑定接口上创建 VLAN
bash
# 先创建绑定
sudo nmcli con add type bond con-name bond0 ifname bond0 bond.options "mode=802.3ad"
# 在绑定上创建 VLAN
sudo nmcli con add type vlan \
ifname vlan-bond \ # VLAN 接口名
dev bond0 \ # 父设备是绑定接口
id 50 # VLAN ID
2. 多 VLAN 配置
bash
# 在同一个物理接口上创建多个 VLAN
for vlan_id in {10,20,30}; do
sudo nmcli con add type vlan \
ifname vlan${vlan_id} \
dev eth0 \
id ${vlan_id}
done
3. 自定义命名方案
bash
# 按部门+ID命名 VLAN 接口
sudo nmcli con add type vlan \
ifname finance-v50 \ # 自定义接口名
dev eth0 \
id 50
六、常见错误及解决
错误 1:缺少必需参数
bash
sudo nmcli con add type vlan ifname vlan30
# Error: VLAN connection needs 'dev' and 'id' properties
解决 :必须同时提供 ifname
、dev
和 id
错误 2:VLAN ID 冲突
bash
sudo nmcli con add type vlan ifname vlanA dev eth0 id 40
# Error: VLAN connection 'vlanA' is invalid: VLAN id 40 already in use
解决:同一父设备上使用不同的 VLAN ID
错误 3:接口名冲突
bash
sudo nmcli con add type vlan ifname eth0 dev eth1 id 60
# Error: interface name 'eth0' already in use
解决:使用唯一的接口名
七、三参数管理技巧
1. 查看参数关系
bash
nmcli -p -f general,device,vlan con show vlan-acct
# 输出:
# ========================================
# Connection profile details (vlan-accounting)
# ========================================
# connection.interface: vlan-acct <-- ifname
# vlan.parent: eth0 <-- dev
# vlan.id: 40 <-- id
2. 修改参数
参数 | 能否修改 | 方法 |
---|---|---|
ifname |
可以 | nmcli con mod <name> ifname <new-name> |
dev |
不能 | 需删除后重建 |
id |
不能 | 需删除后重建 |
bash
# 修改 ifname
sudo nmcli con mod "vlan-accounting" ifname acct-vlan40
# 修改 dev 或 id 需要重建
sudo nmcli con delete "vlan-accounting"
sudo nmcli con add ... dev eth1 id 45 # 使用新参数
八、实际应用场景
场景 1:服务器网络隔离
bash
# 管理 VLAN
sudo nmcli con add type vlan ifname mgmt dev eno1 id 100
# 数据 VLAN
sudo nmcli con add type vlan ifname data dev eno1 id 200
# 存储 VLAN
sudo nmcli con add type vlan ifname storage dev eno1 id 300
场景 2:云主机网络配置
bash
# 在虚拟网卡上创建租户 VLAN
sudo nmcli con add type vlan \
ifname tenant-vlan123 \
dev vnet0 \
id 123
场景 3:网络设备模拟
bash
# 创建多个模拟设备接口
for i in {1..5}; do
sudo nmcli con add type vlan \
ifname switch${i} \
dev eth0 \
id $((100+i))
done
九、最佳实践
-
命名规范:
bash# 统一命名方案 ifname <功能>-v<ID> # 如 finance-v50
-
ID 管理原则:
- 管理 VLAN:ID 100-199
- 用户 VLAN:ID 200-299
- 服务 VLAN:ID 300-399
-
配置顺序:
graph TB A[激活父设备] --> B[创建VLAN] B --> C[配置IP] -
备份与恢复:
bash# 导出配置 nmcli con export "vlan-accounting" > vlan-acct.nmconnection # 导入配置 nmcli con import vlan-acct.nmconnection
十、三参数总结
参数 | 类比 | 关键作用 |
---|---|---|
ifname |
姓名 | 接口在系统中的身份标识 |
dev |
父母 | VLAN 的物理/逻辑来源 |
id |
身份证号 | VLAN 在网络中的唯一标识 |
这三个参数共同定义了 VLAN 接口的完整身份:
dev
决定了 VLAN 从哪里来(物理基础)id
决定了 VLAN 是谁(网络标识)ifname
决定了 VLAN 如何被识别(系统名称)
正确理解和配置这三个参数,是成功创建和管理 VLAN 接口的关键。
nmcli con add type vlan
中 ifname
、dev
和 id
的深度解析
在创建 VLAN 连接时,ifname
、dev
和 id
是三个必需且相互关联的关键参数,它们共同定义了 VLAN 接口的特性和行为。下面从多个维度详细解析这三个参数的区别与协作关系:
一、核心功能对比
参数 | 作用 | 取值范围 | 配置位置 | 必需性 |
---|---|---|---|---|
ifname |
定义 VLAN 接口的系统名称 | 唯一字符串 (如 vlan10 ) |
系统网络接口 | 必需 |
dev |
指定 VLAN 的底层父设备 | 已存在接口名 (如 eth0 ) |
配置文件 | 必需 |
id |
设置 VLAN 标识号 | 1-4094 | 802.1Q 帧头 | 必需 |
二、参数详解与技术实现
1. ifname
- 接口名称
-
功能 :定义新创建的 VLAN 虚拟接口在系统中的名称
-
技术实现 :
- 在
/sys/class/net/
下创建对应目录 - 通过
ip link
命令可见
- 在
-
约束 :
- 必须是系统中唯一的名称
- 建议格式:
vlan<ID>
(如vlan10
)
-
示例 :
bashifname office-vlan # 创建名为 "office-vlan" 的接口
2. dev
- 父设备
-
功能 :指定 VLAN 流量承载的底层设备
-
技术实现 :
- 在配置文件中存储为
vlan.parent
属性 - 内核通过此设备发送/接收 VLAN 标记帧
- 在配置文件中存储为
-
支持类型 :
- 物理网卡 (如
eth0
) - 绑定接口 (如
bond0
) - 团队接口 (如
team0
)
- 物理网卡 (如
-
示例 :
bashdev bond0 # 使用绑定接口作为父设备
3. id
- VLAN ID
-
功能 :定义 802.1Q VLAN 标记值
-
技术实现 :
- 在数据链路层添加 VLAN 标签 (4字节)
- 格式:
0x8100
(TPID) +PCP
(3位) +DEI
(1位) + VID (12位)
-
网络要求 :
- 交换机端口必须配置为 Trunk 模式
- 必须允许该 VLAN ID 通过
-
示例 :
bashid 100 # 使用 VLAN ID 100
三、参数间协同关系
1. 创建流程
ifname=vlan10 dev=eth0 id=10 NM->>Kernel: 创建 vlan10 接口 (ifname) Kernel->>NM: 确认接口创建 NM->>Kernel: 绑定到 eth0 (dev) Kernel->>NM: 确认父设备 NM->>Kernel: 设置 VLAN ID=10 (id) Kernel->>NM: 配置生效 NM->>Admin: 返回成功
2. 数据包处理流程
ini
[发往 VLAN10 的数据包]
1. 应用层 -> vlan10 接口 (ifname)
2. 内核添加 VLAN 标签 (id=10)
3. 通过 eth0 (dev) 发送到物理网络
4. 交换机读取 VLAN ID (id=10)
5. 转发到相同 VLAN 的端口
3. 配置文件示例
ini
# /etc/NetworkManager/system-connections/vlan10.nmconnection
[connection]
id=vlan10
type=vlan
interface-name=vlan10 # ifname 的值
[vlan]
parent=eth0 # dev 的值
id=10 # id 的值
四、完整命令示例
基础配置
bash
sudo nmcli con add type vlan \
con-name "vlan10-office" \ # 连接名称
ifname vlan10 \ # 接口名称
dev eth0 \ # 父设备
id 10 # VLAN ID
高级配置
bash
# 基于绑定接口创建 VLAN
sudo nmcli con add type vlan \
ifname server-vlan \
dev bond0 \ # 使用绑定接口
id 100 \
vlan.flags 1 \ # 启用 reorder_hdr
mtu 9000 # 设置巨帧
五、验证命令
1. 验证 ifname
bash
ip -d link show vlan10
# 输出片段:
10: vlan10@eth0: <BROADCAST,MULTICAST> mtu 1500 ...
vlan protocol 802.1Q id 10 <REORDER_HDR>
2. 验证 dev
bash
cat /proc/net/vlan/vlan10
# 输出:
VLAN Dev name | vlan10
Parent device | eth0 # dev 的值
3. 验证 id
bash
sudo tcpdump -i eth0 -e -nn vlan
# 输出:
00:11:22:33:44:55 > 00:aa:bb:cc:dd:ee, ethertype 802.1Q (0x8100), vlan 10, # id=10
六、常见错误场景
错误1:ifname
冲突
bash
Error: Device 'vlan10' already exists
解决方案:
bash
# 1. 检查现有接口
ip link show
# 2. 使用新名称
sudo nmcli ... ifname vlan-office
错误2:无效 dev
bash
Error: invalid device 'eth99' specified
解决方案:
bash
# 1. 查看可用设备
nmcli dev status
# 2. 使用正确设备名
sudo nmcli ... dev eth0
错误3:非法 id
bash
Error: invalid vlan id '5000'
解决方案:
bash
# 使用有效 VLAN ID (1-4094)
sudo nmcli ... id 100
错误4:父设备不支持 VLAN
bash
# 无线网卡常见错误
Error: Failed to set VLAN flags on device 'wlan0'
解决方案:
bash
# 1. 使用有线网卡
sudo nmcli ... dev eth0
# 2. 或使用 macvlan 替代方案
sudo ip link add macvlan0 link wlan0 type macvlan mode bridge
七、高级应用场景
场景1:同一父设备多 VLAN
bash
# VLAN 10
sudo nmcli con add type vlan ifname vlan10 dev eth0 id 10
# VLAN 20
sudo nmcli con add type vlan ifname vlan20 dev eth0 id 20 # 相同 dev
场景2:QinQ 嵌套 VLAN
bash
# 第一层 VLAN
sudo nmcli con add type vlan ifname qinq_base dev eth0 id 100
# 第二层 VLAN
sudo nmcli con add type vlan ifname customer1 dev qinq_base id 200
场景3:高可用 VLAN
bash
# 创建绑定
sudo nmcli con add type bond ifname bond0 mode active-backup
# 添加从属接口
sudo nmcli con add type bond-slave ifname eth0 master bond0
sudo nmcli con add type bond-slave ifname eth1 master bond0
# 创建 VLAN
sudo nmcli con add type vlan ifname vlan-ha dev bond0 id 50
八、最佳实践
-
命名规范:
bash# 格式:类型-用途-ID ifname vlan-office-10 con-name vlan-office-connection
-
ID 管理原则:
- 服务器访问 VLAN:100-199
- 用户网络 VLAN:200-299
- 管理网络 VLAN:400-499
-
冗余设计:
bash# 使用绑定接口作为父设备 dev bond0 # 替代单个 eth0
-
配置文档化:
bash# 添加描述信息 sudo nmcli con mod vlan10 \ +connection.interface-name "Office VLAN" \ +connection.permissions "admin"
-
批量创建脚本:
bash#!/bin/bash for vid in {10,20,30}; do sudo nmcli con add type vlan \ ifname vlan$vid \ dev bond0 \ id $vid done
九、总结
-
ifname
= "我是谁"(定义新 VLAN 接口在系统中的身份)
-
dev
= "我的根基"(指定 VLAN 依赖的物理/逻辑父设备)
-
id
= "我的标签"(设置 VLAN 在数据帧中的标识符)
这三个参数共同构成了 VLAN 连接的黄金三角:
- 缺少任何一个都会导致配置失败
- 三者必须逻辑一致
- 共同决定了 VLAN 在系统和网络中的行为
正确理解和使用这些参数,可以高效构建灵活、可靠的 VLAN 网络架构。
nmcli con add type vlan
中的 ifname
、dev
和 id
详解
这三个参数在创建 VLAN 连接时各司其职,共同定义了 VLAN 接口的关键特性。下面我将详细解析它们的区别、作用和最佳实践。
核心参数对比表
参数 | 作用 | 是否必需 | 取值范围 | 默认行为 | 示例 |
---|---|---|---|---|---|
dev |
指定父接口(物理或逻辑设备) | 必需 | 已存在的接口名称 | 无默认值 | dev eth0 |
id |
指定 VLAN ID | 必需 | 1-4094 | 无默认值 | vlan.id 100 |
ifname |
指定 VLAN 接口名称 | 可选 | 唯一接口名 | 自动生成 dev.id 格式 |
ifname vlan100 |
深度解析
1. dev
- 父接口指定
-
作用:定义 VLAN 的物理承载接口
-
技术原理 :
- 在 Linux 内核中创建
vlan
子设备 - 对应内核数据结构
struct net_device
的real_dev
字段
- 在 Linux 内核中创建
-
使用要点 :
- 必须是已存在 的物理或逻辑接口(如
eth0
,bond0
) - 接口类型可以是:
- 物理以太网接口
- 绑定接口(bond)
- 团队接口(team)
- 不能是另一个 VLAN 接口(除非使用 QinQ)
- 必须是已存在 的物理或逻辑接口(如
-
验证命令 :
baship -d link show vlan100 | grep 'link/ether' # 输出:link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
2. id
- VLAN 标识符
-
作用:定义 VLAN 的逻辑分段标识
-
技术原理 :
- 对应 802.1Q 帧中的 12 位 VLAN 标识字段
- 在内核中通过
vlan_dev_set_vlan_id()
函数设置
-
使用要点 :
- 必须与交换机配置匹配(Access 或 Trunk 模式)
- 特殊值:
- ID 0:优先级标记帧(不用于常规通信)
- ID 1:通常为默认 VLAN
- ID 4095:保留值(不可用)
-
验证命令 :
baship -d link show eth0.100 | grep 'vlan id' # 输出:vlan protocol 802.1Q id 100 <REORDER_HDR>
3. ifname
- 接口命名
- 作用:定义操作系统中 VLAN 接口的名称
- 技术原理 :
- 在
/sys/class/net/
下创建对应目录 - 影响
ip link
和ifconfig
的输出
- 在
- 使用要点 :
-
命名规范建议:
命名风格 示例 适用场景 传统风格 eth0.100
简单网络 功能描述风格 mgmt_vlan
企业网络(推荐) 位置描述风格 floor2_vlan200
大型基础设施 -
系统限制:
- 最大长度:15 个字符(Linux 接口名限制)
- 允许字符:字母、数字、下划线(
_
)、短横线(-
) - 禁止字符:空格、点(除非在传统格式中使用)
-
配置示例与效果
示例 1:最小化配置
bash
nmcli con add type vlan \
dev eth0 \
id 100
效果:
- 自动创建接口
eth0.100
- 连接名称自动设为
vlan-eth0-100
- 无 IP 配置
示例 2:完整配置
bash
nmcli con add type vlan \
con-name "Server-Mgmt" \
ifname mgmt_vlan \
dev bond0 \
id 200 \
ipv4.method manual \
ipv4.addresses 10.20.0.5/24 \
ipv4.gateway 10.20.0.1
效果:
- 创建逻辑接口
mgmt_vlan
- 基于绑定接口
bond0
- VLAN ID 200
- 静态 IP 配置
- 连接名称:
Server-Mgmt
示例 3:带高级参数的配置
bash
nmcli con add type vlan \
ifname storage_vlan \
dev eno1 \
id 300 \
vlan.flags reorder_hdr \
ethernet.mtu 9000 \
ipv6.method dhcp \
connection.autoconnect yes
参数间关系图解
最佳实践指南
1. 企业网络推荐配置
bash
# 使用绑定接口作为父设备
nmcli con add type bond con-name TrunkBond ifname bond0 bond.options mode=802.3ad
# 创建带描述的 VLAN
nmcli con add type vlan \
con-name "VLAN100-Management" \
ifname mgmt_vlan \
dev bond0 \
id 100 \
ipv4.addresses 192.168.100.10/24
2. 配置优先级规则
-
先创建父接口 :确保
dev
指定的接口存在 -
必填参数 :
dev
和id
必须提供 -
命名规范 :
- 生产环境:使用
ifname
自定义描述性名称 - 开发环境:可使用默认命名
- 生产环境:使用
-
IP 配置 :
graph LR A[物理接口] -->|无IP| B[VLAN接口] B -->|配置IP| C[网络通信]
3. 验证命令组合
bash
# 检查 VLAN 配置
ip -d link show mgmt_vlan | grep 'vlan id'
# 查看父接口关联
bridge vlan show dev bond0
# 检查流量统计
ethtool -S bond0 | grep vlan
故障排除
常见错误 1:VLAN 流量不通
现象 :Ping 不通网关
诊断步骤:
bash
# 1. 检查 VLAN ID 是否匹配
ip -d link show mgmt_vlan | grep 'id'
# 2. 验证父接口状态
ethtool bond0 | grep 'Link detected'
# 3. 检查交换机配置
# 确保交换机端口配置为 trunk 模式
# 确认允许的 VLAN 列表包含该 ID
常见错误 2:接口创建失败
现象 :Error: Interface name 'eth0.100' already exists
解决方案:
bash
# 1. 查看冲突接口
ip link show eth0.100
# 2. 删除旧连接
nmcli con delete "vlan-eth0-100"
# 3. 或使用自定义名称
nmcli con add type vlan ifname new_vlan100 dev eth0 id 100
常见错误 3:VLAN 无法激活
现象 :Connection activation failed: Device not found
解决方案:
bash
# 1. 确认父接口存在
ip link show dev eth0
# 2. 检查内核模块
lsmod | grep 8021q
# 3. 加载 VLAN 模块
modprobe 8021q
高级用法
1. QinQ 配置(双标签 VLAN)
bash
# 首先创建外层 VLAN
nmcli con add type vlan \
con-name "QinQ-Outer" \
ifname qinq_outer \
dev eth0 \
id 1000
# 在内层 VLAN 上创建第二层标签
nmcli con add type vlan \
con-name "QinQ-Inner" \
ifname qinq_inner \
dev qinq_outer \
id 200
2. VLAN 过滤配置
bash
# 在网桥中启用 VLAN 过滤
nmcli con modify br0 bridge.vlan-filtering yes
# 配置 VLAN 成员关系
nmcli con modify br0-port1 bridge-port.vlans "100,200-300"
3. 批量创建脚本
bash
#!/bin/bash
# 批量创建 VLAN 接口
for vlan_id in {100..110}; do
nmcli con add type vlan \
con-name "VLAN-$vlan_id" \
ifname "vlan$vlan_id" \
dev bond0 \
id $vlan_id
done
技术原理补充
Linux VLAN 实现架构
配置文件解析
生成的连接文件 (/etc/NetworkManager/system-connections/VLAN100.nmconnection
):
ini
[connection]
id=VLAN100
type=vlan
interface-name=vlan100 # ifname 指定
[vlan]
id=100 # vlan.id 指定
parent=eth0 # dev 指定
总结要点
-
dev
是基础:- 指向承载 VLAN 的实际物理/逻辑接口
- 必须先行存在且已激活
- 对应网络架构中的物理层
-
id
是核心:- 定义 VLAN 的逻辑分段
- 必须在 1-4094 范围内
- 必须与网络设备配置匹配
- 对应 OSI 模型的数据链路层
-
ifname
是标识:- 提供用户友好的接口标识
- 支持自定义管理策略
- 影响系统工具中的显示
- 对应操作系统的接口管理层
黄金法则:在关键系统中始终显式指定所有三个参数,以确保配置的可读性和可维护性:
bashnmcli con add type vlan \ con-name "描述性名称" \ ifname 唯一接口名 \ dev 父接口 \ id VLAN_ID
在 Linux 的 NetworkManager 中,使用 nmcli con add type vlan
创建 VLAN 接口时,ifname
、dev
、vlan.parent
、id
、vlan.id
是关键参数,它们的区别如下:
1. dev
和 vlan.parent
-
作用 :指定 VLAN 的父接口 (物理接口或逻辑接口,如
eth0
、bond0
)。 -
区别 :
dev
:在创建 VLAN 连接时直接指定父接口(命令行参数)。vlan.parent
:用于修改现有 VLAN 连接的父接口(配置属性)。
-
示例 :
bash# 创建 VLAN 连接时指定父接口(使用 dev) nmcli con add type vlan con-name "vlan100" ifname "vlan100" dev eth0 id 100 # 修改现有 VLAN 连接的父接口(使用 vlan.parent) nmcli con mod "vlan100" vlan.parent bond0
2. id
和 vlan.id
-
作用 :指定 VLAN 的标识号(VLAN ID),范围
1-4094
。 -
区别 :
id
:在创建 VLAN 连接时直接指定 VLAN ID(命令行参数)。vlan.id
:用于修改现有 VLAN 连接的 VLAN ID(配置属性)。
-
示例 :
bash# 创建 VLAN 连接时指定 VLAN ID(使用 id) nmcli con add type vlan ... id 100 # 修改现有 VLAN 连接的 VLAN ID(使用 vlan.id) nmcli con mod "vlan100" vlan.id 200
3. ifname
-
作用 :自定义 VLAN 接口的名称(如
eth0.100
或vlan100
)。 -
说明 :
- 若不指定
ifname
,系统会自动生成名称(格式为父接口.VLANID
,如eth0.100
)。 - 若指定
ifname
,需确保名称唯一且符合规范。
- 若不指定
-
示例 :
bash# 自定义接口名称为 vlan100 nmcli con add type vlan ... ifname "vlan100"
完整命令示例
bash
# 创建 VLAN 连接(静态 IP 配置)
nmcli con add type vlan \
con-name "vlan100" \ # 连接名称(自定义)
ifname "vlan100" \ # 接口名称(可选)
dev eth0 \ # 父接口(物理网卡)
id 100 \ # VLAN ID(必须)
ipv4.method manual \ # 静态 IP
ipv4.addresses 192.168.100.10/24 \
ipv4.gateway 192.168.100.1
关键区别总结
参数 | 作用 | 适用场景 |
---|---|---|
dev |
创建时指定父接口 | 创建连接时 |
vlan.parent |
修改父接口 | 修改连接时 |
id |
创建时指定 VLAN ID | 创建连接时 |
vlan.id |
修改 VLAN ID | 修改连接时 |
ifname |
自定义接口名称 | 创建连接时 |
常见错误
- 遗漏必要参数 :未指定
dev
或id
会导致命令失败。 - 混淆参数阶段 :在创建连接时误用
vlan.parent
或vlan.id
(这些参数用于修改连接)。 - 名称冲突 :若
ifname
与现有接口重复,需先删除旧配置。
建议通过 nmcli con add type vlan --help
查看最新参数说明。
在 Linux 的 nmcli
工具中,nmcli con add type vlan
命令用于创建 VLAN 接口。以下是命令中关键参数的详细解析:
1. 参数详解
1.1 ifname
-
作用:指定新创建的 VLAN 接口的名称。
-
格式 :通常为
主设备名.VLAN_ID
,例如eth0.100
。 -
示例 :
bashnmcli con add type vlan con-name vlan100 ifname eth0.100 dev eth0 vlan-id 100
ifname=eth0.100
:表示创建的 VLAN 接口名称为eth0.100
。
1.2 dev
/ vlan.parent
-
作用:指定 VLAN 接口所依赖的主设备(物理或逻辑接口)。
-
格式 :直接指定主设备的名称,例如
eth0
、bond0
等。 -
示例 :
bashnmcli con add type vlan con-name vlan100 ifname eth0.100 dev eth0 vlan-id 100
dev=eth0
:表示 VLAN 接口eth0.100
是基于主设备eth0
创建的。
-
注意 :
-
dev
和vlan.parent
是等价的,可以互换使用。 -
必须确保
ifname
和dev
对应,例如:bashifname=eth0.100 与 dev=eth0
-
1.3 vlan.id
/ id
-
作用:指定 VLAN 的 ID(VLAN 标签值)。
-
格式 :整数,范围
0-4094
。 -
示例 :
bashnmcli con add type vlan con-name vlan100 ifname eth0.100 dev eth0 vlan-id 100
vlan-id=100
:表示 VLAN ID 为100
。
-
注意 :
vlan.id
和id
是等价的,可以互换使用。- VLAN ID 不能为
0
或4095
,因为这些值被保留。
2. 参数关系总结
参数 | 作用 | 示例值 | 说明 |
---|---|---|---|
ifname |
VLAN 接口名称 | eth0.100 |
必须符合 主设备名.VLAN_ID 格式 |
dev /vlan.parent |
VLAN 接口依赖的主设备名称 | eth0 |
可以是物理网卡或逻辑接口(如 bond0) |
vlan.id /id |
VLAN ID(标签值) | 100 |
范围 0-4094 |
3. 使用场景示例
3.1 创建基于物理网卡的 VLAN
bash
nmcli con add type vlan con-name vlan100 \
ifname eth0.100 dev eth0 vlan-id 100
- 主设备 :
eth0
(物理网卡)。 - VLAN 接口 :
eth0.100
(基于eth0
的 VLAN 100 子接口)。
3.2 创建基于绑定(Bonding)的 VLAN
bash
nmcli con add type vlan con-name bond0-vlan100 \
ifname bond0.100 dev bond0 vlan-id 100
- 主设备 :
bond0
(绑定接口)。 - VLAN 接口 :
bond0.100
(基于bond0
的 VLAN 100 子接口)。
4. 常见错误及解决方法
4.1 错误:混淆 ifname
和 dev
-
错误示例 :
bashnmcli con add type vlan con-name vlan100 ifname bond0 vlan-id 100
-
问题 :
ifname
被错误地指定为主设备bond0
,缺少dev
参数。 -
解决 :明确区分
ifname
(子接口名)和dev
(主设备名):bashnmcli con add type vlan con-name vlan100 ifname bond0.100 dev bond0 vlan-id 100
-
4.2 错误:未指定 dev
参数
-
错误示例 :
bashnmcli con add type vlan con-name vlan100 ifname eth0.100 vlan-id 100
-
问题 :缺少
dev
参数,NetworkManager 无法确定 VLAN 的主设备。 -
解决 :添加
dev
参数:bashnmcli con add type vlan con-name vlan100 ifname eth0.100 dev eth0 vlan-id 100
-
5. 总结
-
ifname
是 VLAN 接口的名称(如eth0.100
),必须符合主设备名.VLAN_ID
的格式。 -
dev
/vlan.parent
是 VLAN 接口依赖的主设备(如eth0
或bond0
)。 -
vlan.id
/id
是 VLAN 的 ID(如100
),范围0-4094
。 -
正确配对 :确保
ifname
和dev
对应,例如:bashifname=eth0.100 与 dev=eth0 ifname=bond0.200 与 dev=bond0
通过正确使用这些参数,可以确保 VLAN 接口正确绑定到主设备,从而实现网络隔离和虚拟化需求。
在 nmcli con add type vlan
命令中,涉及 VLAN 配置的参数较多,容易混淆。以下是核心参数的详细解释和对比:
一、核心参数详解
1. ifname
:VLAN 接口的逻辑名称
-
作用:定义系统中 VLAN 接口的名称,用于配置和管理。
-
命名规则 :建议使用
物理设备名.VLANID
(如eth0.10
),但可自定义。 -
示例 :
bashnmcli con add type vlan ifname eth0.10 ...
创建名为
eth0.10
的 VLAN 接口。
2. dev
:VLAN 所基于的物理设备
-
作用:指定 VLAN 流量实际通过哪个物理网卡传输。
-
要求 :必须是系统中已存在的物理设备(如
eth0
,enp0s3
)。 -
示例 :
bashnmcli con add type vlan dev eth0 ...
表示该 VLAN 绑定到物理网卡
eth0
。
3. vlan.parent
:VLAN 的父接口
-
作用 :与
dev
类似,均指定承载 VLAN 的物理设备,但优先级低于dev
。 -
使用场景 :当
dev
未指定时,vlan.parent
生效。 -
示例 :
bashnmcli con add type vlan vlan.parent eth0 ...
效果等同于
dev eth0
,但建议优先使用dev
。
4. id
/ vlan.id
:VLAN ID
-
作用:定义 VLAN 的标签 ID(范围 1-4094),用于区分不同 VLAN。
-
两种写法 :
id
:简化写法,直接使用id 10
。vlan.id
:完整写法,显式指定 VLAN 命名空间。
-
示例 :
bashnmcli con add type vlan id 10 ... # 简化写法 nmcli con add type vlan vlan.id 10 ... # 完整写法
二、参数对比表
参数 | 含义 | 是否必需 | 优先级 | 示例值 |
---|---|---|---|---|
ifname |
VLAN 接口的逻辑名称 | 是 | - | eth0.10 , vlan10 |
dev |
VLAN 绑定的物理设备 | 是 | 高于 vlan.parent |
eth0 |
vlan.parent |
备选的物理设备(dev 不存在时生效) |
否 | 低于 dev |
eth0 |
id / vlan.id |
VLAN 的标签 ID | 是 | - | 10 , 200 |
三、正确用法示例
标准配置(推荐)
bash
nmcli con add type vlan \
con-name vlan10 \ # 连接名称
ifname eth0.10 \ # VLAN 接口名
dev eth0 \ # 物理设备
id 10 \ # VLAN ID
ipv4.addresses 192.168.10.10/24 \
ipv4.method manual
使用 vlan.parent
(不推荐,兼容性差)
bash
nmcli con add type vlan \
ifname eth0.10 \
vlan.parent eth0 \ # 等同于 dev eth0
vlan.id 10 \ # 完整写法
...
四、常见错误与注意事项
-
dev
和vlan.parent
同时存在:bash# 错误示例(不推荐) nmcli con add type vlan dev eth0 vlan.parent eth1 ...
结果 :
dev
优先级更高,vlan.parent
被忽略。 -
VLAN ID 超出范围:
bash# 错误:VLAN ID 范围为 1-4094 nmcli con add type vlan id 4095 ...
-
物理设备不存在:
bash# 错误:eth99 不存在 nmcli con add type vlan dev eth99 ...
-
接口名称冲突:
bash# 错误:eth0.10 已存在 nmcli con add type vlan ifname eth0.10 ...
解决 :先删除现有连接:
nmcli con delete eth0.10
五、验证配置
创建 VLAN 后,通过以下命令验证:
bash
# 查看接口列表
ip addr show
# 输出示例:
4: eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
inet 192.168.10.10/24 scope global eth0.10
# 查看 NetworkManager 连接配置
nmcli con show vlan10
六、总结
-
必选参数 :
ifname
,dev
,id
-
推荐写法 :
bashnmcli con add type vlan ifname eth0.10 dev eth0 id 10 ...
-
优先级 :
dev
>vlan.parent
,id
与vlan.id
等效 -
命名建议 :
ifname
使用物理设备名.VLANID
格式,便于管理
合理使用这些参数,可以灵活配置单网卡多 VLAN、跨网卡 VLAN 等复杂网络场景。
在 nmcli con add type vlan
中,以下是相关参数的含义和区别:
1. ifname
- 含义:指定 VLAN 接口的名称,即虚拟网络接口的名称。
- 示例 :
ifname eth0.10
表示创建一个名为eth0.10
的 VLAN 接口。
2. dev
- 含义:指定 VLAN 接口所依赖的物理网卡名称,即 VLAN 连接的父设备。
- 示例 :
dev eth0
表示该 VLAN 接口基于物理网卡eth0
创建。
3. vlan.parent
- 含义 :与
dev
功能相同,用于指定 VLAN 接口的父设备(物理网卡的名称)。 - 示例 :
vlan.parent eth0
同样表示 VLAN 接口基于物理网卡eth0
创建。
4. id
- 含义:指定 VLAN 的标识符(VLAN ID),用于区分不同的 VLAN。
- 示例 :
id 10
表示 VLAN ID 为 10。
5. vlan.id
- 含义 :与
id
功能相同,用于指定 VLAN 的 VLAN ID。 - 示例 :
vlan.id 10
同样表示 VLAN ID 为 10。
示例
以下是一些常见用法示例:
示例 1:使用 ifname
、dev
和 id
bash
nmcli con add type vlan con-name vlan10 ifname eth0.10 dev eth0 id 10
- 创建一个名为
vlan10
的 VLAN 连接。 - VLAN 接口名称为
eth0.10
。 - 父设备为物理网卡
eth0
。 - VLAN ID 为 10。
示例 2:使用 vlan.parent
和 vlan.id
bash
nmcli con add type vlan con-name vlan10 ifname eth0.10 vlan.parent eth0 vlan.id 10
- 创建一个名为
vlan10
的 VLAN 连接。 - VLAN 接口名称为
eth0.10
。 - 父设备为物理网卡
eth0
。 - VLAN ID 为 10。
总结
参数 | 功能 | 对应的等价参数 |
---|---|---|
ifname |
指定 VLAN 接口的名称 | 无 |
dev |
指定 VLAN 的父设备 | vlan.parent |
id |
指定 VLAN 的 VLAN ID | vlan.id |
在实际使用中,dev
和 vlan.parent
是等价的,id
和 vlan.id
是等价的,可以根据个人习惯选择使用。
nmcli con add type vlan
参数详解
在 Linux NetworkManager 中使用 nmcli
创建 VLAN 连接时,各参数作用如下:
1. ifname
(接口名称)
- 作用 :指定新创建的 VLAN 接口名称(如
vlan100
) - 特性 :
- 可选参数,不指定时自动生成名称(格式:
vlan.<父接口>.<VLAN ID>
) - 命名需符合网络接口规范(字母+数字)
- 可选参数,不指定时自动生成名称(格式:
- 示例 :
ifname office-vlan
- 注意 :实际接口名与连接名(
con-name
)可不同
2. dev
(父接口)
- 作用 :必需参数 ,指定承载 VLAN 的物理接口(如
eth0
) - 特性 :
- 必须是已存在的物理接口或绑定接口
- 与
vlan.parent
完全等价(二者选一即可)
- 示例 :
dev enp1s0
3. vlan.parent
(父接口别名)
-
作用 :与
dev
功能相同,指定物理父接口 -
等效关系 :
bashdev eth0 # 推荐写法(更简洁) vlan.parent eth0 # 完全等效
4. vlan.id
(VLAN 标识)
- 作用 :必需参数,设置 VLAN ID(1-4094 的整数)
- 特性 :
- 决定 VLAN 的逻辑分组
- 需与交换机配置的 VLAN ID 匹配
- 示例 :
vlan.id 100
5. id
(历史遗留参数)
- 作用 :早期版本中作为
vlan.id
的别名 - 现状 :
- 现代 NetworkManager 中已不推荐使用
- 可能引起歧义(
id
在其它连接类型中有不同含义)
- 替代方案 :始终使用
vlan.id
⚠️ 关键区别总结
参数 必要性 功能 等效参数 ifname
可选 接口名称 无 dev
必需 物理父接口 vlan.parent
vlan.id
必需 VLAN 标识 无( id
已废弃)
完整命令示例
bash
# 规范写法(推荐)
nmcli con add type vlan \
con-name office-vlan \ # 连接名称
ifname vlan100 \ # 接口名称
dev eth0 \ # 父接口
vlan.id 100 \ # VLAN ID
ipv4.method manual \ # 静态IP
ipv4.addresses 192.168.1.10/24 \
ipv4.gateway 192.168.1.1
配置验证
bash
# 查看VLAN参数
nmcli con show office-vlan | grep "vlan\."
# 输出示例:vlan.parent: eth0, vlan.id:100
# 查看实际接口
ip -d link show vlan100
# 输出应包含:vlan protocol 802.1Q id 100
配置保存位置
VLAN 配置存储在 /etc/NetworkManager/system-connections/
目录,文件名格式:<连接名>.nmconnection
(如 office-vlan.nmconnection
)。
在 nmcli con add type vlan
命令中,ifname
、dev
、vlan.parent
、id
和 vlan.id
的区别如下:
1. 参数解析
参数 | 作用 | 示例 | 是否必选 |
---|---|---|---|
ifname |
新创建的 VLAN 接口的逻辑名称 (如 vlan10 、eth0.100 ) |
ifname vlan10 |
是 |
dev |
父物理接口名称 (承载 VLAN 流量的底层接口,如 eth0 、bond0 ) |
dev eth0 |
是 |
vlan.parent |
父接口的等效参数 (与 dev 功能相同,语法更完整) |
vlan.parent eth0 |
是 |
id |
VLAN ID 号码 (标识 VLAN 层级,如 100 ) |
id 100 |
是 |
vlan.id |
VLAN ID 的完整参数名 (与 id 功能相同) |
vlan.id 100 |
是 |
2. 关键区别
(1) ifname
vs dev
/vlan.parent
-
ifname
:定义新 VLAN 接口的 逻辑名称 (如vlan10
),该名称会出现在ip link show
或nmcli connection show
的输出中。 -
dev
/vlan.parent
:指定 底层物理或绑定接口 (如eth0
),用于承载 VLAN 流量。两者功能完全相同,仅语法不同:bash# 等效命令 nmcli con add type vlan ifname vlan10 dev eth0 id 10 nmcli con add type vlan ifname vlan10 vlan.parent eth0 vlan.id 10
(2) id
vs vlan.id
id
:简写参数,直接指定 VLAN ID(如id 100
)。vlan.id
:完整参数名,功能与id
完全一致,推荐使用完整参数以提高配置可读性。
3. 实际使用示例
(1) 基础 VLAN 配置
bash
# 创建 VLAN ID 100 的子接口 eth0.100,父接口为 eth0,逻辑名称为 vlan100
sudo nmcli con add type vlan ifname vlan100 dev eth0 id 100
(2) 嵌套 VLAN 配置
bash
# 在父 VLAN 接口 vlan10 上创建子 VLAN 20(需启用 802.1ad 协议)
sudo nmcli con add type vlan ifname vlan10.20 dev eth0.10 id 20 vlan.protocol 802.1ad
(3) 绑定接口上的 VLAN
bash
# 在 bond0 接口上创建 VLAN 30,逻辑名称为 bond0.30
sudo nmcli con add type vlan ifname bond0.30 dev bond0 id 30
4. 验证配置
bash
# 查看 VLAN 接口信息
ip -d link show vlan100
# 输出示例:
4: vlan100@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff
vlan protocol 802.1Q id 100 <REORDER_HDR>
5. 常见问题
Q1:dev
和 vlan.parent
有何区别?
- 两者功能完全相同,仅参数名不同。
vlan.parent
是更明确的参数名,推荐优先使用。
Q2:id
和 vlan.id
是否可互换?
- 是的,两者功能一致。建议使用
vlan.id
以明确参数含义。
Q3:VLAN ID 范围是多少?
- VLAN ID 有效范围为 0-4094 ,其中
0
和4095
为保留值。
Q4:如何修改已创建的 VLAN ID?
-
需先删除原连接,再重新创建:
bashnmcli con delete vlan100 nmcli con add type vlan ifname vlan100 dev eth0 id 200
6. 最佳实践
-
命名规范 :VLAN 接口名称建议采用
<物理接口>.<VLAN_ID>
格式(如eth0.100
),便于识别。 -
协议兼容性 :嵌套 VLAN(如 Q-in-Q)需指定
vlan.protocol 802.1ad
。 -
MTU 调整 :若需支持大帧,可修改 MTU:
bashnmcli con modify vlan100 ethernet.mtu 2000
通过合理使用这些参数,可灵活管理 VLAN 接口的命名与底层物理设备绑定关系,适用于虚拟化、多租户隔离等场景。
在 nmcli con add type vlan
命令中,ifname
、dev
/vlan.parent
、id
/vlan.id
是核心参数,其作用与区别如下:
🔍 一、参数详解
参数 | 别名/等效参数 | 作用 | 是否必需 | 示例 |
---|---|---|---|---|
ifname |
- | 定义新 VLAN 子接口在系统中的名称(逻辑标识) | 是 | ifname vlan100 |
dev |
vlan.parent |
指定承载 VLAN 的父接口(物理网卡或逻辑接口如 Bond/Bridge) | 是 | dev eth0 或 vlan.parent bond0 |
id |
vlan.id |
设置 VLAN ID(范围 0-4094) | 是 | id 100 或 vlan.id 100 |
💡 说明:
dev
和vlan.parent
完全等价(可互换使用)。id
和vlan.id
完全等价 (推荐显式使用vlan.id
避免歧义)。
⚙️ 二、参数关系与协作
1. ifname
与 dev
/vlan.parent
的分工
ifname
:定义新接口的逻辑名称 (如vlan10
),用于系统识别和管理(如ip link show vlan10
)。dev
/vlan.parent
:指定底层物理或逻辑接口 (如eth0
或bond0
),VLAN 流量通过该接口传输。
2. id
/vlan.id
的作用
- 标识 VLAN 标签(802.1Q 协议中的 VLAN ID),交换机需配置为 Trunk 模式并允许该 ID 通过。
- 范围 0-4094,其中 ID=0 保留优先级标记,ID=4095 为保留值(通常禁用)。
⚠️ 三、关键注意事项
-
参数共存性:
-
ifname
和dev
/vlan.parent
必须同时存在,否则命令报错。 -
示例完整命令:
bashnmcli con add type vlan con-name vlan10 ifname vlan10 vlan.parent eth0 vlan.id 10
-
-
命名冲突:
ifname
名称需唯一(不与现有接口重复),否则创建失败。- 建议命名包含 VLAN ID 或父接口名(如
eth0.100
)。
-
父接口状态依赖:
- 父接口(如
eth0
)需为 UP 状态 (nmcli device status
显示connected
)。 - 若父接口为 Bond,需避免使用
fail_over_mac=follow
模式(可能导致 MAC 地址同步问题)。
- 父接口(如
🛠️ 四、典型配置示例
1. 基于物理网卡创建 VLAN
bash
nmcli con add type vlan \
con-name vlan100 \ # 连接名称(逻辑标识)
ifname eth0.100 \ # 接口名(系统可见)
vlan.parent eth0 \ # 父接口
vlan.id 100 \ # VLAN ID
ipv4.method manual \ # 静态 IP
ipv4.addresses 192.168.100.10/24
2. 基于 Bond 接口创建 VLAN
bash
# 先创建 Bond
nmcli con add type bond con-name bond0 ifname bond0 bond.options "mode=802.3ad"
# 在 Bond 上创建 VLAN
nmcli con add type vlan \
con-name bond0.200 \
ifname bond0.200 \
dev bond0 \ # 等效于 vlan.parent bond0
id 200 # 等效于 vlan.id 200
🔧 五、故障排查
-
问题:VLAN 接口未激活
- 检查父接口状态:
nmcli device status
。 - 验证交换机 Trunk 配置:确保允许对应 VLAN ID 通过。
- 检查父接口状态:
-
问题:
dev
参数报错 "Device not found"- 确认父接口名称正确(区分
eth0
vsens192
)。 - 关闭占用父接口的旧连接:
nmcli con down "old-connection"
。
- 确认父接口名称正确(区分
💎 总结
ifname
:定义新接口的系统名称(逻辑标识)。dev
/vlan.parent
:指定物理/逻辑父接口(承载流量)。id
/vlan.id
:设置 VLAN 标签 ID(范围 0-4094)。
通过明确参数分工,可高效创建 VLAN 子接口,适用于服务器网络隔离、虚拟化及容器网络等场景。
在 Linux NetworkManager 的 nmcli con add type vlan
命令中,参数 ifname
、dev
/vlan.parent
、id
/vlan.id
分别承担不同角色,其区别和用途如下:
📌 1. ifname
:指定 VLAN 子接口的逻辑名称
-
作用 :定义在系统中创建的虚拟 VLAN 接口的名称(如
vlan10
),用于操作系统内部标识和管理。 -
示例 :
bashifname vlan100 # 系统将创建名为 vlan100 的虚拟接口
-
特性 :
- 用户可自定义名称(如
vlan-office
、vlan-home
)。 - 需确保名称唯一性,避免与现有接口冲突。
- 用户可自定义名称(如
🔌 2. dev
或 vlan.parent
:指定物理父接口
-
作用 :指定承载 VLAN 流量的底层物理接口(如
eth0
、ens4
)或聚合接口(如 Bond、Bridge)。 -
等价性 :
dev
是vlan.parent
的简写形式,两者功能完全相同。 -
示例 :
bashdev eth0 # 或 vlan.parent eth0
-
要求 :
- 父接口必须真实存在且支持 VLAN(需加载
8021q
内核模块)。 - 交换机对应端口需配置为 Trunk 模式,允许指定 VLAN ID 通过。
- 父接口必须真实存在且支持 VLAN(需加载
🔢 3. id
或 vlan.id
:指定 VLAN 标识符
-
作用 :设置 VLAN 的 ID 号(范围
0--4094
),用于在网络中标识 VLAN 流量。 -
等价性 :
id
是vlan.id
的简写形式,两者功能相同。 -
示例 :
bashid 100 # 或 vlan.id 100
-
要求 :
- VLAN ID 需与交换机配置一致,否则网络无法互通。
- ID
0
和4095
为保留值,通常不可用。
⚙️ 完整命令示例
bash
# 创建 VLAN 连接
nmcli con add type vlan \
con-name vlan100 \ # 连接配置名称
ifname vlan100 \ # 系统接口名称(虚拟接口)
dev eth0 \ # 物理父接口(等价于 vlan.parent eth0)
id 100 \ # VLAN ID(等价于 vlan.id 100)
ipv4.method manual \ # 静态 IP
ipv4.addresses 192.168.10.5/24
❗ 常见错误与注意事项
ifname
冲突 :
若名称vlan100
已存在,会报错Interface name already exists
。- 无效的父接口 :
若dev eth0
不存在或未启用,会报错Device not found
。 - VLAN 支持未启用 :
需提前加载内核模块:modprobe 8021q
。 - 交换机配置不匹配 :
若交换机未放行 VLAN ID 100,流量将被丢弃。
📊 参数功能对比表
参数 | 作用 | 是否必填 | 示例值 | 依赖条件 |
---|---|---|---|---|
ifname |
定义虚拟接口的系统名称 | 是 | vlan100 |
名称唯一性 |
dev /vlan.parent |
指定物理父接口 | 是 | eth0 、ens4 |
接口存在且支持 VLAN |
id /vlan.id |
设置 VLAN 流量标识 | 是 | 100 |
与交换机配置匹配 |
💎 总结
ifname
:定义系统内 VLAN 接口的逻辑标识(虚拟层)。dev
/vlan.parent
:指定 VLAN 流量的物理承载接口(硬件层)。id
/vlan.id
:配置 VLAN 的网络标识 (协议层)。
三者协同工作,缺一不可。配置时需确保:
1️⃣ 逻辑名称(ifname
)唯一;
2️⃣ 父接口(dev
)有效且支持 VLAN;
3️⃣ VLAN ID(id
)与交换机一致。
在Linux的NetworkManager中使用nmcli con add type vlan
命令创建VLAN连接时,相关参数的作用及区别如下:
1. ifname
- 作用 :指定新创建的VLAN接口的名称(如
vlan10
)。 - 示例 :
ifname vlan10
表示生成的接口名为vlan10
。 - 注意 :此名称是可选的。若不指定,默认格式为
父接口名称.VID
(如eth0.10
)。
2. dev
vs vlan.parent
-
作用:两者均用于指定父接口(即承载VLAN的物理接口或逻辑接口)。
-
区别 :
dev
是旧版参数,现仍兼容但不推荐。vlan.parent
是明确且推荐的参数(需NetworkManager 1.14+版本支持)。
-
示例 :
bash# 旧版写法(兼容) dev eth0 # 新版推荐写法 vlan.parent eth0
3. id
vs vlan.id
-
作用:两者均用于设置VLAN的ID(范围1-4094)。
-
区别 :
id
是旧版参数,现仍兼容但不推荐。vlan.id
是明确且推荐的参数(需NetworkManager 1.14+版本支持)。
-
示例 :
bash# 旧版写法(兼容) id 10 # 新版推荐写法 vlan.id 10
4. 兼容性与推荐实践
- 旧版本兼容性 :在NetworkManager <1.14中,需使用
dev
和id
。 - 新版本推荐 :NetworkManager ≥1.14应优先使用
vlan.parent
和vlan.id
,因参数更明确,避免歧义。 - 冲突处理 :若同时指定(如
dev eth0 vlan.parent eth1
),后者可能覆盖前者,但强烈建议避免混用。
完整示例
新版推荐写法(明确指定VLAN参数):
bash
nmcli con add type vlan \
con-name myvlan10 \
ifname vlan10 \
vlan.parent eth0 \
vlan.id 10 \
ip4 192.168.1.100/24
旧版兼容写法(不推荐,但可能仍有效):
bash
nmcli con add type vlan \
ifname vlan10 \
dev eth0 \
id 10 \
ip4 192.168.1.100/24
总结
ifname
→ VLAN接口名称(建议自定义)。vlan.parent
→ 父接口(取代dev
)。vlan.id
→ VLAN ID(取代id
)。- 推荐使用新版参数以保持兼容性和可读性。可通过
man nm-settings-nmcli
查阅官方文档进一步验证。