iptables - очистить все правила PREROUTING с указанным адресом назначения

У меня есть скрипт, который добавляет iptable правила PREROUTING. Все они имеют одинаковые адреса. Когда я запускаю это:

 iptables --list PREROUTING -t nat

Я вижу вывод, как это:

 DNAT       tcp  --  anywhere             165.193.122.18      tcp dpt:https to:192.168.2.1:443
 DNAT       tcp  --  anywhere             63.135.91.11        tcp dpt:https to:192.168.2.1:443
 DNAT       tcp  --  anywhere             63.135.90.224       tcp dpt:https to:192.168.2.1:443

Кажется, что я должен быть в состоянии отбросить все эти правила, написав такую ​​команду...

"drop all PREROUTING rules that go to 192.168.2.1:443"

Итак, при просмотре опций для itables мне кажется, что мне нужно использовать опцию -D. Но я не знаю рулен, чтобы дать это.:-(

Поэтому мне, вероятно, нужно запросить существующие правила, grep, чтобы ограничить его назначением 192.168.2.1:443, и запустить -D, передавая руленум для каждого. Я понятия не имею, как это сделать. Любая помощь будет оценена.

Спасибо!

Е.В.

4 ответа

Решение

Что-то вроде этого:

#!/bin/bash

for line_num in $(sudo iptables --line-numbers --list PREROUTING -t nat | awk '$7=="to:192.168.2.1:443" {print $1}')
do
  # You can't just delete lines here because the line numbers get reordered
  # after deletion, which would mean after the first one you're deleting the
  # wrong line. Instead put them in a reverse ordered list.
  LINES="$line_num $LINES"
done

# Delete the lines, last to first.
for line in $LINES
do
  sudo iptables -t nat -D PREROUTING $line
done

unset LINES

Возможно, вам придется настроить номер поля в awk, если он не совпадает.

Вы можете использовать следующий однострочник:

sudo iptables -S | grep $pattern | cut -d " " -f 2- | xargs -L1 sudo iptables -D

Где $pattern - ваш желаемый шаблон.

Я рекомендую вам сначала повторить результаты этой команды, чтобы избежать драмы

Вы можете упростить обращение строки с помощью команды tac:

#!/bin/bash

for line in $(sudo iptables --line-numbers --list PREROUTING -t nat | awk '$7=="to:192.168.2.1:443" {print $1}' | tac)
do
  # You can't just delete lines here because the line numbers get reordered
  # after deletion, which would mean after the first one you're deleting the
  # wrong line. Instead put them in a reverse ordered list.
  sudo iptables -t nat -D PREROUTING $line
done

Использование --line-numbers чтобы отобразить номер правила, grep и awk, и оно у вас есть.

# iptables -vnL -t nat --line-numbers |grep 10.1.1.0|awk '{print $1}' 
1

Вы можете использовать for очистить все правила, соответствующие одному конкретному IP.

# for rule in $(iptables -vnL -t nat --line-numbers |grep 10.1.1.0|awk '{print $1}'); do iptables -D INPUT $rule; done

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

Другие вопросы по тегам