ip6tables bloqueando o tráfego de saída

2

Meu OpenVZ VPS está bloqueando o tráfego IPv6 de saída, mas filtrando corretamente o tráfego IPv6 de entrada.

Abaixo está meu script ip6tables-restore.

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 51413 -j ACCEPT
-A INPUT -p udp -m udp --dport 51413 -j ACCEPT
-A INPUT -m limit --limit 5/min
-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
-A FORWARD -j ACCEPT
-A OUTPUT -j ACCEPT
COMMIT

O tráfego ICMPv6 ainda consegue passar tanto de entrada quanto de saída.

Quando eu libero essas regras usando -F , o tráfego de saída flui bem.

O que estou perdendo aqui?

EDIT: Parece que ip6tables está marcando pacotes ESTABLISHED como INVALID. Consequentemente, o tráfego de saída NÃO está sendo bloqueado. Os pacotes de resposta não são permitidos na entrada novamente, portanto, aparecem como tráfego de saída bloqueado. Permitir a entrada de pacotes INVALID resolve o problema de saída, mas também torna o filtro de entrada inútil.

    
por jmccrohan 29.06.2011 / 18:27

4 respostas

5

Qual versão do kernel você está usando, as versões mais antigas não tinham suporte a firewall stateful conntrack no netfilter para IPv6, portanto a regra para permitir o tráfego RELATED, ESTABLISHED não funcionaria e você precisaria permitir! --syn -dport 1024: 65535 e tráfego udp.

Você pode precisar especificar o módulo de estado ao permitir o tráfego, por exemplo, aqui está uma configuração de um host RHEL6 que funciona.

ip6tables -t filter -F INPUT
ip6tables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -t filter -A INPUT -p ipv6-icmp -j ACCEPT
ip6tables -t filter -A INPUT -i lo -j ACCEPT
ip6tables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
ip6tables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
ip6tables -t filter -A INPUT -j LOG --log-prefix=v6_input_deny --log-level=4
ip6tables -t filter -A INPUT -j REJECT --reject-with icmp6-adm-prohibited
    
por 29.06.2011 / 20:23
2

Parece que você está usando o CentOS5 ou outra variante do RHEL5.

O rastreamento de conexão do Netfilter no RHEL5 está quebrado e nunca será corrigido . Como resultado, a regra típica do iptables como -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT não funcionará e o ip6tables / connfilter simplesmente os considerará 'INVÁLIDOS'. No exemplo a seguir, observe como o Netfilter marca erroneamente pacotes válidos como 'INVALID' em vez de 'ESTABLISHED':

# ip6tables-save |grep state
-A INPUT -s ::/0 -d ::/0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -s ::/0 -d ::/0 -m state --state INVALID -j ACCEPT 
# curl -6 www.google.com >/dev/null 2>&1

# ip6tables --list --numeric -v
...
Chain INPUT (2 references)
 pkts bytes target     prot opt in     out     source               destination         
0     0 ACCEPT     all      lo     *       ::/0                 ::/0               
3   208 ACCEPT     icmpv6   *      *       ::/0                 ::/0               
0     0 ACCEPT     ah       *      *       ::/0                 ::/0               
0     0 ACCEPT     all      *      *       ::/0                 ::/0               state RELATED,ESTABLISHED 
61 65747 ACCEPT    all      *      *       ::/0                 ::/0               state INVALID 

Se você executar tcpdump para o tráfego IPv6, verá o pacote 'SYN' para o host remoto, o pacote de resposta 'SYN-ACK' do host remoto. Neste ponto, com as ip6tables padrão, o pacote não corresponderá a nenhuma regra existente e, portanto, cairá na última regra --- -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited .

Por que diabos esses pacotes são INVÁLIDOS? É um bug nessa versão do Red Hat, e nunca foi corrigido.

Como solução alternativa, você pode tentar ignorar SYN de entrada , que dificulta o problema de rastreamento de conexão:

-A INPUT -s ::/0 -d ::/0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp ! --syn -s 2001:1:1:1::/48 -j ACCEPT

Opcionalmente, algumas pessoas também aceitam pacotes UDP:

-A RH-Firewall-1-INPUT -p udp -m udp

Mas em algum momento isso começa a parecer um risco à segurança. Se você está aceitando todo o tráfego assim, por que se preocupar com um firewall?

    
por 11.11.2014 / 23:09
0

Você precisa aceitar tráfego tcp, sctp e udp


-A OUTPUT -p tcp -j ACCEPT 
-A OUTPUT -p udp -j ACCEPT 
-A OUTPUT -p sctp -j ACCEPT
    
por 29.06.2011 / 20:11
0

Tente substituir

-A INPUT -p ipv6-icmp -j ACCEPT

com

-A INPUT -p icmpv6 -j ACCEPT

O ICMP é muito mais central para o IPv6 do que para o IPv4, e o acima é o que eu tenho no meu script ip6tables local.

    
por 30.06.2011 / 01:36