Ответ 1
Выполните те же команды, но замените "-A" на "-D". Например:
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
становится
iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
Я размещаю специальные службы 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
Это работает как шарм. Однако я хотел бы создать еще один script, который снова отключит мой сервер; то есть восстановить 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, которые нежелательны.
Выполните те же команды, но замените "-A" на "-D". Например:
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
становится
iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
Вы также можете использовать номер правила (- строки-номера):
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 (спасибо 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
Используйте команду -D
, вот как это описывает страница 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
Помимо подсчета номера, вы можете указать номер строки с параметром --line-number
, например:
iptables -t nat -nL --line-number
Предположим, что если вы хотите удалить правила NAT,
Список присоединенных IP-таблиц, используя приведенную ниже команду,
# 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