OpenVPN: Como atenuar os problemas de MTU no caminho por cliente?

14

Temos dezenas de dispositivos incorporados instalados nos clientes, todos ligando para o nosso serviço OpenVPN. Isso funciona bem em geral, mas alguns de nossos clientes têm problemas graves no MTU do caminho. Nossa influência nos clientes para consertar suas redes é limitada, por isso precisamos do OpenVPN para lidar com isso. Em poucas palavras, minha pergunta é:

Como posso mitigar as MTUs de caminho baixo de alguns clientes em uma base por cliente, ou seja, sem usar configurações globais que acomodem o pior caso para todos os clientes

Observe que, no nosso pior caso, é muito ruim: o caminho MTU 576, solta todos os fragmentos, não se fragmenta, não respeita o DF-bit. Você vê por que eu preferiria não resolver esse problema globalmente.

A página de manual do OpenVPN oferece várias opções relacionadas ao MTU, principalmente --link-mtu, --tun-mtu, --fragment and --mssfix. Mas também diz

--link-mtu [...] É melhor não definir esse parâmetro, a menos que você saiba o que está fazendo.

--tun-mtu [...] É melhor usar as opções --fragment e / ou --mssfix para lidar com problemas de dimensionamento do MTU.

Então comecei a experimentar --fragmente --mssfixlogo percebi que pelo menos o primeiro deve ser configurado não apenas no lado do cliente, mas também no lado do servidor . Em seguida, olhei para a configuração por cliente do lado do servidor, --client-config-dirmas diz

As seguintes opções são válidas em um contexto específico do cliente: --push, --push-reset, --iroute, --ifconfig-push e --config.

Nenhuma menção às opções de MTU!

Então, aqui estão minhas perguntas mais específicas:

  • Por que exatamente são link-mtue tun-mtudesencorajados? Quais são os possíveis problemas com essas opções? Observe que estou bastante confortável com o munging de cabeçalho IP de baixo nível.
  • Qual das opções link-mtu tun-mtu fragment mssfixprecisa ser espelhada no lado do servidor para funcionar?
  • Em quais das opções link-mtu tun-mtu fragment mssfixpodem ser usadas client-config-dir?
  • Caso todas as quatro opções precisem ser espelhadas no lado do servidor e não possam ser usadas internamente client-config-dir: Existem alternativas para combater o MTU de caminho baixo por cliente?

Notas:

  • Partes de minhas perguntas já foram feitas há 5 anos aqui , mas elas realmente não foram respondidas naquela época, portanto, ouso duplicá-las.
  • O servidor OpenVPN atualmente é 2.2.1 no Ubuntu 12.04. Estamos preparando uma atualização para 2.3.2 no Ubuntu 14.04
  • Os clientes OpenVPN são 2.2.1 no Debian 7.6
  • Estou feliz em determinar o caminho de MTU de um cliente manualmente
  • Atualmente, não podemos testar muito do lado do servidor. Mas estamos construindo um banco de testes completo e separado, que deve estar pronto em breve.

Sou grato por qualquer conselho útil.

Nils Toedtmann
fonte
1
576? Caro gawd. Eu não vi um MTU tão baixo desde os dias da conexão discada. Isso está passando por um antigo link serial?
Michael Hampton
Você poderia executar dois servidores OpenVPN? Talvez você possa executar os dois servidores no mesmo endereço IP público e usar o encaminhamento de porta (ou uma política de roteamento) para direcionar clientes para um servidor OpenVPN diferente, dependendo se eles estão em uma rede problemática conhecida ou não (conforme determinado por uma lista de clientes). Endereços IP).
kasperd
1
@MichaelHampton eu também me perguntava. É> 600kbit / se RTT ~ 30ms, não me parece uma série antiga. Dado que eles têm outras configurações estúpidas (por exemplo, não respondendo ao DF com 'fragmentação necessária'), acho que essa é apenas mais uma. Dissemos a eles, mas ainda não recebemos resposta.
Nils Toedtmann
@kasperd ideia interessante. Eu poderia executar várias instâncias do servidor OpenVPN. Teria que ter talvez 3 ou 4, para diferentes faixas de MTU. O NAT por cliente do lado do servidor não funcionaria (não posso prever os endereços IP dinâmicos do cliente público), mas teria que alterar a configuração do cliente de qualquer maneira para as configurações da MTU (correto?); Portanto, simplesmente configuraria a porta diferente diretamente no cliente. - Mas seria um pesadelo de manutenção que eu preferiria evitar!
Nils Toedtmann
@NilsToedtmann Quais critérios você usaria para detectar quais clientes são afetados? Uma outra abordagem poderia ser executar um script no servidor após a conexão de um cliente. O script pode tentar executar ping no endereço IP do cliente com tamanhos de pacotes variados para descobrir quais funcionam e quais não. Em seguida, ele pode inserir iptablesregras para reduzir o MSS em todos os pacotes SYN para ou a partir desse endereço IP do cliente.
kasperd

Respostas:

3

Resolvi o problema no lado do cliente adicionando a opção mssfix 1300ao arquivo de configuração.

Na página do manual openvpn:

--mssfix max
    Announce to TCP sessions running over the tunnel that they should limit their send packet sizes such that after OpenVPN has encapsulated them, the resulting UDP packet size that OpenVPN sends to its peer will not exceed max bytes. 

A ideia original da minha solução veio de personalvpn.org

Oz123
fonte
1
Então, mssfixpode ser definido apenas no lado do cliente? Bem, isso é algo pelo menos. Ele não ajuda com pacotes UDP embora (que é por isso que eu estava interessado em outras opções, mas pelo menos as recomendadas fragmentprecisa ser definido no lado do servidor também)
Nils Toedtmann
2
O mssfix pode ser adicionado no servidor e no cliente. No entanto, o menor valor será usado na negociação
Ahmed
2

Dada a falta de respostas, estou postando agora uma solução que não é muito elegante, mas simples: execute outra instância do OpenVPN no TCP para "maus clientes"

proto tcp

e abaixe o TCP MSS no cliente, por exemplo

iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o ${OUT_DEV} -j TCPMSS --set-mss ${PATH-MTU-MINUS-40}

Uma vantagem dessa solução é que cada cliente pode definir seu MSS individual.

É certo que é TCP-sobre-TCP, mas que deve funcionar bem o suficiente em muitos cenários .

Observe que ainda sou muito interessado em soluções que não exigem proto tcpe as marcarei como resposta válida se elas atenderem mais ou menos meus requisitos descritos.

Nils Toedtmann
fonte