Мне нужно добавить правило в iptables, чтобы заблокировать подключения к TCP-порту из Интернета.
Поскольку мой сценарий может вызываться несколько раз, а сценарий для удаления правила отсутствует, я хочу проверить, существует ли правило iptables, прежде чем его вставить, иначе в цепочке INPUT будет много правил dup.
Как я могу проверить, существует ли правило iptables?
Ответы:
В
-C --check
последних версиях iptables появилась новая опция.Для более старых версий iptables я бы использовал предложение Гарретта:
источник
Новая
-C
опция не является удовлетворительной, потому что она открыта для состояния гонки «время проверки на время использования» (TOCTTOU). Если два процесса попытаются добавить одно и то же правило примерно в одно и то же время,-C
они не будут защищены от добавления его дважды.Таким образом, это действительно не лучше, чем
grep
решение. Точная работа по обработке текста на выходеiptables-save
может работать так же надежно, как и на этом-C
, так как этот вывод является надежным снимком состояния таблиц.Необходима
--ensure
опция, которая атомарно проверяет и добавляет правило, только если оно еще не существует. Более того, было бы неплохо, если бы правило было перемещено в правильную позицию, в которую было бы вставлено новое правило, если оно еще не существовало (--ensure-move
). Например, еслиiptables -I 1
используется для создания правила в начале цепочки, но это правило уже существует в седьмой позиции, то существующее правило должно переместиться в первую позицию.Я думаю, что без этих возможностей возможный обходной путь - написать цикл сценария оболочки на основе этого псевдокода:
Этот код может вращаться; это не гарантирует, что два или более гонщика будут в пределах фиксированного числа итераций. Некоторые рандомизированные экспоненциальные отсрочки могут быть добавлены, чтобы помочь с этим.
источник
Это может показаться немного отсталым, но это работает для меня - попробуйте сначала удалить правило.
iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;
Вы должны получить сообщение, похожее на:
iptables: неверное правило (существует ли соответствующее правило в этой цепочке?)
Затем просто добавьте ваше правило как обычно:
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;
источник
Просто список и поиск?
... или, тем не менее, вы указали правило. Если вы используете
grep -q
его, ничего не выведите, и вы можете просто проверить возвращаемое значение с помощью$?
источник
iptables-save|grep $ip
вместо этого, так как это более легко анализируемый формат, особенно в сценарии. Вы также можете проверить точный синтаксис команды, если хотите.iptables-save|grep $ip
вполне может соответствовать нескольким правилам. Возможно,iptables-save
можно использовать для проверки полной спецификации правила, но это все же немного хак: формат, возвращаемый,iptables-save
может не полностью соответствовать правилу в сценарии.iptables-save
может генерировать параметры в другом порядке, добавлять вещи (например-m tcp
) и так далее.iptables --list
попытаются разрешить известные порты. Так что убедитесь в этом, прежде чем grep для порта.Как насчет сначала добавить, а затем удалить дубликаты, как описано в https://serverfault.com/questions/628590/duplicate-iptable-rules . Самый простой (для соседних линий), кажется,
источник
Чтобы избежать дублирования правил в вашем скрипте, добавьте строку ниже.
При первом запуске вышеуказанной команды мы увидим следующее сообщение
Это только для информации. Но вторая половина команды обеспечит добавление правила.
источник