Saltar al contenido principal

Solución Universal de DNS para Pritunl Client

Corregí la resolución DNS del cliente Pritunl para que los dominios privados de la VPN (endpoints EKS, servicios internos, microservicios) siempre se resuelvan correctamente en Linux, macOS y Windows.

El Problema

Al usar Pritunl Client, algunos sistemas operativos no aplican correctamente el DNS interno de la VPN, lo que provoca que los dominios privados o de infraestructura no se resuelvan.

Cada OS maneja el DNS por interfaz de manera diferente — systemd-resolved, resolvconf, NetworkManager, scutil, la API de Windows — y en ciertos casos ignoran el DNS que la VPN entrega.

El resultado es un comportamiento inconsistente:

  • En algunas máquinas, los dominios internos funcionan
  • En otras, la resolución falla y requiere configuración manual
  • En redes con IPs privadas o dinámicas, el problema es aún más frecuente

La solución universal es aplicar el DNS de la VPN explícitamente sobre la interfaz VPN usando herramientas nativas del sistema (resolvectl, scutil, PowerShell). Esto garantiza la resolución correcta sin modificar configuraciones permanentes del sistema.

Prerrequisitos

  • Pritunl Client instalado y conectado a un perfil de VPN
  • Acceso sudo / administrador en la máquina

Script para Linux

Compatible con Ubuntu, Debian, Fedora, Arch, Manjaro, Kali, PopOS y cualquier distribución con systemd-resolved.

fix_vpn_dns_linux.sh

#!/bin/bash

# CONFIGURACIÓN: editá estos valores
VPN_IFACE="tun0" # Interfaz típica de Pritunl
VPN_DNS="10.110.0.2" # DNS interno
VPN_DOMAIN="internal.us-east-1.eks.amazonaws.com" # Dominio interno EKS

if ip link show "$VPN_IFACE" >/dev/null 2>&1; then
echo "[+] VPN detectada en $VPN_IFACE"
if command -v resolvectl >/dev/null 2>&1; then
echo "[+] Aplicando DNS..."
sudo resolvectl dns "$VPN_IFACE" "$VPN_DNS"
sudo resolvectl domain "$VPN_IFACE" "~$VPN_DOMAIN"
else
echo "[!] resolvectl no encontrado. No se puede aplicar DNS sin intrusión."
fi
else
echo "[-] VPN no detectada. DNS sin cambios."
fi
chmod +x fix_vpn_dns_linux.sh
./fix_vpn_dns_linux.sh

Verificar:

resolvectl status tun0

Script para macOS

fix_vpn_dns_macos.sh

#!/bin/bash

VPN_IFACE="utun2"
VPN_DNS="10.110.0.2"
VPN_DOMAIN="internal.us-east-1.eks.amazonaws.com"

if ifconfig "$VPN_IFACE" >/dev/null 2>&1; then
echo "[+] VPN detectada. Configurando DNS..."
sudo scutil <<EOF
open
d.init
d.add ServerAddresses * $VPN_DNS
d.add SupplementalMatchDomains * $VPN_DOMAIN
set State:/Network/Service/$VPN_IFACE/DNS
quit
EOF
else
echo "[-] VPN no detectada."
fi

Verificar:

scutil --dns

Script para Windows (PowerShell)

fix_vpn_dns_windows.ps1

$vpnName = "Pritunl"
$vpnDns = "10.110.0.2"

$adapter = Get-NetAdapter | Where-Object { $_.InterfaceDescription -match $vpnName }
if ($adapter) {
Write-Host "[+] VPN detectada. Configurando DNS..."
Set-DnsClientServerAddress -InterfaceIndex $adapter.InterfaceIndex -ServerAddresses $vpnDns
} else {
Write-Host "[-] VPN no detectada."
}

Verificar:

Get-DnsClientServerAddress

Script Universal Multiplataforma

