[OpenVPN] Verificando iroute duplicadas CCD-DIR

🔎 Por que isso importa?

Quando usamos OpenVPN com rotas específicas por cliente, normalmente configuramos essas rotas em arquivos individuais dentro do diretório ccd (Client Config Directory), usando a diretiva iroute.

Porém, duas entradas iroute com a mesma rede em clientes diferentes causam conflitos sérios, fazendo com que o OpenVPN não saiba para qual cliente deve rotear aquela sub-rede — e isso derruba a comunicação para aquela rota.


🧩 O desafio

Identificar manualmente essas duplicatas pode ser impraticável em ambientes com dezenas ou centenas de clientes.

Por isso, desenvolvi um script em Bash que analisa todos os arquivos do diretório /etc/openvpn/ccd e mostra quais redes estão duplicadas, informando os arquivos (clientes) em que isso ocorre.


✅ O script: verificar_iroute_duplicadas.sh

#!/bin/bash

CCD_DIR="/etc/openvpn/ccd"
declare -A rede_para_arquivos

# Converte máscara para CIDR
mask_to_cidr() {
    local mask=$1
    case "$mask" in
        128.0.0.0) echo 1 ;;
        192.0.0.0) echo 2 ;;
        224.0.0.0) echo 3 ;;
        240.0.0.0) echo 4 ;;
        248.0.0.0) echo 5 ;;
        252.0.0.0) echo 6 ;;
        254.0.0.0) echo 7 ;;
        255.0.0.0) echo 8 ;;
        255.128.0.0) echo 9 ;;
        255.192.0.0) echo 10 ;;
        255.224.0.0) echo 11 ;;
        255.240.0.0) echo 12 ;;
        255.248.0.0) echo 13 ;;
        255.252.0.0) echo 14 ;;
        255.254.0.0) echo 15 ;;
        255.255.0.0) echo 16 ;;
        255.255.128.0) echo 17 ;;
        255.255.192.0) echo 18 ;;
        255.255.224.0) echo 19 ;;
        255.255.240.0) echo 20 ;;
        255.255.248.0) echo 21 ;;
        255.255.252.0) echo 22 ;;
        255.255.254.0) echo 23 ;;
        255.255.255.0) echo 24 ;;
        255.255.255.128) echo 25 ;;
        255.255.255.192) echo 26 ;;
        255.255.255.224) echo 27 ;;
        255.255.255.240) echo 28 ;;
        255.255.255.248) echo 29 ;;
        255.255.255.252) echo 30 ;;
        255.255.255.254) echo 31 ;;
        255.255.255.255) echo 32 ;;
        *) echo "0" ;; # Máscara inválida
    esac
}

# Verifica se diretório existe
if [[ ! -d "$CCD_DIR" ]]; then
    echo "Erro: Diretório $CCD_DIR não encontrado."
    exit 1
fi

# Percorre todos os arquivos do CCD
for arquivo in "$CCD_DIR"/*; do
    [[ -f "$arquivo" ]] || continue
    nome_arquivo=$(basename "$arquivo")

    while IFS= read -r linha; do
        # Ignora linhas vazias ou comentários
        [[ "$linha" =~ ^\s*# ]] && continue
        [[ "$linha" =~ ^\s*$ ]] && continue

        # Pega linhas com 'iroute'
        if [[ "$linha" =~ ^[[:space:]]*iroute[[:space:]]+([0-9\.]+)[[:space:]]+([0-9\.]+) ]]; then
            rede="${BASH_REMATCH[1]}"
            mask="${BASH_REMATCH[2]}"
            cidr=$(mask_to_cidr "$mask")
            [[ "$cidr" == "0" ]] && continue
            chave="$rede/$cidr"
            rede_para_arquivos["$chave"]+="$nome_arquivo "
        fi
    done < "$arquivo"
done

# Mostra as duplicadas
echo "🕵️ Redes 'iroute' duplicadas encontradas:"
duplicadas=0
for rede in "${!rede_para_arquivos[@]}"; do
    arquivos="${rede_para_arquivos[$rede]}"
    count=$(echo "$arquivos" | wc -w)
    if (( count > 1 )); then
        echo "- $rede encontrada em: $arquivos"
        ((duplicadas++))
    fi
done

if (( duplicadas == 0 )); then
    echo "✅ Nenhuma duplicata encontrada."
fi

📦 Como usar

  1. Salve o script:
nano /etc/openvpn/verificar_iroute_duplicadas.sh

Dê permissão de execução:

chmod +x /etc/openvpn/verificar_iroute_duplicadas.sh

Execute:

./verificar_iroute_duplicadas.sh

🧪 Exemplo de resultado

🕵️ Redes 'iroute' duplicadas encontradas:
- 192.168.68.0/24 encontrada em: client011 client012

✅ Conclusão

Com esse script simples, é possível detectar rapidamente conflitos de rotas entre clientes em ambientes OpenVPN e agir antes que causem problemas de conectividade.

Você pode ainda adaptar esse script para:

  • Exportar o resultado em CSV para relatórios;
  • Rodar automaticamente via cron;
  • Enviar alertas por e-mail ou syslog.

Se você administra um ambiente OpenVPN com múltiplos clientes, esse script pode te poupar horas de debug. 😉

CATEGORIES:

Software Livre

Comments are closed