Tenho um problema que não consigo explicar apenas com SSH e iptables. Resumindo: se eu estiver conectado em um host remoto (executando Ubuntu 18.04) com SSH e executar um script para aplicar regras de iptables, perco minha sessão SSH em execução. Consigo me conectar novamente, mas minha sessão em execução foi perdida.
O script libera as regras do iptables com o comando netfilter-persistent flush
e então aplica este conjunto de regras no iptables-save
formato:
*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
Após a conclusão do script, minha sessão é perdida e posso ver pacotes SSH bloqueados em ambas as direções no arquivo /var/log/kern.log
. Isso faria sentido se as informações de rastreamento da conexão fossem perdidas, mas ainda posso conectar-me conntrack -L
(o servidor é uma VM, para que possa verificar mesmo quando minha conexão SSH for perdida).
O mais estranho é que se eu fizer isso netfilter-persistent flush && ./myscript
, minha conexão será mantida; mas se eu executar os dois comandos um após o outro, perco a conexão. Além disso, se eu executar os dois comandos no VM TTY, não perco minha conexão.
Alguém pode explicar esse comportamento?
Responder1
Sua política padrão está definida como "DROP".
Então, no intervalo entre a liberação e a adição das regras, nenhum pacote é aceito e você perde a conexão...
Se o seu script não conseguir adicionar as regras, você está ferrado.
Você deve definir a política para aceitar e adicionar uma regra no final (de cada cadeia) para descartar tudo o que não foi correspondido...