Otimização de NAT no VyOS para Alta Carga

10 min de leitura Redes
Otimização de NAT no VyOS para Alta Carga

Contexto: Por que o NAT é o gargalo de performance no VyOS?

O VyOS, distribuição Linux baseada em Debian focada em roteamento e firewall, é uma escolha robusta para provedores de internet (ISPs), data centers e grandes infraestruturas corporativas. No entanto, a transição do kernel Linux para o espaço do usuário ou o processamento excessivo de pacotes pode criar gargalos significativos quando se trata de Network Address Translation (NAT). Em cenários de alta carga, onde a taxa de pacotes (PPS - Packets Per Second) é elevada, a configuração padrão do VyOS pode não explorar todo o potencial de hardware disponível.

A otimização do NAT no VyOS não se trata apenas de ajustar regras de firewall, mas de entender como o kernel Linux gerencia conexões, tabelas de roteamento e buffers de interface. Este tutorial aborda configurações avançadas para minimizar a latência, aumentar o throughput e garantir estabilidade sob estresse máximo.

Etapa 1: Ajustes Fundamentais no Kernel Linux

O VyOS roda sobre um kernel Linux. Muitos gargalos de NAT estão relacionados aos limites padrão do sistema operacional para gerenciamento de memória e conexões simultâneas. Antes de tocar nas configurações específicas do VyOS, devemos otimizar o ambiente base.

Ajuste as variáveis do sysctl para permitir que o kernel gerencie um maior número de sockets em estado TIME_WAIT e aumente os buffers de rede. Acesse o modo de configuração do VyOS:

configure

Crie um arquivo de configuração persistente no diretório /tmp/configs ou utilize a interface de configuração unificada do VyOS para aplicar estes parâmetros globalmente. No entanto, a forma mais direta e segura é via script de inicialização ou modificando o sysctl.conf persistido.

set system sysctl-parameter 'net.ipv4.tcp_fin_timeout' value '30'
set system sysctl-parameter 'net.ipv4.tcp_tw_reuse' value '1'
set system sysctl-parameter 'net.ipv4.ip_local_port_range' value '1024 65535'
set system sysctl-parameter 'net.core.netdev_max_backlog' value '5000'
set system sysctl-parameter 'net.core.rmem_default' value '262144'
set system sysctl-parameter 'net.core.rmem_max' value '16777216'
set system sysctl-parameter 'net.core.wmem_default' value '262144'
set system sysctl-parameter 'net.core.wmem_max' value '16777216'

Explicação técnica:

  • tcp_tw_reuse: Permite reutilizar sockets em estado TIME_WAIT para novas conexões de saída, crucial para clientes que fazem muitas requisições curtas.
  • ip_local_port_range: Expande a faixa de portas disponíveis para conexões de saída, evitando esgotamento de portas em cenários de NAT massivo.
  • netdev_max_backlog: Aumenta o número de pacotes que podem ser enfileirados na interface de rede antes que o processamento do kernel os consuma. Em interfaces de 10Gbps+, o valor padrão (1000) é insuficiente.

Após aplicar, execute commit e save.

Etapa 2: Otimização das Tabelas de Conexão (Conntrack)

O NAT no Linux depende do módulo conntrack para rastrear o estado das conexões. Em alta carga, a tabela de conntrack pode ficar cheia rapidamente, causando perda de pacotes e rejeição de novas conexões. A otimização aqui envolve aumentar o tamanho da tabela e ajustar a expiração dos estados.

No VyOS, você pode configurar os limites do conntrack através das configurações de firewall nativas ou diretamente via sysctl se estiver usando uma versão mais antiga. A abordagem moderna no VyOS é integrada às regras de NAT.

set firewall conntrack helper

No entanto, para ajustes finos de performance, modifique os parâmetros do kernel relacionados ao conntrack:

set system sysctl-parameter 'net.netfilter.nf_conntrack_max' value '1048576'
set system sysctl-parameter 'net.netfilter.nf_conntrack_tcp_timeout_established' value '432000'

Atenção: O valor de nf_conntrack_max deve ser ajustado conforme a RAM disponível. Uma regra geral é calcular com base na memória: (RAM em KB / 16384) * 4. Para servidores com 16GB de RAM, valores acima de 1 milhão são seguros. Aumentar o timeout de TCP estabelecido (padrão é 432000 segundos no VyOS moderno, mas verifique) reduz a sobrecarga de recriação de entradas para conexões longas, como VPNs ou sessões SSH persistentes.

Etapa 3: Configuração Eficiente do NAT (Masquerade vs. Source)

O VyOS oferece dois tipos principais de NAT de origem: masquerade e source. O masquerade é dinâmico e descobre o IP de saída da interface, o que gera uma pequena sobrecarga de CPU para cada nova conexão. O NAT estático (source) requer a especificação explícita do IP de saída.

Dica de Performance: Se você possui IPs fixos públicos atribuídos às suas interfaces de uplink, substitua o masquerade por source. Isso elimina a sobrecarga de descoberta dinâmica.

delete nat source rule 10
set nat source rule 10 outbound-interface 'eth0'
set nat source rule 10 source address '192.168.1.0/24'
set nat source rule 10 translation address 'masquerade'

No exemplo acima, mantivemos o masquerade por simplicidade, mas para máxima performance em interfaces específicas:

