Configurando o Iptables no CentOS 6 bloqueia-me

1

Estou executando o seguinte script bash como root para configurar o iptables (estou logado via SSH):

#!/bin/bash

# Delete all existing rules
iptables --flush

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Allow port 80 (http)
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

# Allow port 443 (https)
iptables -A INPUT -p tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

# Allow port 8443
iptables -A INPUT -p tcp --sport 8443 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 8443 -j ACCEPT

# Allow port 22 (ssh)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --sport 22 -j ACCEPT

# Allow port 25 (smtp)
iptables -A INPUT -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT

# Allow port 110 (pop)
iptables -A INPUT -p tcp --sport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT

# Allow port 995
iptables -A INPUT -p tcp --sport 995 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 995 -j ACCEPT

# Allow port 143 (imap)
iptables -A INPUT -p tcp --sport 143 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 143 -j ACCEPT

# Allow port 993
iptables -A INPUT -p tcp --sport 993 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 993 -j ACCEPT

# Allow port 465 (smtp)
iptables -A INPUT -p tcp --sport 465 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 465 -j ACCEPT

# Allow port 8447
iptables -A INPUT -p tcp --sport 8447 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 8447 -j ACCEPT

# Ping rate limit (from outside)
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j REJECT
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j REJECT
iptables -A INPUT -p icmp -m icmp -m limit --limit 1/second -j ACCEPT

# Prevent DoS attack
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

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

# User feedback
service iptables save
echo "Rules set, restarting iptables..."
service iptables restart
echo "Finished configuring iptables"

O script é executado e me tira imediatamente do SSH - todas as portas também são fechadas (80, 443, 21, etc). Se eu alterar as políticas de cadeia padrão para:

# Set default chain policies
iptables -P INPUT REJECT
iptables -P FORWARD REJECT
iptables -P OUTPUT REJECT

Funciona bem e posso entrar pela porta 80 e SSH (22). NO ENTANTO, executar iptables --list mostra o seguinte:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:pcsync-https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:smtp
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:pop3
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:pop3s
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:imap
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:imaps
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:urd
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:8447
REJECT     icmp --  anywhere             anywhere            icmp address-mask-request reject-with icmp-port-unreachable
REJECT     icmp --  anywhere             anywhere            icmp timestamp-request reject-with icmp-port-unreachable
ACCEPT     icmp --  anywhere             anywhere            icmp any limit: avg 1/sec burst 5
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http limit: avg 25/min burst 100
ACCEPT     all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:pcsync-https
ACCEPT     udp  --  anywhere             anywhere            udp spt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:pop3
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:pop3s
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imap
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imaps
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:urd
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:8447
ACCEPT     all  --  anywhere             anywhere

... todas as políticas padrão estão definidas como ACCEPT. Alguém pode me dizer por que isso está acontecendo?

    
por Jongosi 26.01.2013 / 13:40

3 respostas

13

Você tem muitos, muitos erros em suas regras. De deixar o sport / dport errado para especificar o udp em vez do TCP. Você também está esquecendo o DNS. A reinicialização do iptables do serviço também é desnecessária.

Esqueça todas as regras de saída, apenas tenha uma regra que permita todo o tráfego de saída em conexões estabelecidas na parte superior de INPUT e OUTPUT.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 

Em seguida, adicione apenas regras ao INPUT e use dport naqueles, não no esporte.

E adicione uma regra de saída para o dns fazer com que o correio e o ssh funcionem novamente. Mais uma vez, use dport.

Os limites de ping são inúteis . Eles não impedem um DOS / DDOS: os pacotes ainda chegam ao seu servidor. Então não se incomode com isso. E IMHO limites de taxa de http devem ser tratados no aplicativo, não o firewall, mas isso é mais opinião do que fato.

    
por 26.01.2013 / 14:36
7

Entre outras coisas, esta linha

iptables -A OUTPUT -p udp --sport 22 -j ACCEPT

é o seu problema. Você está apenas permitindo pacotes UDP na porta 22. Deve ser

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
    
por 26.01.2013 / 14:36
0

Outra falha em suas regras é que os erros muito grandes do ICMP não são excluídos.

    
por 15.06.2014 / 01:20