Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

  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}'))

Я знаю, что это очень старый вопрос, но 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 numbered вы получите такой результат:

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    10.181.225.123
[ 2] 3306/tcp                   ALLOW IN    10.181.225.123
[ 3] 3306/tcp                   ALLOW IN    10.181.226.45
[ 4] 3306/tcp                   ALLOW IN    10.181.226.77
[ 5] 3306/tcp                   ALLOW IN    10.181.225.196
[ 6] 3306/tcp                   ALLOW IN    10.181.226.3
[ 7] Anywhere                   ALLOW IN    10.181.226.45
[ 8] 3306/tcp                   ALLOW IN    10.181.224.55
[ 9] 3306/tcp                   ALLOW IN    10.181.224.80
[10] 3306/tcp                   ALLOW IN    10.208.6.136
[11] 3306/tcp                   ALLOW IN    10.178.128.13

Несколько вещей, которые нужно знать:

  • Выход из awk -F"[][]" '{print $2}' будет включать начальный пробел для чисел меньше 10, tr --delete [:blank:] удалит это
  • Как только начальные пробелы удалены, sort -rn отсортирует числа в обратном порядке.
  • Я пью yes использовать ufw вместо использования --force потому что у меня очень старый ufw. Если у вас есть современная версия, вы можете использовать --force.

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

ufw --force reset

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

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

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

пока правда; do n = $ (ufw status numbered | grep DENY | head -n 1 | awk -F "[] []" '{print $ 2}'); ["$ n"! = ""] || перерыв; да | ufw delete $ n; сделано;

Возможно, излишне говорить: после каждого удаления пронумерованного ufw-элемента все элементы, следующие за этим элементом, перенумеровываются. Таким образом, эта единственная строка удалит неправильные элементы после первого удаленного элемента:

#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

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