Este script único detecta automáticamente el sistema operativo y aplica la configuración correspondiente.

universal_fix_vpn_dns.sh

#!/usr/bin/env bash
# Fix universal de DNS para Pritunl — Linux / macOS / Windows

# ---- CONFIGURAR ESTO ----
VPN_IFACE_LINUX="tun0"
VPN_IFACE_MACOS="utun2"
VPN_ADAPTER_WINDOWS="Pritunl"
VPN_DNS="10.110.0.2"
VPN_DOMAIN="internal.us-east-1.eks.amazonaws.com"
# -------------------------

detect_os() {
case "$(uname -s)" in
Linux*) echo "linux";;
Darwin*) echo "macos";;
*) echo "other";;
esac
}

run_linux() {
echo "[OS] Linux"
if ! ip link show "$VPN_IFACE_LINUX" >/dev/null 2>&1; then
echo "[-] VPN no detectada en $VPN_IFACE_LINUX."
return
fi
echo "[+] VPN detectada."
if command -v resolvectl >/dev/null 2>&1; then
sudo resolvectl dns "$VPN_IFACE_LINUX" "$VPN_DNS"
sudo resolvectl domain "$VPN_IFACE_LINUX" "~$VPN_DOMAIN"
echo "[✓] DNS aplicado."
else
echo "[!] resolvectl no encontrado."
fi
}

run_macos() {
echo "[OS] macOS"
if ! ifconfig "$VPN_IFACE_MACOS" >/dev/null 2>&1; then
echo "[-] VPN no detectada en $VPN_IFACE_MACOS."
return
fi
echo "[+] VPN detectada. Aplicando DNS..."
sudo scutil <<EOF
open
d.init
d.add ServerAddresses * $VPN_DNS
d.add SupplementalMatchDomains * $VPN_DOMAIN
set State:/Network/Service/$VPN_IFACE_MACOS/DNS
quit
EOF
echo "[✓] DNS aplicado."
}

run_windows() {
echo "[OS] Windows"
powershell -NoProfile -Command "
\$adapter = Get-NetAdapter | Where-Object { \$_.InterfaceDescription -match '$VPN_ADAPTER_WINDOWS' }
if (\$adapter) {
Write-Host '[+] VPN detectada. Configurando DNS...'
Set-DnsClientServerAddress -InterfaceIndex \$adapter.InterfaceIndex -ServerAddresses '$VPN_DNS'
Write-Host '[✓] DNS aplicado.'
} else {
Write-Host '[-] VPN no detectada.'
}
"
}

OS="$(detect_os)"
case "$OS" in
linux) run_linux;;
macos) run_macos;;
*)
if command -v powershell.exe >/dev/null 2>&1 || command -v powershell >/dev/null 2>&1; then
run_windows
else
echo "[ERROR] Sistema operativo no soportado."
fi
;;
esac
chmod +x universal_fix_vpn_dns.sh
./universal_fix_vpn_dns.sh

Variables de configuración

VariableDescripciónEjemplo
VPN_IFACE_LINUXInterfaz VPN en Linuxtun0
VPN_IFACE_MACOSInterfaz VPN en macOSutun2
VPN_ADAPTER_WINDOWSNombre del adaptador en WindowsPritunl
VPN_DNSIP del servidor DNS interno10.110.0.2
VPN_DOMAINDominio internointernal.us-east-1.eks.amazonaws.com

Solución de Problemas

ProblemaCausaSolución
El script no detecta la VPNNombre de interfaz incorrectoVerificar con ip link (Linux), ifconfig (macOS), Get-NetAdapter (Windows)
El DNS no se aplicaFalta de permisosEjecutar con sudo
Funciona pero se pierde al reconectarNo está automatizadoCrear un hook post-conexión en Pritunl para ejecutar el script automáticamente
aviso

Estos scripts no realizan cambios permanentes en el sistema. La configuración DNS desaparece automáticamente al desconectar la VPN.