Я использую ansible для конфигурирования ufw на моих серверах БД, чтобы только позволить, принимают соединения от определенного соединения серверов до определенного порта (позволяет, говорят 1234
).
Когда сервер, который раньше имел доступ, вынут из пула, о нем можно было бы забыть для удаления правила доступа для того сервера.
Мое решение: При устанавливании правил я хочу удалить все правила для порта 1234
, и затем воссоздайте их с серверами от текущего пула.
К сожалению, ufw delete
требует для точного определения правила, которое будет удалено (порт, протокол, scr IP...).
Я попробовал решение как ufw delete $(ufw status numbered | grep 1234 | <get all the numbers of the rules> )
, но это стало действительно ужасным, действительно быстро.
Существует ли лучший способ удалить все правила для определенного порта?
Здесь необходимо решить две проблемы:
Я думаю, что у меня есть решение проблемы №1 с помощью этого единственного вкладыша в bash:
ufw status numbered |(grep '80/tcp'|awk -F"[][]" '{print $2}')
В приведенном выше примере соответствует любому правилу брандмауэра для строки '80 / tcp 'и печатается только номер правила с удаленными скобками.
Я еще не решил проблему №2, потому что насколько я могу судить,команда 'ufw delete' не имеет переключателя, который подавляет запрос подтверждения '(y | n)', тем самым препятствуя автоматизации.
Однако вы можете запустить команду ниже и вручную отменить каждое удаление правила, нажав 'y 'нажмите клавишу для подтверждения, а затем стрелку вверх => введите, чтобы промыть и повторить
ufw delete $(ufw status numbered |(grep '80/tcp'|awk -F"[][]" '{print $2}'))
Возможно, нет необходимости говорить: после каждого удаления пронумерованного ufw-элемента все пункты, следующие за этим пунктом, перенумеровываются. Поэтому этот oneliner будет удалять неправильные элементы после первого удаленного элемента:
#Wrong use of deleting multiple ufw-items:
for numb in $(ufw status numbered | grep DENY | cut -d" " -f1 | grep -o [[:digit:]]*); do ufw delete $numb; done
Пока невозможно принудительно удалить каждый элемент без подтверждения, я не нашел лучшего решения... пока что ....
.Если вам нужно стереть все ваши правила (а не только определенные порты):
ufw --force reset
(- принудительно, если вы не хотите запрашивается подтверждение)
Я знаю, что это очень старый вопрос, но Google привел меня сюда, и пока ответы были полезными, поэтому я хотел поделиться своим полным решением. Ответ от @Seth помог мне в большинстве случаев.
Моя цель - удалить все правила UFW, разрешающие подключения к локальному серверу MySQL через порт 3306. Вот что я использовал:
for NUM in $(ufw status numbered | grep 3306 | awk -F"[][]" '{print $2}' | tr --delete [:blank:] | sort -rn); do
yes | ufw delete $NUM
done
Ключ к автоматизации - это правила удаления в обратном порядке . При удалении с конца числа выше не меняются.
При запуске ufw status с номером
вы получите следующий результат:
To Action From - ------ ---- [1] 22 РАЗРЕШИТЬ В 10.181.225.123 [2] 3306 / tcp РАЗРЕШИТЬ В 10.181.225.123 [3] 3306 / tcp РАЗРЕШИТЬ В 10.181.226.45 [4] 3306 / tcp РАЗРЕШИТЬ В 10.181.226.77 [5] 3306 / tcp РАЗРЕШИТЬ В 10.181.225.196 [6] 3306 / tcp РАЗРЕШИТЬ В 10.181.226.3 [7] Везде РАЗРЕШИТЬ В 10.181.226.45 [8] 3306 / tcp РАЗРЕШИТЬ В 10.181.224.55 [9] 3306 / tcp РАЗРЕШИТЬ В 10.181.224.80 [10] 3306 / tcp РАЗРЕШИТЬ В 10.208.6.136 [11] 3306 / tcp РАЗРЕШИТЬ В 10.178.128.13
Несколько вещей, которые нужно знать:
awk -F "[] []" '{print $ 2}'
будет включать начальный пробел для чисел меньше 10, tr --delete [: blank:]
удалит его sort -rn
отсортирует числа в обратном числовом порядке. да
для ufw вместо использования - force
, потому что у меня очень старый ufw. Если у вас современная версия, вы можете использовать - force
. Для обхода новой нумерации после каждого удаления, нам нужно повторить команду и выбрать первое число, затем удалить это правило и цикл так:
while true; do n=$(ufw статус пронумерован | grep DENY | head -n 1 | awk -F"[][]" '{print $2}'');["$n" ! = "" ] || break; yes | ufw delete $n; done;
UFW (Uncomplicated Firewall) — это внешний интерфейс для iptables. Просто используйте iptables для блокировки/удаления портов в этом случае.