У меня проблема, которую я не могу объяснить с помощью 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».
Таким образом, в период между очисткой и добавлением правил ни один пакет не принимается, и вы теряете соединение...
Если ваш скрипт не добавляет правила, вам конец.
Вам следует установить политику принятия и добавить правило в конце (каждой цепочки), чтобы отбрасывать все, что не совпало...