diff --git a/apply_wg_mtu_optimization.sh b/apply_wg_mtu_optimization.sh new file mode 100644 index 0000000..55175b9 --- /dev/null +++ b/apply_wg_mtu_optimization.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# +# Este script implementa otimização de MTU para WireGuard sem depender de XDP +# já que o carregamento do programa XDP falhou devido a limitações no verificador de limites + +echo "Aplicando otimizações manuais de MTU para WireGuard..." + +# 1. Configurar MTU ótimo para WireGuard +echo "Configurando MTU ótimo para WireGuard..." +ip link set dev wg0 mtu 1420 +echo "MTU da interface wg0 configurado para 1420" + +# 2. Configurar TCP MSS clamping via iptables para prevenir fragmentação +echo "Configurando TCP MSS Clamping..." +iptables -t mangle -F FORWARD +iptables -t mangle -A FORWARD -o wg0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380 +iptables -t mangle -A FORWARD -i wg0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380 +echo "TCP MSS ajustado para 1380 para pacotes passando pelo WireGuard" + +# 3. Ajustar opções de kernel para melhorar o tratamento de MTU e fragmentação +echo "Ajustando parâmetros de kernel para PMTU e fragmentação..." +sysctl -w net.ipv4.tcp_mtu_probing=1 +sysctl -w net.ipv4.ip_no_pmtu_disc=0 +echo "net.ipv4.tcp_mtu_probing = 1" >> /etc/sysctl.conf +echo "net.ipv4.ip_no_pmtu_disc = 0" >> /etc/sysctl.conf +sysctl -p + +# 4. Priorizar tráfego WireGuard no QoS +echo "Configurando QoS para priorizar pacotes WireGuard..." +# Verificar se já existe regra para não duplicar +if ! tc filter show dev enp0s6 parent 1: | grep -q "match ip protocol 17.*match ip dport 32100"; then + tc filter add dev enp0s6 parent 1: protocol ip prio 1 u32 \ + match ip protocol 17 0xff \ + match ip dport 32100 0xffff \ + flowid 1:10 +fi + +# 5. Configurar o sysctl drop_path_mtu para garantir que o kernel ajuste o MTU adequadamente +sysctl -w net.ipv4.ip_forward_use_pmtu=1 +echo "net.ipv4.ip_forward_use_pmtu = 1" >> /etc/sysctl.conf + +# 6. Adicionar um monitoramento básico de fragmentação +echo "Configurando monitoramento de fragmentação..." +cat > /etc/cron.daily/check_ip_frag << 'EOF' +#!/bin/sh +# Monitorar estatísticas de fragmentação IP +echo "=== Estatísticas de Fragmentação $(date) ===" >> /var/log/ip_frag_stats.log +grep . /proc/net/snmp | grep -A 1 "^Ip" >> /var/log/ip_frag_stats.log +echo "" >> /var/log/ip_frag_stats.log +EOF + +chmod +x /etc/cron.daily/check_ip_frag + +# 7. Mostrar informações atuais +echo "" +echo "=== Otimização de MTU para WireGuard aplicada com sucesso ===" +echo "Informações da interface WireGuard:" +ip link show wg0 | grep mtu +echo "" +echo "Regras de TCP MSS clamping:" +iptables -t mangle -L FORWARD -v -n | grep TCPMSS +echo "" +echo "Esta solução irá:" +echo "- Prevenir fragmentação usando MTU 1420 e TCP MSS 1380" +echo "- Melhorar Path MTU Discovery para conexões mais estáveis" +echo "- Priorizar tráfego WireGuard no QoS" +echo "- Monitorar fragmentação para ajustes futuros" diff --git a/troubleshooting_xdp_bpf.md b/troubleshooting_xdp_bpf.md new file mode 100644 index 0000000..baf4263 --- /dev/null +++ b/troubleshooting_xdp_bpf.md @@ -0,0 +1,47 @@ +# Diagnóstico da Falha de Carregamento do XDP + +Analisando o erro de carregamento do programa XDP `xdp_wg_mtu_optimizer.o`, identifiquei os seguintes problemas: + +## Principal erro detectado + +``` +invalid access to packet, off=34 size=1, R1(id=3,off=34,r=34) +R1 offset is outside of the packet +``` + +O verificador de BPF está detectando um acesso inválido à memória do pacote. O programa tenta acessar dados além dos limites verificáveis pelo verificador estático do BPF. + +## Causas prováveis + +1. **Verificação de limites inadequada**: Quando processamos opções TCP, o verificador BPF não consegue comprovar estaticamente que todos os acessos estão dentro dos limites do pacote. + +2. **Problema de alinhamento de ponteiros**: O código usa vários tipos de ponteiros (IPv4, TCP, opções TCP) com diferentes deslocamentos que estão causando confusão no verificador. + +3. **Análise estática limitada**: O verificador BPF não consegue seguir todas as ramificações do código para garantir que os acessos sejam seguros. + +## Soluções possíveis para implementação XDP futura + +Para implementar o código XDP para otimização de MTU no futuro, considere estas abordagens: + +1. **Simplificação do programa**: Reduzir a complexidade, especialmente no processamento de opções TCP. + +2. **Bounds checking explícito**: Adicionar mais verificações de limites explícitas antes de acessar os campos: + +```c +if ((void *)(tcp_opt_ptr + 4) <= data_end && tcp_opt_ptr + 4 <= tcp_opt_end) { + // Agora é seguro acessar tcp_opt_ptr[0], tcp_opt_ptr[1], etc. +} +``` + +3. **Uso de loops fixos**: O verificador BPF tem problemas com loops que não são estáticos. Use unroll forçado: + +```c +#pragma unroll +for (int i = 0; i < 4; i++) { // Número fixo pequeno de iterações + // código do loop +} +``` + +4. **Versão do kernel**: Considere atualizar o kernel para obter um verificador BPF mais recente que pode lidar melhor com estas verificações. + +5. **Técnica de CO-RE (Compile Once Run Everywhere)**: Use abordagens mais modernas de BPF com BTF para melhorar a portabilidade e verificação.