#!/bin/bash # Esta é a solução final que combina o melhor dos dois mundos: # 1. Usa o script manual para implementar MTU e MSS clamping # 2. Se possível, tenta carregar uma versão XDP mínima para estatísticas # 1. Aplicar configurações manuais (confiáveis) primeiro echo "Aplicando configurações manuais de MTU para WireGuard..." # Configurar MTU ip link set dev wg0 mtu 1420 # Aplicar MSS Clamping via iptables iptables -t mangle -D FORWARD -o wg0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380 2>/dev/null iptables -t mangle -A FORWARD -o wg0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380 iptables -t mangle -D FORWARD -i wg0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380 2>/dev/null iptables -t mangle -A FORWARD -i wg0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380 # Ajustar parâmetros do kernel sysctl -w net.ipv4.tcp_mtu_probing=1 sysctl -w net.ipv4.ip_no_pmtu_disc=0 # 2. Compilar versão XDP mínima apenas para estatísticas echo "Compilando versão ultrasimplificada do XDP para monitoramento..." cat > xdp_minimal_stats.c << 'EOF' #include #include #include #include #include // Estatísticas básicas struct mtu_stats { __u64 total_packets; __u64 oversized_packets; }; struct { __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); __uint(max_entries, 1); __type(key, __u32); __type(value, struct mtu_stats); } mtu_stats_map SEC(".maps"); // Programa XDP ultrasimplificado sem processamento de opções SEC("xdp") int xdp_minimal_stats(struct xdp_md *ctx) { void *data_end = (void *)(long)ctx->data_end; void *data = (void *)(long)ctx->data; __u32 key = 0; // Incrementar estatística de pacotes totais struct mtu_stats *stats = bpf_map_lookup_elem(&mtu_stats_map, &key); if (stats) stats->total_packets++; // Verificação mínima de cabeçalhos if (data + sizeof(struct ethhdr) + sizeof(struct iphdr) > data_end) return XDP_PASS; struct ethhdr *eth = data; if (eth->h_proto != bpf_htons(0x0800)) return XDP_PASS; struct iphdr *iph = (void *)(eth + 1); // Contar pacotes acima do MTU __u16 tot_len = bpf_ntohs(iph->tot_len); if (tot_len > 1420 && stats) { stats->oversized_packets++; } return XDP_PASS; } char __license[] SEC("license") = "GPL"; EOF # 3. Compilar e tentar carregar o programa mínimo clang -O2 -target bpf -c xdp_minimal_stats.c -o xdp_minimal_stats.o -I/usr/include/bpf -I/usr/include/ -Wno-unused-variable # 4. Tentar carregar apenas se a compilação foi bem sucedida if [ $? -eq 0 ]; then echo "Tentando carregar programa XDP mínimo para estatísticas..." if ip link set dev wg0 xdp obj xdp_minimal_stats.o sec xdp mode generic; then echo "Programa XDP para estatísticas carregado com sucesso" else echo "Não foi possível carregar programa XDP, mas configurações manuais estão ativas" fi else echo "Compilação falhou, usando apenas configurações manuais" fi echo "" echo "=== CONFIGURAÇÃO FINAL ===" echo "- MTU da interface wg0: $(ip link show wg0 | grep mtu | awk '{print $5}')" echo "- MSS Clamping aplicado via iptables" echo "- Configurações de kernel para PMTU Discovery otimizadas" echo "" echo "A otimização do MTU para WireGuard está completa e ativa!"