Потеря сеансов SSH при применении правил iptables

Потеря сеансов SSH при применении правил iptables

У меня проблема, которую я не могу объяснить с помощью SSH и iptables. Короче говоря: если я подключен к удаленному хосту (работающий под управлением Ubuntu 18.04) с помощью SSH и выполняю скрипт для применения правил iptables, я теряю запущенную сессию SSH. Я могу подключиться снова, но моя запущенная сессия теряется.

Скрипт сбрасывает правила iptables с помощью команды netfilter-persistent flush, а затем применяет этот набор правил в iptables-saveформате:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -s x.x.x.x/XX -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j LOG --log-prefix "INPUT DROP: "
-A FORWARD -j LOG --log-prefix "FORWARD DROP: "
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state INVALID -j DROP
-A OUTPUT -d x.x.x.x/XX -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p udp -m udp --dport 123 -j ACCEPT
-A OUTPUT -d x.x.x.x/32 -p tcp -m tcp --dport 3128 -j ACCEPT
-A OUTPUT -j LOG --log-prefix "OUTPUT DROP: "
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

После завершения скрипта мой сеанс теряется, и я вижу заблокированные пакеты SSH в обоих направлениях в /var/log/kern.log. Это имело бы смысл, если бы информация об отслеживании соединения была потеряна, но я все еще могу установить соединение conntrack -L(сервер — это виртуальная машина, поэтому я могу проверить, даже если мое соединение SSH потеряно).

Что еще более странно, если я это сделаю netfilter-persistent flush && ./myscript, мое соединение сохранится; но если я запущу две команды одну за другой, я потеряю соединение. Также, если я запущу две команды на VM TTY, я не потеряю соединение.

Может ли кто-нибудь объяснить такое поведение?

решение1

Ваша политика по умолчанию установлена ​​на «DROP».

Таким образом, в период между очисткой и добавлением правил ни один пакет не принимается, и вы теряете соединение...

Если ваш скрипт не добавляет правила, вам конец.

Вам следует установить политику принятия и добавить правило в конце (каждой цепочки), чтобы отбрасывать все, что не совпало...

Связанный контент