Saltar a contenido

🔍 Lab 09: Resolución de Nombres (DNS)

Las computadoras hablan con IPs, pero los humanos usamos nombres (google.com, servidor-interno). El DNS (Domain Name System) es el servicio que traduce unos en otros.

En este lab vas a entender cómo el sistema operativo resuelve un nombre paso a paso — no solo que "funciona", sino por qué.

🏗️ Topología del Laboratorio

Copia y pega este YAML en Topología → Importar:

name: "lab-10-dns"
nodes:
  - name: MI-PC
    type: HOST
    x: 100
    y: 200
  - name: ROUTER-DNS
    type: ROUTER
    x: 350
    y: 200
  - name: CLOUD-ISP
    type: CLOUD
    x: 600
    y: 200
links:
  - source: MI-PC
    target: ROUTER-DNS
  - source: ROUTER-DNS
    target: CLOUD-ISP

🛠️ Paso 1: Conectividad básica a Internet

En MI-PC:

ip addr add 192.168.1.2/24 dev eth1
ip link set eth1 up
ip route add default via 192.168.1.1

En ROUTER-DNS:

ip addr add 192.168.1.1/24 dev eth1
ip addr add 10.0.0.1/30 dev eth2
ip link set eth1 up
ip link set eth2 up
ip route add default via 10.0.0.2

En CLOUD-ISP:

ip addr add 10.0.0.2/30 dev eth1
ip link set eth1 up

Verificá que tenés "tubería" a Internet:

ping -c 3 8.8.8.8

❌ Paso 2: Tenés tubería, pero no nombres

Ahora intentá con un nombre:

ping google.com

Resultado:

ping: google.com: Temporary failure in name resolution

Ese error significa: "sé hacer ping, pero no sé qué IP tiene google.com porque nadie me dijo a quién preguntarle". La "tubería" existe (el ping a 8.8.8.8 funcionó), pero falta el servicio que traduce nombres.

📜 Paso 3: La agenda local — /etc/hosts

Antes de consultar un servidor externo, el sistema operativo mira un archivo local: /etc/hosts. Es como una agenda de contactos manual — si el nombre está ahí, usa esa IP directamente sin preguntar a nadie.

# En MI-PC
echo "1.1.1.1 mipagina.test" >> /etc/hosts
ping -c 2 mipagina.test

Funciona. Pero /etc/hosts tiene dos limitaciones: - Hay que editarlo manualmente en cada máquina - No escala para millones de dominios

Por eso existe DNS.

📡 Paso 4: El servidor DNS — /etc/resolv.conf

Para consultar un servidor DNS externo, el sistema necesita saber su dirección. Ese archivo es /etc/resolv.conf:

# Ver el estado actual (probablemente vacío)
cat /etc/resolv.conf

# Configurar el DNS de Google como servidor
echo "nameserver 8.8.8.8" > /etc/resolv.conf

# Probar de nuevo
ping -c 2 google.com

Ahora funciona. Lo que hizo el sistema: 1. Buscó google.com en /etc/hosts → no está 2. Consultó al servidor 8.8.8.8: "¿qué IP tiene google.com?" 3. 8.8.8.8 respondió con una IP 4. El ping se hizo a esa IP

Orden de prioridad: /etc/hosts siempre va primero. Si el nombre está ahí, nunca se consulta el servidor DNS. Útil para testing — podés "mentirle" al sistema sobre qué IP tiene un dominio.

🔬 Paso 5: Ver la conversación DNS con dig

ping solo te dice si hay respuesta. dig te muestra toda la conversación DNS:

dig google.com

Leé la respuesta sección por sección:

;; QUESTION SECTION:
;google.com.    IN  A          ← pregunta: "¿qué IPv4 tiene google.com?"

;; ANSWER SECTION:
google.com. 300 IN  A  142.250.x.x   ← respuesta: la IP

;; Query time: 12 msec           ← cuánto tardó
;; SERVER: 8.8.8.8#53            ← quién respondió

Ahora probá consultar a un servidor DNS diferente:

dig google.com @1.1.1.1

Deberías obtener la misma IP pero desde el servidor de Cloudflare. Eso muestra que DNS es un sistema distribuido — múltiples servidores tienen las mismas respuestas.

🏠 Paso 6: DNS local sin Internet (bonus)

Si no tenés conexión o querés practicar sin depender de Internet, podés levantar un servidor DNS local con dnsmasq (el mismo del lab de DHCP):

# En ROUTER-DNS — actúa como servidor DNS para la red interna
dnsmasq --no-daemon \
  --address=/servidor-interno/192.168.1.50 \
  --address=/base-datos/192.168.1.51 \
  --interface=eth1
# En MI-PC — apuntar al router como servidor DNS
echo "nameserver 192.168.1.1" > /etc/resolv.conf

ping -c 2 servidor-interno   # resuelve a 192.168.1.50
ping -c 2 base-datos         # resuelve a 192.168.1.51

Así es como funciona el DNS interno en empresas: un servidor local que resuelve nombres propios (servidor-interno, impresora-piso2) sin salir a Internet.


📝 Ejercicio: La prioridad de /etc/hosts

En el Paso 4 configuraste nameserver 8.8.8.8 en /etc/resolv.conf. Ahora probá esto:

# En MI-PC
# "Mentile" al sistema sobre la IP de google.com
echo "1.1.1.1 google.com" >> /etc/hosts

# Consultá con dig
dig google.com

Fijate en la ANSWER SECTION: la IP que devuelve es 1.1.1.1, no la real de Google. Aunque tu servidor DNS es 8.8.8.8, /etc/hosts siempre gana.

¿Por qué importa? En desarrollo y testing, /etc/hosts te permite redirigir un dominio a un servidor local sin tocar DNS. Pero también puede ser fuente de errores difíciles de diagnosticar si alguien "olvidó" una entrada ahí.

Quitá la entrada antes de seguir:

sed -i '/1.1.1.1 google.com/d' /etc/hosts


💡 Conceptos Clave

  • /etc/hosts: agenda local, prioridad máxima, no escala
  • /etc/resolv.conf: apunta al servidor DNS a consultar
  • Registro A: traduce un nombre a una IPv4
  • dig: herramienta de diagnóstico DNS — más información que ping
  • Puerto 53 UDP: el puerto estándar de DNS