Vários túneis GRE no mesmo host, somente um encaminha pacotes de entrada

4

Estou tendo um problema de roteamento no CentOS 6.2 (kernel 2.6.32-220)

Aqui está a configuração: Um host está na minha rede local. Está falando para dois hosts quase idênticos em um local remoto. Os dois remotos hosts estão em todas as mesmas redes, agindo como backups redundantes um para o outro.

Eu configurei dois túneis GRE do host local, um para cada host remoto:

ip tunnel add name tunnel1 mode gre local 10.2.1.2 remote 10.2.1.1
ip link set dev tunnel1 up
ip route add 172.16.1.0/24 dev tunnel1 metric 101

ip tunnel add name tunnel2 mode gre local 10.2.1.4 remote 10.2.1.3
ip link set dev tunnel2 up
ip route add 172.16.1.0/24 dev tunnel2 metric 102

Pacotes de saída são encaminhados corretamente, sem problemas. Pacotes recebidos são esquisitos. Parece que qualquer túnel tem a rota com a métrica mais alta (tunnel2 no exemplo acima) ignorar pacotes recebidos. Eles vêm bem e podem ser visto na máquina local com 'tcpdump -i tunnel2', mas eles não são encaminhados adequadamente para as redes locais. Eles são simplesmente desistiu. Eu posso mudar as duas métricas, e então tunnel1 Solte todos os pacotes recebidos. O túnel com a rota mais baixa A métrica roteará os pacotes adequadamente, tanto de entrada quanto de saída.

Isso está "funcionando como planejado?" O que eu gostaria de ter acontecido claro, é para todos os pacotes em ambos os túneis para ser corretamente encaminhado. Isso é possível?

Atualização rápida: Uma pessoa sugeriu (não sei por que) adicionar parâmetros 'key' aos comandos 'ip tunnel'. Eu tentei isso, ambos com chaves diferentes para cada túnel e com chaves idênticas para ambos os túneis, mas nenhum dos testes teve efeito.

    
por Rick Koshi 11.02.2012 / 11:56

1 resposta

3

Graças à lista de discussão netdev, tenho uma resposta. Há um recurso que eu nunca ouvi falar, chamado de "filtragem de caminho inverso". Quando ativado, esse recurso de roteamento do kernel descartará silenciosamente pacotes de entrada se eles chegarem em uma interface diferente da interface que seria usada pelos pacotes de saída para o endereço de origem. Ele é um recurso de segurança e é um bom padrão na maioria das circunstâncias, especialmente quando você não tem o iptables configurado com cuidado.

O CentOS (e presumivelmente o RHEL) ativa a filtragem de caminho reverso por padrão em /etc/sysctl.conf (net.ipv4.conf.default.rp_filter = 1). Eu adicionei os seguintes comandos ao meu script de configuração:

echo 0 > /proc/sys/net/ipv4/conf/tunnel1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/tunnel2/rp_filter

Isso desativa a filtragem de caminho inverso para as duas pseudointerfaces e tudo funciona agora.

Note que adicionar ao sysctl.conf para minhas interfaces específicas não teria funcionado para mim, já que essas interfaces são criadas "on the fly", e o sysctl.conf é lido apenas no momento da inicialização. Eu poderia, é claro, ter alterado o padrão em sysctl.conf, mas não queria desativar o recurso para minhas outras interfaces.

    
por 12.02.2012 / 01:12