Por que o ip6tables -A INPUT -j DROP bloqueia as conexões do servidor de saída

3

Estou disposto a configurar o iptables & ip6tables para IPv6. Mas por alguma razão desconhecida última ip6tables regra no meu bloco de configuração qualquer conexão de saída para o meu servidor (apt-get, wget, ping, ping6 etc.). Servidor é Debian 8.1, este é um droplet DO com IPv6 configurado.

Aqui está a configuração:

#!/bin/sh
# Flush all existing first
sudo iptables -F

# Disable tracking
sudo iptables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK
sudo iptables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK
sudo iptables -t raw -I OUTPUT -p tcp --dport 80 -j NOTRACK
sudo iptables -t raw -I OUTPUT -p tcp --dport 22 -j NOTRACK

# Local
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

# DNS
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT

# Custom rules
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Allow ping from inside
sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# Allow ping from outside
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

# Drop everything else
sudo iptables -A INPUT -j DROP

# IPv6

# Flush all existing first
sudo ip6tables -F

# Disable tracking
sudo ip6tables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK
sudo ip6tables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK
sudo ip6tables -t raw -I OUTPUT -p tcp --dport 80 -j NOTRACK
sudo ip6tables -t raw -I OUTPUT -p tcp --dport 22 -j NOTRACK

# Local
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A OUTPUT -o lo -j ACCEPT

# DNS
sudo ip6tables -A INPUT -p udp --dport 53 -j ACCEPT
sudo ip6tables -A OUTPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT

# Custom rules
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT

# Allow ping from inside
sudo ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT

# Allow ping from outside
sudo ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
sudo ip6tables -A OUTPUT -p icmpv6 --icmpv6-type echo-reply -j ACCEPT

# Drop everything else
sudo ip6tables -A INPUT -j DROP

Se eu excluir esta última regra (ip6tables -A INPUT -j DROP), tudo está funcionando bem. Qual poderia ser o problema?

UPD. Obrigado àqueles que responderam informações valiosas sobre todo o conjunto de regras. No caso de alguém precisar da configuração que está funcionando agora, isso é para um servidor web básico com 80 e 22 portas abertas, sem estado (para aplicativos de alto tráfego):

#!/bin/sh
# Flush all existing first
sudo iptables -F

# Local
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

# Allow outbound DNS
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT  -p udp --sport 53 -j ACCEPT

# Allow inbound HTTP (apt-get, wget etc.)
sudo iptables -A INPUT -p tcp --sport 80 -j ACCEPT

# Custom rules
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Allow ICMP
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A OUTPUT -p icmp -j ACCEPT

# Drop everything else
sudo iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

# IPv6

# Flush all existing first
sudo ip6tables -F

# Local
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A OUTPUT -o lo -j ACCEPT

# Allow outbound DNS
sudo ip6tables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo ip6tables -A INPUT  -p udp --sport 53 -j ACCEPT

# Allow inbound HTTP (apt-get, wget etc.)
sudo ip6tables -A INPUT -p tcp --sport 80 -j ACCEPT

# Custom rules
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT

# Allow ICMP
sudo ip6tables -A INPUT -p icmpv6 -j ACCEPT
sudo ip6tables -A OUTPUT -p icmpv6 -j ACCEPT

# Drop everything else
sudo ip6tables -A INPUT -j REJECT --reject-with icmp6-adm-prohibited
    
por uiwe83 27.06.2015 / 12:27

2 respostas

7

A regra não está bloqueando as conexões de saída. No entanto, está deixando cair as respostas enviadas para todas as suas conexões de saída.

Essa não é a única falha em suas regras. Você está descartando muitos pacotes ICMPv6, que são necessários para a operação correta. Além disso, deixar cair os pacotes em silêncio não é uma boa prática, pois dificultará a depuração dos problemas e introduzirá problemas adicionais que não existiriam se você estivesse enviando as mensagens de erro adequadas.

Para corrigir o primeiro problema, é necessário ativar o rastreamento de conexão para que as respostas às conexões de saída sejam permitidas. Avalie cuidadosamente as conexões de saída necessárias e decida sobre um conjunto de regras sem estado para permitir a correspondência de tráfego de entrada. esse tráfego de saída.

Para corrigir o segundo problema, é necessário permitir que todas as mensagens de erro ICMPv6 sejam recebidas, assim como a descoberta de vizinhos.

Para corrigir o terceiro problema, use REJECT --reject-with icmp6-adm-prohibited em vez de DROP .

    
por 27.06.2015 / 13:00
1

Os únicos pacotes permitidos no INPUT (IPv6) são:

  • tudo em lo
  • UDP com porta de destino 53
  • TCP com porta de destino 80
  • TCP com porta de destino 22
  • Resposta de eco do tipo ICMPv6

Na prática, você está bloqueando todos os outros pacotes de entrada, incluindo respostas aos seus pacotes de saída. Você deve procurar em "stateful firewalling" usando o módulo "state". Veja link para alguns exemplos.

Você também está bloqueando muito o ICMPv6. O anúncio do roteador e a descoberta neigbor são exemplos de ICMPv6 que provavelmente precisarão.

    
por 27.06.2015 / 13:06

Tags