Eu estava tentando encontrar informações sobre regras de saída e iptables, mas as informações estavam incompletas ou imprecisas. Depois de cavar um pouco e desconectar minha sessão ssh algumas vezes, percebi e pensei em compartilhá-la no ServerFault.
As regras de saída são essenciais para qualquer política de segurança e necessárias para atender a muitos padrões de segurança (como o PCI DSS).
NOTA: Os comandos aqui assumem uma distribuição baseada no Debian (por exemplo, servidor Ubuntu). Os comandos do iptables devem ser os mesmos em todas as distribuições, mas verifique o guia de referência da sua própria distribuição para saber como salvar e carregar o iptables, já que essas etapas variam. Se alguém quiser wikify isso e adicionar RH ou outras diferenças dist, vá em frente.
No exemplo abaixo, configuraremos regras bastante comuns para um servidor que só precisa receber atualizações de pacote. Lembre-se que estes são comandos que diferenciam maiúsculas e minúsculas, e também que a ordem que você digita é a ordem em que são avaliados (isto é, se você estiver conectando por SSH, não faça o -A OUTPUT -j REJECT primeiro).
Conjunto de regras de amostra
sudo iptables -A OUTPUT -o lo -p all -j ACCEPT
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -j REJECT
IMPORTANTE: Não adicione as regras security.ubuntu.com ou us.archive.ubuntu.com, a menos que você faça uma entrada /etc/hosts
para elas. Tenha em mente que o iptables irá avaliar o IP para esses endereços no momento em que a regra é aplicada. Portanto, se o Ubuntu alterar esses endereços, você precisará recriar essas regras ou reiniciar o computador (as regras são aplicadas na inicialização).
Vamos dar uma olhada em cada uma dessas regras:
Regra de interface local
sudo iptables -A OUTPUT -o lo -p all -j ACCEPT
Isso está adicionando uma entrada dizendo que devemos aceitar qualquer tráfego que queira ir para a interface local (127.0.0.1). Alguns aplicativos usam essa interface para trocar informações e não queremos violá-los.
Regra do Sauce Secreto (Sessões Estabelecidas / Relacionadas)
sudo iptables -A OUTPUT -m state --state RELATED, ESTABLISHED -j ACCEPT
Esta é a regra que muitas vezes é esquecida, levando a sessões desconectadas e confusão. O que isso significa é permitir tráfego de saída associado a uma sessão já estabelecida ou relacionada a uma sessão estabelecida. Por exemplo, se você tiver SSH em seu servidor, poderá abrir a porta 22 de entrada, mas como o servidor enviará os dados de volta aos clientes (isso pode até sugerir uma porta superior alternativa para as comunicações subseqüentes)? Isso é o que essa regra permite.
Permitindo o Ubuntu apt-get update
sudo iptables -A OUTPUT -p tcp --dport 80 -d security.ubuntu.com -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 80 -d us.archive.ubuntu.com -j ACCEPT
Essas regras simplesmente dizem ao iptables para permitir o tráfego que vai para a porta 80 dos servidores de atualização do Ubuntu. Estes podem ser diferentes dependendo da sua região, e pode haver mais, então você terá que fazer um apt-get update
depois de fazer isso para ter certeza de que funciona para você. IMPORTANTE: Como mencionei antes, NÃO ative essa regra sem primeiro colocar uma entrada mapeando os IPs apropriados em /etc/hosts
. Além disso, se o Ubuntu alterar esses IPs, você precisará atualizar sua entrada de hosts E reiniciar ou recriar essas regras, já que o iptables avalia os endereços quando a regra é aplicada.
A regra "Assassino"
sudo iptables -A OUTPUT -j REJECT
Esta é a regra que mata todo o tráfego restante. Esta deve ser definitivamente a última regra da sua cadeia, ou as outras regras não funcionarão.
Não se esqueça de fazer:
sudo sh -c “iptables-save >/etc/iptables.rules”
se você quiser manter as regras e adicionar:
pre-up iptables-restore < /etc/iptables.rules
na interface (eth0 ou qualquer outro) em /etc/network/interfaces
.
Outras regras de saída
Para permitir que o "ping" funcione (no servidor):
sudo iptables -A OUTPUT -p icmp --icmp echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp echo-reply -j ACCEPT
Para permitir que o DNS funcione (no servidor):
sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
(fique à vontade para adicionar)