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.