This commit is contained in:
rodrigo committed 2025-02-28 20:47:14 -03:00
1 parent 296aec1afa
commit bb0f1d6acd
2 files changed
+111 -60

No files matched your search

+101
View File
@@ -0,0 +1,101 @@
#!/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 <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_endian.h>
// 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!"