Linux系统为单块网卡配置多IP并非单一方法,系统类型、持久化需求及NetworkManager的介入决定采用ifcfg别名文件、interfaces多address或临时命令。务必注意别名逻辑与配置细节。
配置多IP并不等同于必须使用别名接口(eth0:0),不同发行版的处理流程也不相同。实际选择取决于系统类型、持久化需求、IP数量以及NetworkManager是否介入。
ifconfig 和 ip addr add 都能临时加 IP,但行为不同
ifconfig 是传统工具,ip addr add 是 iproute2 套件中的现代命令。两者均能即刻生效,但关键差异在于:
- ifconfig eth0:0 192.168.1.100 netmask 255.255.255.0 会建立逻辑别名接口 eth0:0,在 ifconfig 输出中可见,但使用 ip addr 查看时仅表现为 eth0 的 secondary 地址且无标签。
- ip addr add 192.168.1.100/24 dev eth0 直接将地址附加到 eth0 主接口,ip addr show eth0 中会明确标注 secondary,并支持更多控制(如 scope、label)。
- ip addr flush dev eth0 会清除所有 secondary 地址,但不影响 primary;而 ifconfig eth0:0 down 仅影响该别名。
CentOS/RHEL 系统写 ifcfg-eth0:x 文件要注意三处硬性匹配
此类系统依赖 /etc/sysconfig/network-scripts/ 下的配置文件启动网络服务,手动添加别名时易因细节错误导致重启后失效:
- 文件名必须为 ifcfg-eth0:0,且 DEVICE=eth0:0 应完全一致(大小写、冒号、数字均需匹配)。
- BOOTPROTO 推荐设置为 static,避免使用 none,因某些旧版本脚本对 none 解析不稳定。
- ONBOOT=yes 为必需,否则 service network restart 不会加载该文件;若系统启用 NetworkManager,则可能直接忽略这些文件。
- 不要在多个别名文件中重复定义 GATEWAY,以免路由冲突;网关仅应在主接口(如 ifcfg-eth0)中定义一次。
批量加一段 IP 更推荐 range 文件而非一堆 ifcfg-eth0:x
当需要绑定 10 个以上连续 IP(如 192.168.1.100–192.168.1.120)时,使用 ifcfg-eth0-range0 比建立 21 个文件更清晰,但三个参数需谨慎设置:
- IPADDR_START 和 IPADDR_END 必须位于同一子网,且掩码应设为 255.255.255.255(而非 /24 对应的 255.255.255.0),否则范围解析失败。
- CLONENUM_START=0 表示首 IP 绑定到 eth0:0,第二个绑定到 eth0:1……若已存在 ifcfg-eth0:0,则起始值应从 1 开始,以免冲突。
- NO_ALIASROUTING=yes 建议添加——它使所有流量经由主接口 eth0 出入,避免别名接口触发反向路径过滤(rp_filter)丢包。
Debian/Ubuntu 系统直接改 /etc/network/interfaces 更自然
这类系统允许在同一接口块内写入多个 address 指令,无需别名文件或 range 文件:
auto eth0iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 address 192.168.1.101 netmask 255.255.255.0 gateway 192.168.1.1
但需注意:systemctl restart networking 会重载整个配置,语法错误(如换行或空格问题)可能导致 eth0 失联。建议先执行 ifup --no-act eth0 验证语法,再真正 reload。
别名接口的 label 机制、range 文件起始编号覆盖逻辑以及 NetworkManager 的静默接管,是多 IP 配置中容易忽略却致命的隐患。即便 ip addr 显示正常,也可能出现 ping 不通或连接超时,根源往往在于配置看似正确实则未生效。