linux中无原生iface-post-up机制,实际应依网络管理工具选择对应方案:ifupdown用post-up/pre-down、systemd-networkd配.network文件、networkmanager用nmcli修改连接、或以systemd服务监听接口上线事件执行路由脚本。

Linux 中没有原生的 Iface-Post-Up 脚本机制——这个名称常见于 Debian/Ubuntu 早期的 /etc/network/interfaces 语法(已弃用),或被误记为某些自定义脚本名。实际可用且可靠的方式,是利用网卡启动后的**钩子(hook)机制**,在接口激活后自动执行路由配置。
确认你的网络管理方式
不同发行版使用不同网络管理工具,适用方案不同:
-
Debian/Ubuntu 旧版(ifupdown):仍支持
/etc/network/interfaces中的post-up指令 -
Ubuntu 18.04+(netplan + systemd-networkd 或 NetworkManager):需改用
.network配置或 systemd service -
RHEL/CentOS 7+(NetworkManager 或 network-scripts):推荐用
route-<iface></iface>文件或 NM 的 connection 修改
ifupdown 环境下用 post-up 添加路由(仅限仍启用 ifupdown 的系统)
编辑 /etc/network/interfaces,在对应网卡段中添加 post-up 行:
auto eth0
iface eth0 inet static
address 192.168.10.5
netmask 255.255.255.0
post-up ip route add 10.20.30.0/24 via 192.168.10.1 dev eth0
post-up ip route add default via 192.168.10.1 dev eth0 metric 100
pre-down ip route del 10.20.30.0/24 via 192.168.10.1 dev eth0 2>/dev/null || true
pre-down ip route del default via 192.168.10.1 dev eth0 metric 100 2>/dev/null || true
保存后运行 sudo ifdown eth0 && sudo ifup eth0 测试;重启也生效。
systemd-networkd 环境下用 .network 文件钩子
在 /etc/systemd/network/10-eth0.network 中添加:
[Match] Name=eth0 [Network] Address=192.168.10.5/24 IPForward=yes [Route] Destination=10.20.30.0/24 Gateway=192.168.10.1 [Route] Destination=0.0.0.0/0 Gateway=192.168.10.1 Metric=100
启用并重载:sudo systemctl restart systemd-networkd。所有路由随接口启动自动加载,且支持多表、策略路由等高级功能。
NetworkManager 环境下通过 connection 属性设置
使用 nmcli 为连接添加永久静态路由:
nmcli connection modify "Wired connection 1" \ +ipv4.routes "10.20.30.0/24 192.168.10.1" \ +ipv4.routes "0.0.0.0/0 192.168.10.1 100" nmcli connection modify "Wired connection 1" ipv4.ignore-auto-routes yes nmcli connection down "Wired connection 1" && nmcli connection up "Wired connection 1"
该配置写入 /etc/NetworkManager/system-connections/ 下的连接文件,重启后持续有效,且兼容 GUI 和 CLI。
通用兜底方案:systemd 服务监听接口上线事件
若上述方式不适用(如混合环境或特殊路由逻辑),可创建一个轻量级 systemd 服务,在网卡就绪后运行脚本:
- 新建脚本
/usr/local/bin/apply-eth0-routes.sh,加入ip route add ...命令 - 创建服务
/etc/systemd/system/eth0-routes.service:[Unit] Description=Apply custom routes for eth0 After=network-online.target Wants=network-online.target BindsTo=sys-subsystem-net-devices-eth0.device After=sys-subsystem-net-devices-eth0.device [Service] Type=oneshot ExecStart=/usr/local/bin/apply-eth0-routes.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
- 启用:
sudo systemctl daemon-reload && sudo systemctl enable eth0-routes.service
此方式完全可控、可调试,适合复杂条件判断(如检查网关连通性后再加路由)。











