Как удалить все правила ufw для определенного порта?

Я использую ansible для конфигурирования ufw на моих серверах БД, чтобы только позволить, принимают соединения от определенного соединения серверов до определенного порта (позволяет, говорят 1234).

Когда сервер, который раньше имел доступ, вынут из пула, о нем можно было бы забыть для удаления правила доступа для того сервера.

Мое решение: При устанавливании правил я хочу удалить все правила для порта 1234, и затем воссоздайте их с серверами от текущего пула.

К сожалению, ufw delete требует для точного определения правила, которое будет удалено (порт, протокол, scr IP...).

Я попробовал решение как ufw delete $(ufw status numbered | grep 1234 | <get all the numbers of the rules> ), но это стало действительно ужасным, действительно быстро.

Существует ли лучший способ удалить все правила для определенного порта?

6
задан 24 July 2014 в 15:54
6 ответов

Здесь необходимо решить две проблемы:

  1. создать список номеров правил ufw, соответствующих желаемой строке.
  2. пусть оболочка развернет этот список и прикрепит его к концу последовательности команд ufw delete [номер правила].

Я думаю, что у меня есть решение проблемы №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}'))
5
ответ дан 3 December 2019 в 00:18

Возможно, нет необходимости говорить: после каждого удаления пронумерованного 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

Пока невозможно принудительно удалить каждый элемент без подтверждения, я не нашел лучшего решения... пока что ....

.
0
ответ дан 3 December 2019 в 00:18

Если вам нужно стереть все ваши правила (а не только определенные порты):

ufw --force reset

(- принудительно, если вы не хотите запрашивается подтверждение)

2
ответ дан 3 December 2019 в 00:18

Я знаю, что это очень старый вопрос, но 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 .
1
ответ дан 3 December 2019 в 00:18

Большинство решений здесь удалят неправильные правила из-за UFW перенумерации правил после удаления.

Для обхода новой нумерации после каждого удаления, нам нужно повторить команду и выбрать первое число, затем удалить это правило и цикл так:

while true; do n=$(ufw статус пронумерован | grep DENY | head -n 1 | awk -F"[][]" '{print $2}'');["$n" ! = "" ] || break; yes | ufw delete $n; done;

1
ответ дан 3 December 2019 в 00:18

UFW (Uncomplicated Firewall) — это внешний интерфейс для iptables. Просто используйте iptables для блокировки/удаления портов в этом случае.

0
ответ дан 14 February 2021 в 19:49

Теги

Похожие вопросы