替换 ipset 的运行时实例

替换 ipset 的运行时实例

我有一个正在运行的 iptables 和 ipset 服务实例。其中一组具有与此类似的规范,有 20 多个引用:

create_set foo ipmap --network 123.45.67.0/24
add_to_set foo host1
add_to_set foo host2

其中主机 1 和 2 分别是 123.45.67.5 和 123.45.67.6。

我需要添加host3到与 67 不同子网的集合,例如 123.45.66.0。我想将集合扩大foo123.45.0.0/16。我在运行时尝试重新定义foo(无错误)并添加host3(例如 123.45.66.5)时遇到的问题,然后从命令中获取“超出范围”错误ipset。结果是ipset没有使用引用重新加载集合。

现在,所有这些都已用脚本和 makefile 编写,以便在更新集合或规则时尽可能少地使 ipset 和 iptables 服务停止运行。已保存并重新加载了数百个集合和规则。我可以(如果可以,怎样做)用加大版的跑步机代替原来的跑步机吗?看来我只能通过关闭 iptables 和 ipset、进行更改然后重新加载来做到这一点,但无法即时重建它;否则,当尝试host3从另一个子网添加条目时,它会抱怨设置规范错误。(稍后可能会在 123.45.xx 中添加其他主机。)

这发生在运行 ipset 4.5 或 6.11 的 EL5 和 EL6 上。

答案1

你应该创建新的集合

ipset create foo-new ...

在那里添加条目然后交换两者:

ipset swap foo-new foo

并销毁不再需要的集合:

ipset destroy foo-new

答案2

好吧,我最终找到了一些我认为可以接受的东西。如果有更好的答案出现,我会重新评估这个。

诀窍是重命名有问题的集合,然后使用原始名称重新创建一个新的、扩大的集合,例如假设问题中的集合和 IP:

/usr/bin/ipset --rename foo foo-old
/usr/bin/ipset --create foo ipmap 123.45.0.0/16
/usr/bin/ipset --add foo 123.45.67.5
/usr/bin/ipset --add foo 123.45.67.6
/usr/bin/ipset --add foo 123.45.66.5

对我来说很管用。然后就可以了--save。重新启动时ipset,引用将迁移到新实例,并且旧实例如果没有保存,则可以安全地丢弃。

相关内容