🔎 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
- 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. 😉
Comments are closed