ip addr add 必须指定 dev 和 cidr:不写 dev 会报“rtnetlink answers: no such device”,因内核需明确绑定网卡;不写 cidr(如 /24)则无法确定网络前缀、广播域及本地路由,导致地址不可达或添加失败。

ip addr add 为什么必须指定 dev 和 CIDR
不写 dev 参数,ip addr add 会报错:「RTNETLINK answers: No such device」;不带子网掩码(即 CIDR 格式,如 /24),则系统无法判断广播域和本地路由范围,导致地址添加失败或不可达。Linux 内核要求每个 IPv4 地址必须关联明确的网络前缀。
正确写法只有这一种结构:ip addr add 192.168.1.10/24 dev ens33。其中 ens33 必须是 ip link show 列出的真实网卡名,不能是别名(如 ens33:1)——后者已被废弃且不被 iproute2 支持。
-
ip addr add添加的是 secondary 地址,不是新接口,所有地址共享同一 MAC、MTU 和链路状态 - IPv6 同理:
ip addr add 2001:db8::1/64 dev ens33,注意 IPv6 不需要 netmask,只认前缀长度 - 重复执行相同命令不会报错,但也不会覆盖——它只是再加一条,需用
ip addr del显式删除
如何验证 secondary 地址是否生效
ip addr show ens33 输出中,主地址(primary)没有标记,secondary 地址会带 secondary 字样。例如:
inet 192.168.1.1/24 scope global ens33
inet 192.168.1.10/24 scope global secondary ens33
inet 192.168.1.11/24 scope global secondary ens33
如果没看到 secondary,说明地址没加成功,常见原因是:网卡 down 状态、IP 冲突、CIDR 错误或 dev 名拼错。
- 用
ping -I ens33 192.168.1.10测试该地址是否可响应(-I指定源接口) -
ip route get 192.168.1.254 from 192.168.1.10可验证该 IP 是否能正常选路 - 别依赖
ifconfig查看——它不显示 secondary 标记,容易误判
临时多IP配置后,为什么服务监听不到新IP
Apache/Nginx 默认监听 0.0.0.0 时,只要新 IP 在同一网卡上且路由可达,就能正常接收请求。但如果配置了 Listen 192.168.1.10:80 这类绑定特定 IP 的指令,而该 IP 尚未被内核确认为 local address,则服务启动会失败,报错类似:Cannot assign requested address。
- 确保
ip addr show中已出现该地址,并且状态是scope global(不是scope link) - 某些 systemd 服务(如
nginx.service)启动早于网络就绪,需加After=network.target或改用network-online.target - 防火墙可能拦截:检查
iptables -L -n -v或nft list ruleset是否放行该 IP 的端口
重启后多IP丢失,该怎么固化到配置里
临时命令不持久,生产环境必须写入发行版对应的网络配置机制。关键不是“怎么写”,而是“写在哪”——写错位置等于白配。
- RHEL/CentOS/Rocky 8+:编辑
/etc/sysconfig/network-scripts/ifcfg-ens33,追加IPADDR1=192.168.1.10、NETMASK1=255.255.255.0,最多支持 IPADDR0~IPADDR9 - Ubuntu/Debian(netplan):在
/etc/netplan/*.yaml的对应网卡下加addresses: [192.168.1.10/24, 192.168.1.11/24],然后运行sudo netplan apply - 不要手动创建
ifcfg-ens33:1文件——这是 ifconfig 时代的别名方式,现代 NetworkManager 或 systemd-networkd 会忽略它
最易被忽略的一点:修改配置后,必须触发网络重载(systemctl restart NetworkManager 或 netplan apply),而不是简单 reboot——否则旧配置仍驻留内存,新文件未生效。











