En el Módulo 3 aprendiste a mirar la red: ip a, ping, dig, ss -tulpn, curl -v y una metodología en capas para averiguar por qué algo no responde. Eso era diagnóstico, y el diagnóstico es lectura. Esta lección da el paso siguiente y bastante más comprometido: escribir. Vas a decidir la dirección de srv-tramontana, su puerta de enlace, sus servidores DNS y sus rutas, y vas a dejarlo escrito de forma que sobreviva a un reinicio.
Comprometido es la palabra exacta: configurar la red de una máquina a la que accedes por la red es la única tarea de administración en la que un error de una letra te deja fuera de forma instantánea y sin aviso. Por eso, además de la sintaxis de netplan, esta lección te enseña el procedimiento: validar antes de aplicar, tener una reversión automática y no soltar nunca la consola de la VM. srv-tramontana sigue con la configuración que dejó el instalador —DHCP puro—, así que su IP depende de un servidor que no controlas. Una aplicación de reservas cuyo nombre de servicio apunta a 10.0.2.15 no puede permitirse que esa dirección cambie un martes por la noche.
Contenido
- Repaso operativo: IPv4, máscara, CIDR y redes privadas
- IPv6 hoy: link-local, SLAAC y por qué no lo desactivas
- Configuración efímera con
ipy por qué se pierde - Netplan: el modelo de renderers en Ubuntu 24.04
- El YAML de netplan, campo a campo
netplan tryy los permisos 600- Resolución de nombres:
systemd-resolvedy el stub 127.0.0.53 - El nombre de la máquina:
hostnamectly/etc/hosts - Interfaces: nombres predecibles, alias, VLAN, bonding y puentes
- Rutas, métricas e
ip route get - Reenvío de paquetes y NAT como conceptos
- Caso Tramontana: de DHCP a IP estática, verificado
- Repaso operativo: IPv4, máscara, CIDR y redes privadas
Una dirección IPv4 son 32 bits en cuatro octetos. La máscara los parte en dos: la parte de red (bits a 1) y la de host (bits a 0). La notación CIDR escribe la máscara como el número de bits a 1.
| CIDR | Máscara | Hosts útiles | Uso típico |
|---|---|---|---|
/32 |
255.255.255.255 | 1 | Una IP concreta (reglas de firewall) |
/30 |
255.255.255.252 | 2 | Enlace punto a punto entre routers |
/24 |
255.255.255.0 | 254 | LAN clásica: la de tu laboratorio |
/16 |
255.255.0.0 | 65.534 | Red grande o rango de contenedores |
De cada red, dos direcciones no son asignables: la de red (todos los bits de host a 0, 10.0.2.0) y la de difusión (todos a 1, 10.0.2.255). De ahí el «−2».
Las redes privadas de la RFC 1918 no se enrutan en Internet: 10.0.0.0/8 (empresas, VirtualBox NAT, nubes), 172.16.0.0/12 (Docker usa 172.17.0.0/16) y 192.168.0.0/16 (routers domésticos). La puerta de enlace es la dirección del router dentro de tu propia red a la que se envía todo lo que no es local: srv-tramontana está en 10.0.2.15/24, habla directamente con cualquier 10.0.2.x y entrega el resto a 10.0.2.2.
Para las IP externas usamos siempre los rangos de documentación de la RFC 5737: 192.0.2.0/24, 198.51.100.0/24 y 203.0.113.0/24. Nunca uses direcciones reales ajenas en ejemplos ni en pruebas.
- IPv6 hoy: link-local, SLAAC y por qué no lo desactivas
IPv6 dejó de ser «el futuro» hace más de una década y Ubuntu 24.04 lo trae activo.
- Toda interfaz operativa tiene una dirección link-local
fe80::/10. No se enruta fuera del segmento, pero la usan el descubrimiento de vecinos (NDP, el equivalente de ARP) y los anuncios de router. - SLAAC (autoconfiguración sin estado) permite que un host se construya su dirección global a partir del prefijo que anuncia el router, sin DHCP. Es lo normal en IPv6; DHCPv6 existe y convive con él.
$ ip -6 addr show dev enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 fe80::a00:27ff:fe4b:1c93/64 scope linkSolo hay link-local porque la red NAT de VirtualBox no anuncia prefijo IPv6. Desactivar IPv6 «por si acaso» es mala idea, aunque medio Internet lo recomiende: no reduces la superficie de ataque, la reduces mal. Si un servicio escucha en :: y tú desactivas IPv6 a medias, acabas con reglas de firewall que no cubren un camino que sigue existiendo. Además rompes software que asume ::1 —systemd-resolved incluido— con timeouts difíciles de diagnosticar. La postura correcta es la misma que con IPv4: si está activo, protégelo; por eso el firewall del 06-03 usará table inet, que cubre las dos familias. Y si de verdad no lo necesitas en un segmento, desactívalo de forma explícita en netplan (accept-ra: false, link-local: []), no con un parche a medias.
- Configuración efímera con
ip y por qué se pierde
ip y por qué se pierdeEl comando ip no solo lee: también escribe. Y lo que escribe vive solo en el kernel, en memoria.
$ sudo ip addr add 10.0.2.99/24 dev enp0s3
$ ip -brief addr show dev enp0s3
enp0s3 UP 10.0.2.15/24 10.0.2.99/24 fe80::a00:27ff:fe4b:1c93/64
$ sudo ip route add 198.51.100.0/24 via 10.0.2.2 dev enp0s3
$ sudo ip link set enp0s3 mtu 1400
$ sudo ip addr del 10.0.2.99/24 dev enp0s3Fíjate en que ip addr add añade, no sustituye: una interfaz puede tener varias direcciones a la vez. Y todo esto desaparece al reiniciar, y también en cuanto systemd-networkd reconfigure la interfaz tras un netplan apply. No hay ningún fichero implicado: el estado de red del kernel es volátil por diseño. Eso convierte a ip en la herramienta perfecta para probar una hipótesis y en la peor posible para configurar un servidor.
- Netplan: el modelo de renderers en Ubuntu 24.04
Ubuntu unificó la configuración de red en netplan: tú escribes YAML declarativo y netplan genera la configuración del backend que toque.
flowchart LR
A["/etc/netplan/*.yaml"] --> B["netplan generate"]
B --> C["/run/systemd/network/*"]
B --> D["NetworkManager<br/>(escritorio)"]
C --> E["systemd-networkd<br/>(servidor)"]
E --> F["Kernel:<br/>direcciones, rutas, DNS"]
D --> F
El renderer networkd es el de Ubuntu Server —máquinas fijas, servidores, nube— y NetworkManager el de Ubuntu Desktop, pensado para portátiles con wifi, roaming y VPN de usuario. En srv-tramontana es networkd.
Los ficheros viven en /etc/netplan/ con extensión .yaml, se leen en orden alfabético y los últimos ganan sobre los primeros. Por eso se numeran:
Ese fichero lo escribió cloud-init durante la instalación y puede reescribirlo en el siguiente arranque. La forma limpia de tomar el control es desactivar esa parte:
$ echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
- El YAML de netplan, campo a campo
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: false
dhcp6: false
addresses:
- 10.0.2.15/24
routes:
- to: default
via: 10.0.2.2
metric: 100
nameservers:
addresses: [10.0.2.2, 192.0.2.53]
search: [tramontana.example]
mtu: 1500
optional: false| Campo | Qué hace | Detalle que importa |
|---|---|---|
version: 2 |
Versión del formato | Siempre 2; no hay otra en uso |
renderer |
Backend | networkd en servidor |
ethernets |
Tipo de dispositivo | También wifis, bridges, bonds, vlans |
enp0s3 |
Nombre de la interfaz | Debe coincidir con ip -brief link |
dhcp4/dhcp6 |
Cliente DHCP | Ponlos a false explícitamente con IP fija |
addresses |
Direcciones con CIDR | 10.0.2.15 sin /24 es un error frecuente |
routes |
Rutas estáticas | to: default sustituye al antiguo gateway4 |
metric |
Coste de la ruta | La menor gana entre varias rutas por defecto |
nameservers |
DNS y dominios de búsqueda | Se entregan a systemd-resolved |
mtu |
Unidad máxima de transmisión | 1500 estándar; 1450 típico dentro de un túnel |
optional: true |
No esperar a la interfaz al arrancar | Evita 2 minutos de espera si no hay cable |
La sintaxis YAML que rompe a todo el mundo: la indentación es con espacios, nunca con tabuladores, y dos espacios por nivel es la convención. Un tabulador produce un error tan críptico como found character '\t' that cannot start any token. Otros tres clásicos: los dos puntos necesitan un espacio detrás (dhcp4: false, no dhcp4:false); las listas se escriben con - o entre corchetes, pero no a medias; y yes/no se interpretan como booleanos, así que usa siempre true/false.
netplan generate traduce el YAML a ficheros de systemd-networkd en /run sin activarlos. Si falla, no has tocado la red:
$ sudo netplan generate && ls /run/systemd/network/
10-netplan-enp0s3.link 10-netplan-enp0s3.network
netplan try y los permisos 600
netplan try y los permisos 600Este es el comando que separa a quien ha perdido un servidor de quien no.
$ sudo netplan try
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 120 seconds
Configuration accepted.netplan try aplica la configuración, arranca una cuenta atrás de 120 segundos y espera tu ENTER. Si has roto la red y tu sesión SSH se corta, no puedes pulsar nada: al agotarse el plazo, netplan restaura la configuración anterior. Ajusta el plazo con --timeout 300 si el cambio es delicado.
| Comando | Qué hace | Reversible |
|---|---|---|
netplan generate |
Valida y genera ficheros en /run |
No aplica nada |
netplan try |
Aplica con reversión automática | Sí, automática |
netplan apply |
Aplica y punto | No |
netplan status --all |
Estado efectivo de red y DNS | Solo lectura |
netplan try no cubre todos los casos: revierte bien si el proceso sigue vivo esperando tu ENTER, pero no si el sistema se cuelga. Por eso la regla completa es try más consola de la VM abierta en otra ventana; en VirtualBox esa consola no pasa por la red.
Desde 24.04, netplan avisa si sus ficheros son legibles por otros: Permissions for /etc/netplan/50-cloud-init.yaml are too open. La razón es directa: un fichero de netplan puede contener la contraseña de una red wifi o credenciales 802.1X en claro, y con 644 las leería cualquier usuario, incluido becario. Aplica umask 027 y déjalos en 600 root:root.
- Resolución de nombres:
systemd-resolved y el stub 127.0.0.53
systemd-resolved y el stub 127.0.0.53$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 39 ago 18 09:14 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
$ cat /etc/resolv.conf
nameserver 127.0.0.53
options edns0 trust-ad
search tramontana.example/etc/resolv.conf es un enlace simbólico a un fichero generado, y el único servidor que aparece es 127.0.0.53: el stub local de systemd-resolved. Las aplicaciones preguntan al stub y el stub reenvía a los DNS reales que le ha entregado netplan. Editarlo a mano no sirve de nada: se regenera en el siguiente arranque o netplan apply.
$ resolvectl status
Link 2 (enp0s3)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS
Current DNS Server: 10.0.2.2
DNS Servers: 10.0.2.2 192.0.2.53
DNS Domain: tramontana.example
$ resolvectl query reservas.tramontana.example
reservas.tramontana.example: 10.0.2.15 -- link: enp0s3
-- Information acquired via protocol DNS in 1.2ms.Tres cosas que importan de esa salida:
- El DNS se configura por interfaz. Una máquina con dos interfaces puede tener DNS distintos en cada una, y
+DefaultRoutemarca cuál se usa para lo que no encaje en un dominio concreto. DNS Domaines el dominio de búsqueda: con él,resolvectl query reservascompleta areservas.tramontana.example.resolvectltiene en cuenta/etc/hosts;digno, porque habla directamente con el servidor. Esa discrepancia explica el 90 % de los «pero sidiglo resuelve bien». Yresolvectl flush-cachesvacía la caché cuando acabas de cambiar un registro y sigues viendo el antiguo.
- El nombre de la máquina:
hostnamectl y /etc/hosts
hostnamectl y /etc/hosts$ hostnamectl
Static hostname: srv-tramontana
Chassis: vm
Virtualization: oracle
Operating System: Ubuntu 24.04.1 LTS
Kernel: Linux 6.8.0-41-generic
$ sudo hostnamectl set-hostname srv-tramontanaHay tres nombres: el estático (el de /etc/hostname, el que persiste), el transitorio (el que puede imponer DHCP) y el bonito (--pretty, texto libre). /etc/hosts debe ser coherente, porque muchos programas resuelven su propio nombre al arrancar:
127.0.0.1 localhost 127.0.1.1 srv-tramontana 10.0.2.15 srv-tramontana reservas.tramontana.example ::1 localhost ip6-localhost ip6-loopback
La línea 127.0.1.1 es una convención de Debian/Ubuntu para que el nombre resuelva incluso sin red.
- Interfaces: nombres predecibles, alias, VLAN, bonding y puentes
enp0s3 no es arbitrario: es un nombre predecible generado por systemd a partir de la posición física del dispositivo — en (ethernet) + p0 (bus PCI 0) + s3 (slot 3). El sistema antiguo (eth0, eth1) numeraba según el orden de detección del kernel, que podía cambiar entre arranques y dejarte el cable de gestión en la interfaz equivocada.
Un alias de IP es simplemente una segunda dirección en la misma interfaz: basta añadirla a addresses. Sirve para migrar un servicio de una IP a otra sin cortar. Y esta es la vista general de las interfaces virtuales que verás en cuanto salgas del laboratorio, sin montarlas aquí:
| Tipo | Para qué sirve | Clave de netplan | Cuándo la necesitas |
|---|---|---|---|
| VLAN | Separar redes lógicas sobre un mismo cable (802.1Q) | vlans: con id y link |
Un switch entrega varias redes por un puerto troncal |
| Bonding | Agregar varias NIC: redundancia o más ancho de banda | bonds: con interfaces y parameters.mode |
Servidor físico con dos tarjetas y dos switches |
| Bridge | Switch software en el mismo dominio de difusión | bridges: con interfaces |
VM o contenedores en la LAN física |
| Túnel / VPN | Red privada sobre una red pública | tunnels: |
Unir sedes o teletrabajo → proyecto 08-04 |
La VPN aparece aquí solo como concepto de red: el servidor WireGuard completo se monta en el proyecto 08-04.
- Rutas, métricas e
ip route get
ip route get$ ip route
default via 10.0.2.2 dev enp0s3 proto static metric 100
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15Dos entradas: la ruta por defecto y la ruta de enlace de la propia red, que el kernel crea solo al asignar la dirección. El kernel elige siempre la ruta más específica (el prefijo más largo) y, a igualdad, la de métrica menor. Una ruta estática persistente se añade al bloque routes del YAML con to: 198.51.100.0/24 y via: 10.0.2.9.
La herramienta de oro para no discutir es preguntarle al kernel qué hará con un paquete concreto, sin enviar nada:
$ ip route get 198.51.100.7
198.51.100.7 via 10.0.2.9 dev enp0s3 src 10.0.2.15 uid 1000
$ ip route get 10.0.2.77
10.0.2.77 dev enp0s3 src 10.0.2.15 uid 1000La primera sale por el router 10.0.2.9 según la ruta estática; la segunda es local y no pasa por ningún router. Cuando alguien afirme «es que el tráfico no va por donde debe», ip route get cierra la conversación en un segundo.
- Reenvío de paquetes y NAT como conceptos
Por defecto, Linux no reenvía paquetes entre interfaces: si llega uno que no va dirigido a él, lo descarta. Lo controla un parámetro del kernel, y activarlo convierte la máquina en un router:
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
$ echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-forward.conf
$ sudo sysctl --systemSe hace de forma persistente en /etc/sysctl.d/, nunca editando /etc/sysctl.conf a mano. NAT es lo que hace tu router de casa y lo que hace VirtualBox con la red 10.0.2.0/24: reescribe la dirección de origen de los paquetes salientes para que todos parezcan venir de una sola IP, y mantiene una tabla para devolver las respuestas. NAT no es seguridad, aunque lo parezca: es un apaño para la escasez de IPv4 que, de propina, hace que las conexiones entrantes no lleguen a nadie por defecto.
srv-tramontana no necesita ni reenvío ni NAT: es un servidor final, y dejar ip_forward = 0 es la postura correcta. Lo activarás con la VPN del proyecto 08-04. Las reglas de filtrado y NAT se escriben con ufw/nftables, y eso es la lección 06-03.
- Caso Tramontana: de DHCP a IP estática, verificado
Paso 0 — medir antes y hacer copia, la convención del curso:
$ { ip -brief a; echo; ip r; echo; resolvectl status; echo; ss -tulpn; } \
| sudo tee /root/red-referencia.txt > /dev/null
$ sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak-$(date +%F)Paso 1 — abrir la consola de la VM en VirtualBox y dejar una segunda sesión SSH abierta. Nunca cierres la puerta por la que estás entrando.
Paso 2 — escribir la configuración:
$ sudo install -m 600 -o root -g root /dev/null /etc/netplan/60-tramontana.yaml
$ sudo tee /etc/netplan/60-tramontana.yaml > /dev/null <<'YAML'
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: false
dhcp6: false
accept-ra: false
addresses:
- 10.0.2.15/24
routes:
- to: default
via: 10.0.2.2
metric: 100
nameservers:
addresses: [10.0.2.2]
search: [tramontana.example]
optional: false
YAML
$ sudo mv /etc/netplan/50-cloud-init.yaml /root/50-cloud-init.yaml.retiradoEl fichero de cloud-init se retira fuera de /etc/netplan/: no basta con renombrarlo dentro del directorio, porque netplan lee cualquier .yaml.
Paso 3 — validar sin aplicar: sudo netplan generate y comprobar que devuelve 0.
Paso 4 — aplicar con red de seguridad: sudo netplan try. Antes de pulsar ENTER, comprueba desde la otra sesión que sigues teniendo acceso y que la aplicación responde. Solo entonces aceptas.
Paso 5 — medir después y comparar:
$ { ip -brief a; echo; ip r; echo; resolvectl status; echo; ss -tulpn; } > /tmp/red-actual.txt
$ sudo diff -u /root/red-referencia.txt /tmp/red-actual.txt
-default via 10.0.2.2 dev enp0s3 proto dhcp src 10.0.2.15 metric 100
+default via 10.0.2.2 dev enp0s3 proto static metric 100
- DNS Domain: ~.
+ DNS Domain: tramontana.exampleLo único que ha cambiado es lo que queríamos: la ruta pasa de proto dhcp a proto static y aparece el dominio de búsqueda. La IP es la misma y los servicios escuchan igual. Si el diff mostrara algo más, tendrías un problema que investigar ahora, no dentro de tres semanas.
Paso 6 — la prueba de fuego, reiniciar:
$ sudo reboot
$ ssh [email protected] 'ip -brief a show enp0s3; curl -sS -o /dev/null -w "%{http_code}\n" http://localhost:8080/salud'
enp0s3 UP 10.0.2.15/24 fe80::a00:27ff:fe4b:1c93/64
200Una configuración de red no está terminada hasta que sobrevive a un reinicio. Documenta el cambio en /opt/tramontana/HISTORIAL, como todo lo demás.
Errores Comunes y Consejos
- Tabuladores en el YAML. Es, con diferencia, el error número uno. Configura tu editor para que en
.yamlinserte espacios (:set expandtaben vim) y ejecuta siemprenetplan generateantes de aplicar. - Olvidar el CIDR en
addresses.- 10.0.2.15sin/24da un error de validación poco claro. La dirección siempre lleva su máscara. - Usar
netplan applyen una máquina remota. Si te equivocas, solo la recuperas por consola física o del hipervisor.netplan trycuesta lo mismo y perdona. - Editar
/etc/resolv.conf. Es un enlace a un fichero generado: tu cambio dura hasta el siguiente arranque. El DNS se cambia en netplan y se comprueba conresolvectl status. - Dejar activo el fichero de
cloud-init. Puede reescribir tu configuración en el arranque; desactívalo con99-disable-network-config.cfg. - Asignar una IP estática dentro del rango del DHCP. Tarde o temprano el servidor DHCP se la da a otro y tienes un conflicto intermitente y desesperante. Pide una reserva o un rango excluido.
- Consejo: guarda
/etc/netplan/en git junto a tus scripts. Es configuración de producción y merece historial, igual que las unidades de systemd.
Advertencia de seguridad y compliance: un cambio de direccionamiento en un servidor que trata datos personales de huéspedes afecta a reglas de cortafuegos, listas de control de acceso y registros de auditoría. En un entorno real se planifica con ventana de mantenimiento, se comunica a las personas responsables y lo revisa el responsable de seguridad. Nunca reconfigures ni escanees redes que no sean tuyas: aquí todo se hace sobre srv-tramontana, tu propia VM.
Ejercicios
- Doble comprobación antes de aplicar. Escribe la secuencia exacta de comandos para cambiar el DNS de
srv-tramontanade10.0.2.2a192.0.2.53, desde una sesión SSH, sin arriesgarte a perder la resolución de nombres. Incluye la verificación posterior. - Segunda dirección y ruta estática. Añade a
enp0s3la dirección10.0.2.16/24y una ruta hacia198.51.100.0/24a través de10.0.2.9, de forma persistente. Después demuestra, sin generar tráfico real, que un paquete a198.51.100.7saldrá por esa ruta y no por la de defecto. - Diagnóstico de un YAML roto. Al aplicar tu configuración obtienes
Error in network definition: enp0s3: unknown key 'gateway4'. Explica qué ha pasado, corrígelo y di por qué netplan no ha dejado la máquina sin red.
Soluciones
1. Un DNS que no responde deja la máquina «funcionando y muda», así que se trata con el mismo procedimiento que la IP:
$ sudo cp /etc/netplan/60-tramontana.yaml /root/60-tramontana.yaml.bak-$(date +%F)
$ sudo sed -i 's/addresses: \[10\.0\.2\.2\]/addresses: [192.0.2.53]/' /etc/netplan/60-tramontana.yaml
$ sudo diff -u /root/60-tramontana.yaml.bak-$(date +%F) /etc/netplan/60-tramontana.yaml
- addresses: [10.0.2.2]
+ addresses: [192.0.2.53]
$ sudo netplan generate && sudo netplan tryVerificación desde la sesión de seguridad, antes de pulsar ENTER:
$ resolvectl status | grep 'Current DNS'
Current DNS Server: 192.0.2.53
$ resolvectl flush-caches && resolvectl query reservas.tramontana.example
reservas.tramontana.example: 10.0.2.15 -- link: enp0s3Dos detalles: la copia va a /root y no a /etc/netplan/, porque cualquier fichero .yaml de ese directorio se lee (con .bak-fecha no lo sería, pero es mejor no depender de eso); y si el DNS nuevo no respondiera, netplan try revierte solo a los 120 segundos.
2. Se añade la dirección a la lista y la ruta al bloque routes:
addresses:
- 10.0.2.15/24
- 10.0.2.16/24
routes:
- to: default
via: 10.0.2.2
metric: 100
- to: 198.51.100.0/24
via: 10.0.2.9$ sudo netplan generate && sudo netplan try
$ ip -brief a show enp0s3
enp0s3 UP 10.0.2.15/24 10.0.2.16/24 fe80::a00:27ff:fe4b:1c93/64
$ ip route get 198.51.100.7
198.51.100.7 via 10.0.2.9 dev enp0s3 src 10.0.2.15 uid 1000ip route get interroga la tabla de rutas del kernel sin enviar ningún paquete: es la demostración exacta que pedía el enunciado. Si hubiera devuelto via 10.0.2.2, la ruta estática no se habría aplicado.
3. gateway4 era la clave clásica para la puerta de enlace y está eliminada en las versiones de netplan de Ubuntu 24.04. Su sustituto es una entrada en routes:
El cambio se hizo porque gateway4 solo permitía una puerta de enlace y no admitía métricas ni tablas alternativas; routes cubre todos los casos con la misma sintaxis. Y la máquina no se ha quedado sin red porque el error lo detectó el analizador de netplan en la fase de generate, antes de tocar nada: la configuración solo llega al kernel si el YAML es válido en su totalidad. Ese es exactamente el motivo por el que netplan generate va siempre antes que netplan try: separa los errores de sintaxis (baratos) de los de contenido (caros).
Conclusión
srv-tramontana ya no depende de un servidor DHCP para tener la dirección que su propio nombre de servicio anuncia. Has dejado la red escrita, versionada y verificada: un fichero de netplan con permisos 600, IP estática 10.0.2.15/24, puerta de enlace 10.0.2.2, DNS y dominio de búsqueda declarados, resolución a través de systemd-resolved y un procedimiento —medir, generate, try, comparar con diff -u, reiniciar— que puedes repetir en cualquier máquina sin sudar. Por el camino has visto por qué ip sirve para probar y no para configurar, por qué IPv6 se protege en vez de desactivarse, y cómo preguntarle al kernel por dónde saldrá un paquete concreto.
Pero fíjate en lo que acabas de hacer: has fijado una dirección estable y bien conocida para un servidor que acepta conexiones SSH con contraseña, permite entrar como root y ya acumula 47 intentos fallidos desde 203.0.113.44 en /var/log/btmp. Le has puesto un buzón permanente a una puerta que no tiene cerradura. En la lección siguiente, 06-02: SSH y Acceso Remoto, arreglas justamente eso: entenderás las tres fases del protocolo y qué significa de verdad la huella que te pide aceptar la primera vez, generarás claves ed25519, desterrarás la autenticación por contraseña, endurecerás sshd_config directiva por directiva sin quedarte fuera de la máquina, montarás túneles para llegar a la base de datos de Tramontana sin exponerla, y leerás con lastb quién lleva 47 intentos llamando a tu puerta.
Curso de Linux: De Principiante a Administrador de Sistemas
Módulo 1: Introducción a Linux
- ¿Qué es Linux?
- Historia de Linux
- Distribuciones de Linux
- Instalando Linux
- Primer Contacto con el Sistema
- Estructura del Sistema de Archivos de Linux
Módulo 2: Comandos Básicos de Linux
- Introducción a la Línea de Comandos
- Obtener Ayuda y Documentación del Sistema
- Navegando el Sistema de Archivos
- Operaciones con Archivos y Directorios
- Visualización y Edición de Archivos
- Enlaces Duros y Simbólicos
- Permisos y Propiedad de Archivos
Módulo 3: Habilidades Avanzadas en la Línea de Comandos
- El Entorno del Shell: Variables, Alias e Historial
- Uso de Comodines y Expresiones Regulares
- Búsqueda de Archivos y Contenido: find, locate y grep
- Tuberías y Redirección
- Procesamiento de Texto: cut, sort, uniq, sed y awk
- Gestión de Procesos
- Programación de Tareas con Cron
- Comandos de Redes
Módulo 4: Scripting en Shell
- Introducción al Scripting en Shell
- Variables y Tipos de Datos
- Entrada, Salida y Argumentos de un Script
- Estructuras de Control
- Funciones y Librerías
- Depuración y Manejo de Errores
- Scripts de Producción: Buenas Prácticas
Módulo 5: Administración del Sistema
- Gestión de Usuarios y Grupos
- sudo y Permisos Especiales
- Gestión de Paquetes
- Gestión de Discos
- systemd y la Gestión de Servicios
- Registros del Sistema: journald y syslog
- Monitoreo del Sistema y Optimización del Rendimiento
- Respaldo y Restauración
Módulo 6: Redes y Seguridad
- Configuración de Redes
- SSH y Acceso Remoto
- Firewall y Seguridad Perimetral
- Sistemas de Detección de Intrusos
- Gestión de Secretos y Certificados TLS
- Asegurando Sistemas Linux
Módulo 7: Temas Avanzados
- El Proceso de Arranque y la Recuperación del Sistema
- Diagnóstico Avanzado: strace, perf y eBPF
- Optimización del Kernel de Linux
- Virtualización con Linux
- Contenedores de Linux y Docker
- Automatización con Ansible
- Alta Disponibilidad y Balanceo de Carga
