Estou apenas começando com o iptables e me deparei com algo que eu realmente não entendo.
Para sua informação, segui as instruções do IptablesHowTo do wiki do Ubuntu .
As tabelas nat e mangle estão vazias, estou trabalhando apenas com a tabela de filtros no momento.
O problema
Se eu adicionar as seguintes regras do iptables:
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -j DROP
... então ainda tenho acesso à minha máquina via ssh, no entanto, todos os comandos do iptables levam cerca de um minuto ou dois para serem executados. Não é um problema de DNS, -n
não o altera.
A solução
Se eu liberar a tabela e adicionar essas três regras, tudo estará funcionando bem:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -j DROP
Alguém pode me explicar por que a primeira regra tem um impacto tão grande no iptables? Entendo que ele permite que sessões estabelecidas recebam tráfego, mas por que eu preciso se o ssh estiver aberto?
sudo
faz pesquisas de DNS e, se estiverem bloqueadas, o comando será lento. Todos os seus outrosiptables
comandos são prefixadossudo
?sudo strace …
(a partir de um shell raiz) para ver o que está bloqueando.Respostas:
Ele está realizando uma pesquisa de DNS e, como a resposta está bloqueada, leva um tempo para expirar.
Tente fazer o iptables -n ... para impedir a pesquisa de DNS.
O conntrack permite que as conexões sejam recebidas na porta efêmera criada para respostas a solicitações iniciadas por sua máquina (nesse caso, a solicitação de DNS). Sem permitir conexões ESTABELECIDAS ou RELACIONADAS, mesmo as respostas às suas solicitações são bloqueadas.
EG: Se você tentar acessar um site, mesmo que possa enviar a solicitação, a resposta do site será bloqueada.
fonte
Com
sua máquina descartará cada pacote recebido, a menos que venha da porta SSH. É uma boa ideia se você deseja que essa máquina se comunique apenas via SSH. Caso contrário, você precisará adicionar
isso garantirá que você se conecte a algum servidor da Web em vez de se conectar de alguém.
fonte
-m conntrack
você, poderá ter outra "chance" de os pacotes serem aceitos antes de serem descartados, com certeza. Na máquina do cliente, você precisa teriptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
se quiser ver alguma resposta. No lado do servidor, apenas permita a conexão de entrada SSH e elimine todo o resto (se o servidor atuar apenas como um SSH). Espero que tudo esteja claro.