O objetivo deste script é permitir apenas o tráfego pela VPN, exceto o localhost <-> localhost e o tráfego SSH de entrada. Mas quando executo o script no SSH, sou desconectado e forçado a reiniciar o vm. O que há de errado com o meu script?
#!/bin/bash
iptables -F
#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT
#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
Sua
#SSH
regra implica que ssh é uma forma de comunicação unidirecional, que não é. Os dados estão sendo enviados e retornados.A maneira normal de lidar com isso, já que você não pode saber o número da porta no lado do cliente com antecedência, é permitir conexões consideradas "estabelecidas" ou "relacionadas" a uma conexão estabelecida. Para fazer isso, você precisa:
Antes de suas
DROP
regras (e de preferência na parte superior, pois as regras são processadas em ordem e essas duas se aplicam à maioria dos pacotes).Há uma explicação de como uma conexão TCP se torna ESTABELECIDA aqui ; essencialmente, o fato de o servidor responder ao pacote permitido por sua
#SSH
INPUT
regra o faz.fonte
-p tcp
fazer alguma diferença nesse sentido, e veja a explicação subsequente para o UDP nessa página (é a mesma). O ponto é que o servidor responde sem saber se o iptables permitirá ou não, e quando o iptables recebe essa resposta do servidor no sistema local , agora ele vê tráfego nas duas direções (mesmo que o cliente ainda não o tenha), considera a conexão estabelecida e deixa a resposta sair. O "tecnicismo" aqui depende do firewall estar no meio das duas partes.