У меня очень сложный и длинный скрипт iptables. Невозможно работать с существующей конфигурацией iptables, вручную вставляя / заменяя или удаляя. У меня есть сценарий, который просто сбрасывает все правила и пользовательские цепочки, а затем перезагружает все с нуля. Этот подход до некоторой степени работает хорошо.
У меня много конфиденциального трафика, например, линии E1, инкапсулированные в IP-пакеты, и многие другие. Я не могу позволить себе просто отбросить все правила и снова вставить их, потому что это слишком медленно. Многие вещи ломаются, если нет правила более чем на 50 мс. Кроме того, некоторый трафик с высокой пропускной способностью попадает в частично восстановленный брандмауэр, что приводит к очень плохим записям conntrack, которые требуют ручного вмешательства для восстановления функциональности.
Решением было бы добавить новые правила в конце текущего, а затем удалить старые, что теоретически может привести к созданию непрерывного набора правил. Проблема в том, что сценарий с настраиваемыми цепочками, ipset и т. Д. Становится очень сложным и подверженным ошибкам.
Вопрос в том, знаете ли вы какое-либо существующее решение (дополнительный слой поверх iptables), которое решает проблемы, о которых я упоминал здесь?
Заранее спасибо.
Вы пробовали загрузить свои новые правила с помощью iptables-restore
команда? Теоретически это атомарная операция, которая может решить большинство ваших проблем. Это требует, чтобы вы написали свои правила в формате, используемом iptables-save
.
Это должно быть довольно просто, если вы используете цепочки.
Создайте цепочку или две и добавьте к ней все свои правила. Все, что вам нужно сделать, это очистить, удалить и воссоздать цепочку (и), когда вам нужно повторно применить свои правила.
Итак, во время обновления вы вставляете вверху правило, которое разрешает установленные соединения (возможно, вы хотите, чтобы это было само по себе правило, всегда включенное и никогда не затрагиваемое), очищаете цепочку, а затем добавляете новые правила в цепочку. Это предполагает, что вы используете правила с отслеживанием состояния везде, где это возможно.
Я предлагаю адаптировать сценарий так, чтобы он использовал одно из двух имен для одной и той же цепочки (имеет смысл использовать префикс), в зависимости от того, как он вызывается. Таким образом, вместо цепочки dropthis будет set0_dropthis или set1_dropthis.
Таким образом, вы можете создать новый набор правил, не нарушая движения транспорта. После этого цепочки по умолчанию будут сброшены и воссозданы с новым набором в качестве цели. Оптимальным было бы иметь только одно правило в каждой цепочке по умолчанию, которое просто направляло бы трафик на старый или новый набор. Замена этого единственного правила будет быстрой (и даже безопасной с iptables -A; iptables -D ... 1
). После этого цепочки старого набора будут очищены и удалены.
Сценарий-оболочка определит, какой набор активен в данный момент, и вызовет настоящий сценарий с соответствующим параметром.
Я не думаю, что есть решение для такого крайнего случая, как ваш. Однако хорошая новость заключается в том, что было бы довольно легко написать скрипт Python, который заменил бы вставку нужного вам правила над старым, а затем удалил бы старое.
orchidea 10.0.0.1 /etc/exim % iptables -L -n --line-numbers
Chain RH-Firewall-1-INPUT (2 references)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
4 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
Просто проанализируйте вывод выше для цепочки и номера правила, скажем 4, выполните iptables -I chain 4 newrule, а затем iptables -D chain 5.
Единственный способ сделать это возможным - либо переделать существующий сценарий, чтобы использовать формат iptables-restore, либо изменить существующий сценарий, чтобы выгрузить команды в стандартный вывод вместо их выполнения, а затем создать второй сценарий для преобразования его в iptables-restore. формат.
iptables-restore гарантированно является атомарным и, таким образом, является единственным надежным способом беспрепятственной замены правил.
Я предлагаю вам использовать формат iptables-restore для запуска вашего сценария на виртуальной машине или в отдельном сетевом пространстве имен на действующей машине, а затем использовать iptables-save, чтобы получить его.