Problemas com IPtables - Assistência apreciada

Problemas com IPtables - Assistência apreciada

Estou tentando criar um firewall para meu Raspberry Pi. As regras que eu quero são

  1. Permitir SSH de entrada - isso funciona

  2. Permitir ssh de saída - isso NÃO funciona e é meu principal problema

  3. Permitir VNC de entrada e saída - atualmente isso funciona onde consigo me conectar, mas não consigo realizar nenhuma ação. Não é realmente uma prioridade
  4. Permitir https de saída - posso visitar um site, mas acho que preciso adicionar outra linha para DNS para que funcione corretamente na inicialização.
  5. Permitir e-mails enviados - isso funciona
  6. Permitir pings de saída e obter uma resposta – isso funciona
  7. Abandone todo o resto - acho que isso funciona porque não consigo fazer SSH de saída, então acredito que o problema está na minha regra.

Eu sei que meu ssh funciona em geral, pois sem o firewall carregado posso fazer um SSH de saída de um pi para outro.

    #!/bin/sh

    #Flush all rules
    iptables -F

    #Allow incoming and outgoing SSH
    sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A OUTPUT  -p tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

    #Allow VNC sessions
    sudo iptables -A INPUT -s 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -j ACCEPT
    sudo iptables -A OUTPUT -d 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --sports 5900:5905,6000:6005 -j ACCEPT

    #Accept only incoming etstablished and allow new or established outgoing
    sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    #Accept port 587 for email
    sudo iptables -A INPUT -p tcp --sport 587 -j ACCEPT
    sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

    #Allow ping requests to go out and get a reply
    sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

    #Drop all other packets and protocols
    sudo iptables -P INPUT DROP
    sudo iptables -P FORWARD DROP
    sudo iptables -P OUTPUT DROP

Responder1

Seu problema com a linha SSH é que você está tentando permitir a porta de origem 22da sua máquina local. Porém, quando você se conecta a um servidor SSH remoto sua máquina não utiliza a porta 22 para isso. Está usando uma porta aleatória, geralmente no intervalo de portas mais alto. Isso faz sentido porque se você usasse a porta 22 para conexões SSH de saída, você só poderia se conectar a um servidor SSH por vez.

Para corrigir isso, a maneira mais simples é usar --dportem vez de --sport, permitindo todas as conexões que tenham uma porta de destino 22(ssh).

sudo iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Observe que você deveadicionaresta linha em vez de substituí-la, como @bcs78 apontou nos comentários.

Geralmente também é uma má ideia bloquear o tráfego da conexão de loopback interno. Alguns programas dependem desta conexão e não funcionarão corretamente sem ela. Adicione isto ao início do seu script:

sudo iptables -A INPUT -i lo -j ACCEPT

Responder2

Adicione, uma vez por cadeia, um pega-tudocom estadoregra que simplificará a maioria das outras regras:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Além da regra usual lode interface para permitir todos os serviços locais, remova-a se achar que realmente não é necessária:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Agora você não precisa duplicar suas outras regras (estou deixando o NEWestado quando ele estava lá, mesmo que não seja muito útil e não estivesse presente de forma consistente):

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 10.10.10.1 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.0.150 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT

iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

Tudo é resolvido pelas duas primeiras regras, não há necessidade de duplicar todas as regras, e agora a direção inicial do fluxo está clara: INPUTou OUTPUT, apenas uma vez. Portanto, fica mais claro que o --sport 22for SSH não estava ajudando no caso de saída ( --dport 22é necessário). RELATEDteria sido útil se houvesse regras para respostas de erros udprelacionados . icmpNesta configuração, pode não ser necessário.

informação relacionada