У меня есть сценарий, который добавляет правила 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, передав rulenum для каждого из них. Понятия не имею, как это сделать. Любая помощь будет оценена.
Спасибо!
Электромобиль
Что-то вроде этого:
#!/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 таблицей и очистить одну за другой.