Estou tentando criar um firewall para meu Raspberry Pi. As regras que eu quero são
Permitir SSH de entrada - isso funciona
Permitir ssh de saída - isso NÃO funciona e é meu principal problema
- 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
- 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.
- Permitir e-mails enviados - isso funciona
- Permitir pings de saída e obter uma resposta – isso funciona
- 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 22
da 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 --dport
em 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 lo
de 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 NEW
estado 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: INPUT
ou OUTPUT
, apenas uma vez. Portanto, fica mais claro que o --sport 22
for SSH não estava ajudando no caso de saída ( --dport 22
é necessário). RELATED
teria sido útil se houvesse regras para respostas de erros udp
relacionados . icmp
Nesta configuração, pode não ser necessário.