1. Transferir ficheros al servidor
Durante años, la forma habitual de publicar una web fue subir los ficheros por FTP, y todavía lo verás en muchos alojamientos compartidos. FTP es uno de los protocolos más antiguos de internet (1971) y tiene un problema grave: envía el usuario, la contraseña y los ficheros sin cifrar. Cualquiera que escuche la red puede leerlos.
FTP usa dos conexiones: una de control (puerto 21) para los comandos y otra de datos para cada transferencia. En el modo activo, es el servidor quien abre la conexión de datos hacia el cliente, algo que los cortafuegos y el NAT de casa suelen bloquear; en el modo pasivo, el cliente abre ambas, y por eso es el que se usa casi siempre (el servidor debe tener abierto un rango de puertos para ello).
| Protocolo | Cifrado | Puertos | Cuándo usarlo |
|---|---|---|---|
| FTP | No | 21 y un rango para datos | Solo en redes internas o si no hay alternativa |
| FTPS | Sí, FTP sobre TLS | 21 (o 990) y rango de datos | Cuando hay que mantener FTP por compatibilidad |
| SFTP | Sí, sobre SSH | 22 | La opción recomendada: un solo puerto y la seguridad de SSH |
| scp / rsync | Sí, sobre SSH | 22 | Copias y sincronizaciones desde la terminal o scripts |
Un servidor FTP con vsftpd
Si necesitas montar un servidor FTP, vsftpd (very secure FTP daemon) es el más usado en Linux. Lo esencial de su configuración es desactivar el acceso anónimo, encerrar a cada usuario en su carpeta (chroot), fijar el rango de puertos pasivos y, a ser posible, obligar a usar TLS.
1anonymous_enable=NO
2local_enable=YES
3write_enable=YES
4chroot_local_user=YES # cada usuario, encerrado en su carpeta
5allow_writeable_chroot=YES
6pasv_min_port=40000
7pasv_max_port=40100 # abre este rango en el cortafuegos
8ssl_enable=YES # FTPS
9force_local_logins_ssl=YES
10force_local_data_ssl=YES
11rsa_cert_file=/etc/ssl/certs/ftp.pemY hoy, ni FTP ni SFTP
git push y un sistema de integración continua construye y despliega la aplicación (lo verás en el último tema). SFTP queda para tareas puntuales, como subir un fichero de datos o descargar registros.2. DNS: la agenda de internet
Los ordenadores se comunican con direcciones IP, pero las personas recordamos nombres. El DNS (Domain Name System) traduce unos en otras. Es una base de datos repartida por todo el mundo y organizada en árbol: los servidores raíz saben quién gestiona .es, los de .es saben quién gestiona tienda.es, y los servidores autoritativos de tienda.es tienen las respuestas definitivas.
Resolver un nombre es preguntar por una dirección
| Registro | Para qué | Ejemplo |
|---|---|---|
| A / AAAA | Nombre → dirección IPv4 / IPv6 | api IN A 203.0.113.20 |
| CNAME | Alias de otro nombre | www IN CNAME @ |
| MX | Servidores de correo, con prioridad | @ IN MX 10 correo.tienda.es. |
| TXT | Texto libre: verificaciones, SPF, DKIM | @ IN TXT "v=spf1 mx -all" |
| NS | Servidores autoritativos de la zona | @ IN NS ns1.tienda.es. |
| SOA | Datos de la zona: servidor principal, número de serie, tiempos | Uno por zona, al principio |
1$ORIGIN tienda.es.
2$TTL 3600
3@ IN SOA ns1.tienda.es. admin.tienda.es. (2025093001 7200 3600 1209600 3600)
4@ IN NS ns1.tienda.es.
5@ IN A 203.0.113.10
6www IN CNAME @
7api IN A 203.0.113.20
8@ IN MX 10 correo.tienda.es.
9correo IN A 203.0.113.30En un fichero de zona de BIND, @ representa el propio dominio, y un nombre sin punto final es relativo: api significa api.tienda.es.. Olvidar el punto final en un nombre completo es un error clásico: correo.tienda.es sin punto se convierte en correo.tienda.es.tienda.es.. Cada vez que cambies la zona hay que aumentar el número de serie del SOA para que los servidores secundarios se actualicen.
Comprobar el DNS
1dig www.tienda.es # respuesta completa, con TTL
2dig +short tienda.es MX # solo los servidores de correo
3dig @ns1.tienda.es tienda.es SOA # preguntar directamente al autoritativo
4nslookup api.tienda.es # alternativa disponible también en WindowsEn la práctica, la mayoría de proyectos no montan su propio BIND: el registrador donde compras el dominio (o servicios como Cloudflare) ofrece un panel donde creas esos mismos registros. Lo que sí es imprescindible es entenderlos, porque un despliegue que «no funciona» muchas veces es un registro DNS mal puesto o un TTL que todavía no ha caducado.
3. Servicios de directorio: LDAP
En una empresa con cientos de empleados, no tiene sentido que cada aplicación guarde sus propios usuarios y contraseñas. Un servicio de directorio centraliza las cuentas, los grupos y sus datos, y las aplicaciones le preguntan. LDAP es el protocolo para consultarlo; OpenLDAP y el Active Directory de Microsoft son las implementaciones más habituales.
Los datos de un directorio se organizan en árbol, y cada entrada se identifica por su nombre distinguido (DN), que recorre el árbol desde la hoja: uid=ana,ou=personas,dc=tienda,dc=es. Las aplicaciones web pueden autenticar contra él: el servidor web o la aplicación comprueba el usuario y la contraseña haciendo un bind contra el directorio, y consulta los grupos para autorizar.
1<Location /intranet>
2 AuthType Basic
3 AuthName "Intranet"
4 AuthBasicProvider ldap
5 AuthLDAPURL "ldaps://ldap.tienda.es/ou=personas,dc=tienda,dc=es?uid"
6 Require ldap-group cn=empleados,ou=grupos,dc=tienda,dc=es
7</Location>4. Cuando la aplicación «no carga»: diagnosticar la red
Un método ordenado ahorra mucho tiempo. Ve de abajo arriba, comprobando cada capa antes de pasar a la siguiente:
- DNS: ¿resuelve el nombre a la IP correcta?
dig +short dominio. - Conectividad: ¿se llega a la máquina?
ping(si no está filtrado) otraceroute. - Puerto: ¿está abierto y escuchando?
nc -zv dominio 443desde fuera yss -tlnpen el servidor. - TLS: ¿el certificado es válido para ese nombre y no ha caducado?
curl -vI https://dominio. - Servidor web: ¿qué código devuelve y qué dice el registro de errores?
- Aplicación: ¿está en marcha?
systemctl statusodocker ps, y sus registros.
5. Retos
El primer reto interpreta un fichero de zona como lo haría un servidor DNS, resolviendo los nombres relativos; el segundo vigila la caducidad de los certificados, una de las causas más tontas (y más frecuentes) de caída de una web.
Retos de Bash en el IDE
Escribe el script y pulsa Ejecutar tests: se ejecuta en un Linux real con Bash y se prueba con varios casos, algunos ocultos.
La entrada es un fichero de zona de BIND con una directiva $ORIGIN. Muestra los registros A, AAAA, CNAME y MX, en su orden, con el nombre completo: «www.tienda.com. CNAME tienda.com.». «@» es el propio origen; un nombre que no termina en punto es relativo y se le añade el origen (también en el destino de un CNAME). En los MX muestra la prioridad y el servidor: «tienda.com. MX 10 correo.tienda.com.». Ignora comentarios (;), directivas y otros tipos. Termina con «Registros: N».
La primera línea es la fecha de hoy (AAAA-MM-DD) y las siguientes, «dominio fecha_de_caducidad». Por cada certificado caducado escribe «CADUCADO dominio»; por cada uno que caduque en 30 días o menos, «RENOVAR dominio (N días)»; los demás no se muestran. Termina con «Revisados: N».