У меня есть работающий экземпляр служб iptables и ipset. Среди них один набор имеет спецификацию, аналогичную этой, которая содержит более 20 ссылок на него:
create_set foo ipmap --network 123.45.67.0/24
add_to_set foo host1
add_to_set foo host2
где host1 и 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
не перезагружает наборы ссылками.
Теперь все это написано сценариями и make-файлами, чтобы как можно меньше снижать работу служб ipset и iptables при обновлении наборов или правил. Сотни наборов и правил сохранены и перезагружены. Могу ли я (и если да, то как) заменить беговой комплект на его увеличенную версию? Кажется, я могу сделать это, только выключив iptables и ipset, внося изменения и перезагружая его, но не могу восстановить его на лету; в противном случае он жалуется, что заданная спецификация неверна при попытке добавить host3
вход из другой подсети. (В 123.45.x.x могут быть и другие хосты, добавленные позже.)
Это происходит на EL5 и EL6, работающих под управлением ipset 4.5 или 6.11.
Вы должны создать НОВЫЙ набор с
ipset create foo-new ...
добавьте туда записи, а затем поменяйте их местами:
ipset swap foo-new foo
и уничтожаем ненужный набор:
ipset destroy foo-new
Что ж, я нашел кое-что, что я считаю приемлемым в конце концов. Если появятся лучшие ответы, я пересмотрю этот.
Уловка состоит в том, чтобы переименовать проблемный набор, а затем воссоздать новый, расширенный набор с исходным именем, например, предполагая наборы и 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
, ссылки перенесены в новый экземпляр, а старый можно безопасно удалить, если не сохранить.