ubuntu 22.04 netplan添加钩子 启动网卡时自动添加iptables预设规则
- ubuntu 22.04 netplan添加钩子 启动网卡时自动添加iptables预设规则
- 1. netplan简单说明
- 2. 配置hook脚本
ubuntu 22.04 netplan添加钩子 启动网卡时自动添加iptables预设规则
在日常的运维工作中,有时会需要在网卡启动或者重启时执行某些hook来实现特定的需求,例如ubuntu 16.04中可以在/etc/network/interfaces
中添加pre-up iptables-restore < /etc/iptables/rules.v4
来实现重启网卡时自动加载一些预设的iptables规则。
但从ubuntu 18.04 LTS开始,ubuntu使用了全新的netplan来管理网络配置,之前通过pre-up
参数来调用hook脚本的操作就不再适用了。
1. netplan简单说明
在系统启动的早期阶段,netplan的“network renderer”运行,读取 /{lib,etc,run}/netplan/*.yaml 并将配置写入 /run 以将设备控制权移交给指定的网络守护进程。目前支持的网络管理工具有systemd-networkd
和NetworkManager
。下面以Ubuntu 22.04 LTS为例,进行说明。通过配置/etc/netplan/00-installer-config.yaml
文件中以如下格式进行显式指定选择使用哪个网络管理工具。systemd-networkd
是系统默认配置,如果没有显式指定renderer
的值,则默认交由systemd-networkd
处理。
- systemd-networkd
network:
version: 2
renderer: networkd
- NetworkManager
network:
version: 2
renderer: NetworkManager
如果选择NetworkManager请先执行sudo dpkg -l | grep "network-manager"
检查NetworkManager
软件包是否安装到了系统中,如果没有,需要手动安装:
$ sudo apt update
$ sudo apt install network-manager
请注意,systemd-networkd
是包含在systemd
软件包中的,默认已经安装。
ifupdown 的用户可能更熟悉在网络接口的配置文件中使用钩子脚本(例如 pre-up、post-up 等),但Netplan目前在其配置定义中不支持hook脚本,而是需要通过networkd-dispatcher
软件包实现。如果networkd-dispatcher
还没有安装到系统中,则通过下边命令安装:
$ sudo apt update
$ sudo apt install networkd-dispatcher
2. 配置hook脚本
下表是分别是ifupdown、networkd-dispatcher、networkmanager在不同网络状态对hook脚本的支持情况:
HOOK | IFUPDOWN | NETWORKD-DISPATCHER | NETWORKMANAGER |
pre-u | if-pre-up.d | pre-up | |
configuring | configuring.d | ||
configured | configured.d | ||
up | if-up.d | routable.d | up |
post-up | if-post-up.d | routable.d | |
degraded | degraded.d | ||
pre-down | if-pre-down.d | pre-down | |
down | if-down.d | off.d | down |
post-down | if-post-down.d | off.d | |
no-carrier | nocarrier.d |
以下是使用networkd-dispatcher
通过安装在/etc/networkd-dispatcher/routeable.d/50-ifup-hooks
中的脚本运行现有ifup
钩子的示例:
#!/bin/sh
for d in up post-up; do
hookdir=/etc/network/if-${d}.d
[ -e $hookdir ] && /bin/run-parts $hookdir
done
exit 0
同样,这是安装在/etc/networkd-dispatcher/off.d/50-ifdown-hooks
中的ifdown
挂钩的示例:
#!/bin/sh
for d in down post-down; do
hookdir=/etc/network/if-${d}.d
[ -e $hookdir ] && /bin/run-parts $hookdir
done
exit 0
需要确保hook脚本/etc/networkd-dispatcher/routeable.d/50-ifup-hooks
或/etc/networkd-dispatcher/off.d/50-ifdown-hooks
有执行的权限。
下边就可以创建自己的hook脚本来执行需要的操作:
$ sudo cat /etc/network/if-up.d/iptables-restore
#!/bin/bash
iptables-restore < /etc/iptables/rules.v4
$ sudo chmod +x /etc/network/if-up.d/iptables-restore
注意:
- 新创建的hook脚本也需要赋予执行权限
- 新创建的hook脚本文件名如果以
.sh
结尾,并不能被/bin/run-parts
命令所识别。
可以通过执行如果命令测试:
$ /bin/run-parts /etc/network/if-up.d/ --test
/etc/network/if-up.d//iptables-restore
如果执行后,返回了要执行的hook脚本,说明可以成功调用到hook脚本,反之则需要再修改。
如果按照以上步骤操作没有成功可以留言或者点击链接自行查看官方文档: