我有一个正在运行的 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。我想将集合扩大foo
到123.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
,引用将迁移到新实例,并且旧实例如果没有保存,则可以安全地丢弃。