Я хочу добавить правило, используя iptables
, но только если его еще нет.
Есть вариант -C
что позволит нам проверить, существует ли уже спецификация правила. Опция описана в этот вопрос и ответ также.
Из этих вопросов и ответов, этот конкретный ответ говорит, как можно использовать -D
(удалить), который удалит правило, если он существует, или выйдет с кодом 1, если его нет. (Что именно -C
работает, если правила не существует, поэтому проблем не возникнет).
И мне удобнее делать
ip6tables -D OUTPUT -p icmpv6 --icmpv6-type destination-unreachable -j DROP
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type destination-unreachable -j DROP
Вместо того, чтобы проверять, существует ли, удалить его, если он есть, и только затем добавить новое правило.
Однако кто-то в комментарии упомянул, что это открывает дыру в брандмауэре, и я не вижу, как это сделать.
Итог: почему я не должен слепо удалять и добавлять правило, а не проверять его перед удалением и добавлением?
Проблема с этим подходом (удалить, затем добавить) заключается в том, что эти две операции не выполняются одновременно, между ними есть некоторое время, и в это время ваша система подвергается воздействию нежелательного трафика, который предотвращает ваше правило DROP. Это может показаться безобидным в вашем случае с недостижимым ipv6, но учтите, что вы попадаете под удар трафика, из-за которого некоторые приложения или устройства перестают отвечать на запросы - по моему опыту, иногда даже мгновенное снижение правила брандмауэра, которое препятствовало этому, могло иметь некоторое долгое- длительные последствия.
Тот факт, что правило блокировки можно удалить и открыть что-то для нежелательного трафика, может быть меньшей проблемой, чем удаление правила, которое фактически позволяет вам войти. В этом случае у вас может не быть возможности восстановить его.