Я использую 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}'))
Я знаю, что это очень старый вопрос, но 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, если вы не хотите получать запрос на подтверждение)
Чтобы обойти новую нумерацию после каждого удаления, нам нужно повторно запустить команду и выбрать первый номер, затем удалить это правило и выполнить цикл следующим образом:
пока правда; 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
Поскольку невозможно принудительно удалить каждый элемент без подтверждения, я не нашел лучшего решения ... пока ....