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-networkdNetworkManager。下面以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脚本,反之则需要再修改。

如果按照以上步骤操作没有成功可以留言或者点击链接自行查看官方文档:

  1. netplan reference
  2. Use pre-up, post-up, etc. hook scripts