应使用 /etc/network/if-up.d/ 目录下的可执行脚本,因其被 ifupdown 和 network 服务原生支持,在网卡 ip 配置完成后按字典序执行;需校验接口名、用 ip route 防重,并注意 systemd-networkd 下需改用 .network 配置。

Linux里没有标准的 Iface-Post-Up 脚本机制。你真正需要的是 /etc/network/if-up.d/ 目录下的可执行脚本——它才是网卡完成 IP 配置、接口 UP 后自动触发的可靠入口。
为什么 if-up.d 是正确选择
该目录被 Debian/Ubuntu 的 ifupdown 和 RHEL/CentOS 的 network 服务原生支持,脚本在 ifup 完成全部配置(包括 DHCP 获取地址、多 IP 绑定)后按字典序执行,天然满足「物理网卡启动后」这一时序要求。
而 ifup-post 不是公开可编辑路径,/etc/rc.local 执行太晚(可能错过 NFS 挂载时机),且无法感知单个网卡启停状态。
编写 and 部署 if-up.d 脚本
- 新建脚本,例如
/etc/network/if-up.d/99-add-route-to-eth1 - 以
#!/bin/bash开头,加上可执行权限:chmod +x /etc/network/if-up.d/99-add-route-to-eth1 - 脚本接收两个参数:
$1是接口名(如eth1),$2是配置段名(通常忽略) - 必须校验接口名,避免对
lo、docker0等误操作 - 使用
ip route(非route),并检查是否已存在再添加,防止重复报错
示例内容:
#!/bin/bash
if [ "$1" = "eth1" ]; then
if ! ip route show | grep -q "10.20.0.0/16.*via.*10.20.1.1"; then
ip route add 10.20.0.0/16 via 10.20.1.1 dev eth1
fi
fi
注意 systemd-networkd 的例外情况
如果你的系统启用了 systemd-networkd(运行 systemctl is-active systemd-networkd 可确认),if-up.d 将完全不生效——因为 systemd-networkd 不走传统 ifup/ifdown 流程。
此时应改用 netdev 或 network 配置文件,在对应 .network 文件中添加:
[Route] Destination=10.20.0.0/16 Gateway=10.20.1.1 Interface=eth1
确保网卡本身开机自启
脚本再可靠,也依赖网卡能被系统主动激活。请确认配置文件中设置了:
- RHEL/CentOS/Fedora:
/etc/sysconfig/network-scripts/ifcfg-eth1中有ONBOOT=yes - Debian/Ubuntu:
/etc/network/interfaces中对应auto eth1和iface eth1 inet ...
否则 ifup eth1 根本不会被调用,脚本自然不会运行。