set nat source rule 20 outbound-interface 'eth0'
set nat source rule 20 source address '192.168.1.0/24'
set nat source rule 20 translation address '1.2.3.4' # IP fixo do uplink

Essa mudança reduz o consumo de CPU em até 5-10% em cargas extremas, dependendo da quantidade de novas conexões por segundo.

Etapa 4: Ajustes de Interrupt RPS/RFS (Affinity)

Em sistemas multi-core, o processamento de pacotes pode ficar concentrado em um único núcleo, enquanto outros núcleos ficam ociosos. O VyOS tenta gerenciar isso automaticamente, mas em ambientes de alta carga, a configuração manual da afinidade de interrupção (IRQ) e do Recv Packet Steering (RPS) é essencial.

Verifique como as interrupções estão distribuídas atualmente:

cat /proc/interrupts | grep eth

Para otimizar, o VyOS utiliza scripts de inicialização. Crie um script em /config/scripts/post-config-script.post-actions (se disponível) ou utilize a funcionalidade de comandos personalizados do VyOS para aplicar RPS.

O objetivo é espalhar as interrupções das NICs por todos os núcleos disponíveis. No VyOS, isso é feito via configuração de sistema:

set system ip-dccp-default-options
# Não há configuração direta GUI para RPS no VyOS padrão, então usamos scripts ou sysctl avançado.

A maneira mais robusta é garantir que o smp_affinity esteja balanceado. No entanto, uma otimização crítica no espaço do usuário para VyOS é ajustar o RPS via script shell após o boot:

#!/bin/bash
# Script para configurar RPS nas interfaces de rede
for i in /sys/class/net/eth*/queues/rx-*/rps_cpus; do
    echo 3 > $i # Exemplo: espalhar para os primeiros 4 cores (mask binário 11)
done

Nota: Certifique-se de que o script tenha permissão de execução e seja chamado corretamente no processo de boot do VyOS. A configuração manual do smp_affinity_list nos arquivos /proc/irq//smp_affinity_list também é recomendada para dispositivos de rede específicos.

Etapa 5: Otimização de Buffers e MTU/Jumbo Frames

O tamanho do pacote (MTU) impacta diretamente a eficiência do NAT. Pacotes menores significam mais cabeçalhos para processar por segundo. Se sua infraestrutura de rede (switches, links) suportar, ative Jumbo Frames.

set interfaces ethernet eth0 mtu '9000'
set interfaces ethernet eth1 mtu '9000'

Além disso, ajuste os buffers de anel (ring buffer) da placa de rede para reduzir perdas em picos de tráfego:

set interfaces ethernet eth0 duplex 'auto'
set interfaces ethernet eth0 speed 'auto'
# Nota: O VyOS não expõe diretamente o ethtool -A via CLI padrão facilmente sem scripts.
# Utilize um script post-config para aplicar:
# ethtool -G eth0 rx 4096 tx 4096

Para aplicar o ajuste de buffer via VyOS, você pode usar a diretiva custom ou scripts. Exemplo de comando direto no shell (se permitido pelo nível de privilégio):

ethtool -G eth0 rx 4096 tx 4096

Isto aumenta a capacidade da NIC de armazenar pacotes antes que o driver os passe para o kernel, reduzindo drops em momentos de congestão.

Etapa 6: Monitoramento e Validação

Após aplicar todas as otimizações, é crucial validar se elas estão fazendo diferença. Utilize ferramentas de monitoramento em tempo real.

1. Verificar o uso da CPU por processo:

top -p $(pgrep -d, -f "ntpd|vyatta|systemd")

Foque no processo irq/... relacionado à sua interface de rede. Se a CPU estiver saturada em um único core, ajuste o RPS/RFS novamente.

2. Monitorar o Conntrack:

cat /proc/net/nf_conntrack | wc -l

Compare este número com o limite definido em nf_conntrack_max. Se estiver chegando perto de 80-90%, você precisa aumentar o limite ou ajustar os timeouts.

3. Teste de Throughput:

Utilize iperf3 para simular carga. No servidor (outro VyOS ou máquina Linux):

iperf3 -s

No cliente (VyOS otimizado):

iperf3 -c  -t 60 -P 10

O parâmetro -P 10 cria 10 fluxos paralelos, simulando uma carga de NAT mais realista do que um único fluxo. Monitore a taxa de transferência e a latência.

Considerações Finais sobre Escalabilidade

A otimização do VyOS para NAT em alta carga é um exercício de equilíbrio entre memória, CPU e I/O de rede. As configurações apresentadas aqui — desde o ajuste do sysctl até a mudança de masquerade para source — são padrão ouro para administradores de rede que buscam extrair o máximo de hardware commodity.

Lembre-se sempre de fazer backups da configuração antes de alterações profundas e testar em ambiente de homologação. Cada hardware tem suas particularidades; o que funciona perfeitamente em um servidor com NICs Intel X710 pode exigir ajustes diferentes em placas mais básicas.

A manutenção contínua é vital. Monitore logs de kernel (dmesg) em busca de mensagens como nf_conntrack: table full, dropping packet. Se essas mensagens aparecerem, seu sistema ainda está limitado por recursos e novas iterações de ajuste são necessárias.

Com estas configurações, seu VyOS estará preparado para lidar com milhares de conexões simultâneas, mantendo a latência baixa e a disponibilidade alta, essencial para serviços críticos em ambientes de cloud e infraestrutura moderna.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000