Как удалить определенные правила из 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 в @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