¿No puedes usar el puerto 53 en Ubuntu? Aquí te enseño cómo resolverlo fácilmente ⚡

¿No puedes usar el puerto 53 en Ubuntu? Aquí te enseño cómo resolverlo fácilmente ⚡

Intentando lanzar una imagen de Docker que necesitaba usar el puerto 53, me topé con un error: "listen tcp 0.0.0.0:53: bind: address already in use". Lo primero que hice fue verificar qué contenedores estaban usando ese puerto, pero para mi sorpresa, ninguno lo estaba. ¿Qué proceso estaba ocupando el puerto? Después de investigar, descubrí que un servicio nativo de Ubuntu, systemd-resolved, estaba ocupando el puerto 53. Desactivarlo directamente no era una opción, ya que afectaría el funcionamiento del servidor. Así que me di a la tarea de buscar una solución que permitiera liberar el puerto 53 sin comprometer la funcionalidad del sistema.

Cómo liberar el puerto 53 utilizado por systemd-resolved en Ubuntu

Ubuntu tiene systemd-resolved escuchando en el puerto 53 por defecto. Esto es un problema si quieres correr tu propio servidor DNS porque el puerto ya está en uso. Aquí te explico cómo evitar que systemd-resolved use el puerto 53 en Ubuntu. Estas instrucciones se probaron en Ubuntu 24.04, pero deberían funcionar en otras versiones como Ubuntu y distribuciones basadas en Ubuntu como Elementary OS, Linux Mint, entre otras. Básicamente, funciona en cualquier sistema que tenga systemd versión '255 (255.4-1ubuntu8.2)' o más reciente.

Cómo verificar si el puerto 53 está en uso

Para verificar si el puerto 53 está en uso en tu sistema, usa:

sudo lsof -i :53

Ejemplo de salida mostrando que systemd-resolved está usando el puerto 53 en un sistema Ubuntu 24.04:

$ sudo lsof -i:53
COMMAND      PID            USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd-r 276250 systemd-resolve   14u  IPv4 1244139      0t0  UDP _localdnsstub:domain 
systemd-r 276250 systemd-resolve   15u  IPv4 1244140      0t0  TCP _localdnsstub:domain (LISTEN)
systemd-r 276250 systemd-resolve   16u  IPv4 1244141      0t0  UDP _localdnsproxy:domain 
systemd-r 276250 systemd-resolve   17u  IPv4 1244142      0t0  TCP _localdnsproxy:domain (LISTEN)

Si no obtienes ninguna salida, significa que el puerto 53 no está en uso.

Cómo evitar que systemd-resolved use el puerto 53 en Ubuntu

Puedes liberar el puerto 53 simplemente descomentando DNSStubListener y configurándolo en no en /etc/systemd/resolved.conf. Los otros pasos son para habilitar un servidor DNS; sin esto, tu sistema no podrá resolver nombres de dominio, por lo que no podrás visitar sitios web en el navegador, entre otros problemas.

Edita /etc/systemd/resolved.conf con un editor de texto (como root), por ejemplo, ábrelo con el editor Nano:

sudo nano /etc/systemd/resolved.conf

Descomenta (elimina # al inicio de la línea) la línea DNS= y la línea DNSStubListener=. Luego, cambia el valor de DNS= en este archivo al servidor DNS que quieres usar (por ejemplo, 127.0.0.1 para usar un proxy local, 1.1.1.1 para usar el DNS de Cloudflare, etc.), y también cambia el valor de DNSStubListener= de yes a no. Así debería verse el archivo después de hacer estos cambios (aquí estoy usando 1.1.1.1 como el servidor DNS, que es el DNS de Cloudflare).

[Resolve]
DNS=1.1.1.1
#FallbackDNS=
#Domains=
#DNSSEC=no
#DNSOverTLS=no
#MulticastDNS=no
#LLMNR=no
#Cache=no-negative
#CacheFromLocalhost=no
DNSStubListener=no
#DNSStubListenerExtra=
#ReadEtcHosts=yes
#ResolveUnicastSingleLabel=no
#StaleRetentionSec=0

Para guardar el archivo usando Nano, presiona Ctrl + x, luego escribe y y presiona Enter.

Crea un enlace simbólico para /run/systemd/resolve/resolv.conf con /etc/resolv.conf como destino:

sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Aquí, -s es para crear un enlace simbólico y no un enlace duro, y -f es para eliminar cualquier archivo de destino existente (por lo que elimina /etc/resolv.conf si existe).

Reinicia tu sistema.

El puerto 53 ahora debería estar libre en tu sistema Ubuntu, y no deberías recibir más errores como "listen tcp 127.0.0.1:53: bind: address already in use".

Puedes verificar si el puerto 53 está en uso o no ejecutando sudo lsof -i :53 si el puerto 53 no está en uso, este comando no debería mostrar ninguna salida.

Resumen

Como root, edita el archivo /etc/systemd/resolved.conf con tu editor de texto preferido.

Descomenta (quita el #) las líneas DNS= y DNSStubListener=.

Cambia el valor de DNS= al servidor DNS de tu elección y el valor de DNSStubListener= de yes a no.

Guarda los cambios y sal del editor.

Luego, crea un enlace simbólico para /run/systemd/resolve/resolv.conf con /etc/resolv.conf como destino:

sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

El -s hace que el enlace sea simbólico en lugar de un enlace duro, y el -f elimina cualquier archivo de destino existente.

Reinicia tu sistema y deberías poder usar el puerto 53.

Puedes verificarlo ejecutando:

sudo lsof -i :53

Si no ves ninguna salida, entonces el puerto 53 debería estar libre.

Finalmente, reinicia el sistema.