Desativando rp_filter em uma interface

9

Eu tenho um servidor Ubuntu 16.04 que está atuando como um roteador com várias interfaces (VLAN). Por padrão, rp_filter(filtro de caminho reverso) está ativado para todas as interfaces. Quero mantê-lo assim, mas faça uma exceção para exatamente uma interface. (Os pacotes desta interface devem ter um endereço IP de origem que não corresponda a nenhum endereço de destino de roteamento dessa interface.)

Digamos que essa interface tenha o nome ens20.4, seu dispositivo vlan-raw- ens20e a interface de destino (para testar o fluxo de pacotes) seja nomeada ens20.2(embora deva funcionar para qualquer interface de destino).

Tentei definir a rp_filterpropriedade ens20.4apenas, sem sucesso:

echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

Portanto, para fins de teste, eu também desabilitei rp_filtero dispositivo vlan-raw-e a interface de destino do teste:

echo 0 > /proc/sys/net/ipv4/conf/ens20/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.2/rp_filter

Ainda sem sucesso, os pacotes com um endereço IP de origem "falsificado" ainda são descartados. Somente se eu desativar rp_filterpara todas as interfaces, os pacotes passarão:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

No entanto, ainda quero manter o caminho inverso filtrando para todas as outras interfaces - o que estou perdendo?

Cybran
fonte
Mais testes revelaram que a filtragem de caminho reverso está ativa se rp_filter estiver definido como 1 para toda ou para a interface de entrada. Ainda estou procurando uma resposta definitiva ou uma referência à documentação, que não consegui encontrar até agora.
precisa

Respostas:

12

Informações aqui: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/Documentation/networking/ip-sysctl.txt?h=v4.9#n1090

Observe a última frase que explicaria suas tentativas:

O valor máximo de conf / {all, interface} / rp_filter é usado ao fazer a validação de origem na {interface}.

Portanto, isso deve funcionar:

for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > "$i"
done
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

Agora max (conf / {all, ens20.4} / rp_filter == 0: sem validação de fonte. Verifique novamente se as outras interfaces ainda estão protegidas.

Você também pode verificar o rpf "loose" com o valor 2. Caso o pacote deva ser roteado normalmente por outra interface, isso seria melhor do que nenhuma validação.

AB
fonte
2
Obrigado, isso explica muito bem! Um agradecimento especial pela sugestão "frouxa" de rpf, que é realmente a melhor escolha para minha configuração. Também torna desnecessário definir all / rp_filter como 0, o que é bem-vindo.
precisa