Como todos vocês provavelmente sabem, o cache de rota do ipv4 foi removido na série de kernel 3.6 do Linux, que teve um sério impacto no roteamento de caminhos múltiplos. O código de roteamento IPv4 (diferente do IPv6) seleciona o próximo salto de maneira round-robin; portanto, os pacotes do IP de origem especificado ao IP de destino nem sempre passam pelo mesmo salto seguinte. Antes da versão 3.6, o cache de roteamento estava corrigindo essa situação, pois o próximo salto, uma vez selecionado, permanecia no cache, e todos os pacotes adicionais da mesma fonte para o mesmo destino estavam passando pelo próximo salto. Agora, o próximo salto é re-selecionado para cada pacote, o que leva a coisas estranhas: com 2 rotas padrão de custo igual na tabela de roteamento, cada uma apontando para um provedor de internet, nem consigo estabelecer conexão TCP, porque o SYN inicial e o ACK final percorrer diferentes rotas,
Existe alguma maneira relativamente fácil de restaurar o comportamento normal do roteamento de caminhos múltiplos, para que o próximo salto seja selecionado por fluxo e não por pacote? Existem patches para fazer a seleção do próximo salto do IPv4 baseada em hash, como é para o IPv6? Ou como vocês lidam com isso?
ip ro add 8.8.8.8/32 nexthop via 1.2.3.4 nexthop via 1.2.3.5
: essa suposição correta?Respostas:
Se possível, atualize para o Linux Kernel> = 4.4 ....
O roteamento de caminhos múltiplos baseado em hash foi introduzido, o que de muitas maneiras é melhor que o comportamento anterior à 3.6. É baseado no fluxo, utilizando um hash dos IPs de origem e destino (as portas são ignoradas) para manter o caminho estável para conexões individuais. Uma desvantagem é que acredito que havia vários modos de algoritmo / configuração disponíveis antes da versão 3.6, mas agora você recebe o que recebe! Você pode usar afetar a escolha do caminho
weight
.Se você estiver na minha situação , realmente deseja o,
3.6 >= behaviour < 4.4
mas ele não é mais suportado.Se você atualizar para> = 4.4, isso deve funcionar, sem todos os outros comandos:
Como alternativa por dispositivo:
fonte
"Relativamente fácil" é um termo difícil, mas você pode
Houve uma discussão na lista de discussão netfilter sobre este tópico, onde estou roubando as listagens de:
1. Regras de roteamento (RPDB e FIB)
2. Regras de firewall (usando o ipset para forçar um modo LB "de fluxo")
Você pode seguir a discussão da lista de discussão netfilter para algumas variações dos itens acima.
fonte
u32
obter parâmetros importantes hash e, em seguida, "rótulo" atribuído paraip rule
'sipset
- apenas cria conjuntos que são preenchidos usando--add-set
e comparados com o uso--match-set
- mas isso é principalmente para as conexões no estado NOVO. Para conexões de estado ESTABELECIDO, a marca é carimbada nos pacotes usando o--restore-mark
parâmetro doCONNMARK
alvo - esta diretiva está copiando a marca da conexão no pacote. A marca da conexão é definida anteriormente usando-se--save-mark
naPOSTROUTING
cadeia (por onde os pacotes pertencentes a NOVAS conexões passariam). O roteiro parece excessivamente complicado para mim, mas transmite a ideia.