Как я могу удалить определенные правила в iptables?
Я размещаю специальные службы HTTP и HTTPS на портах 8006 и 8007 соответственно. Я использую iptables для "активации" сервера; т. е. для маршрутизации входящих портов HTTP и HTTPS:
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8006 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8007 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8006
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8007
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8006
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 8007
это работает как шарм. Однако я хотел бы создать еще один скрипт, который снова отключает мой сервер; т. е. восстанавливает iptables до состояния, в котором он был до запуска строк выше. Однако мне трудно понять синтаксис, чтобы удалить эти правила. Единственное, что кажется на работу идет полный флеш:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
но это также удалит другие правила iptables, которые нежелательны.
6 ответов:
выполните те же команды, но замените "-A" на "-D". Например:
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
становится
iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
вы также можете использовать номер правила ( -- line-numbers):
iptables -L INPUT --line-numbers
пример :
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT udp -- anywhere anywhere udp dpt:domain 2 ACCEPT tcp -- anywhere anywhere tcp dpt:domain 3 ACCEPT udp -- anywhere anywhere udp dpt:bootps 4 ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
поэтому, если вы хотите удалить второе правило:
iptables -D INPUT 2
обновление
если вы используете (d) определенную таблицу (например, nat), вы должны добавить ее в команду delete (thx to @ThorSummoner для комментария)
sudo iptables -t nat -D PREROUTING 1
лучшее решение, которое работает для меня без каких-либо проблем выглядит так:
1. Добавьте временное правило с некоторым комментарием:comment=$(cat /proc/sys/kernel/random/uuid | sed 's/\-//g') iptables -A ..... -m comment --comment "${comment}" -j REQUIRED_ACTION
2. Когда правило добавлено и вы хотите удалить его (или все с этим комментарием), сделайте:
iptables-save | grep -v "${comment}" | iptables-restore
таким образом, вы на 100% удалите все правила, соответствующие $comment, и оставите другие строки нетронутыми. Это решение работает в течение последних 2 месяцев с около 100 изменениями правил в день - никаких проблем.Надеюсь, это поможет
сначала перечислите все правила iptables с помощью этой команды:
iptables -S -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
затем скопируйте конкретное правило, которое вы хотите удалить.
наконец удалите правило с помощью этой команды:
iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
использовать это как
man
страница объясняет это:-D, --delete chain rule-specification -D, --delete chain rulenum Delete one or more rules from the selected chain. There are two versions of this command: the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.
понимаю эта команда, как и все другие команды(
-A
,-I
) работает на определенной таблице. Если вы не работаете с таблицей по умолчанию (filter
таблицы), используйте-t TABLENAME
чтобы указать эту целевую таблицу.удалить правило, чтобы соответствовать
iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
Примечание: это только удаляет первое правило соответствует. Если у вас есть много правил(это может произойти в iptables), запустите это несколько раз.
удалить правило, указанное как количество
iptables -D INPUT 2
кроме подсчета числа вы можете перечислить номер строки с
предположим, что если вы хотите удалить правила NAT,
список прилагаемых IPtables с помощью команды ниже,
# sudo iptables -L -t nat -v Chain PREROUTING (policy ACCEPT 18 packets, 1382 bytes) pkts bytes target prot opt in out source destination 7 420 DNAT tcp -- any any anywhere saltmaster tcp dpt:http to:172.31.5.207:80 0 0 DNAT tcp -- eth0 any anywhere anywhere tcp dpt:http to:172.31.5.207:8080
Если вы хотите удалить правило nat из IPtables, просто выполните команду,
# sudo iptables -F -t nat -v Flushing chain `PREROUTING' Flushing chain `INPUT' Flushing chain `OUTPUT' Flushing chain `POSTROUTING'
тогда вы можете проверить это,
# sudo iptables -L -t nat -v