102 lines
3.4 KiB
Bash
102 lines
3.4 KiB
Bash
#!/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!"
|