La caja que dice conexión rechazada
Un puerto es el número que nombra un programa dentro de una máquina. Un código de estado es el número con el que un servidor web dice cómo fue una petición. Leer los dos permite saber qué falló.
La caja de una tienda muestra un mensaje rojo: conexión rechazada. El lector de tarjetas está encendido y su cable está bien. El mensaje dice algo exacto: la caja llegó a la máquina, y allí nada esperaba en esa puerta.
Al final de esta lección
Nota
Puedo comprobar en qué puertos escucha una máquina y leer una respuesta web.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Puerto | un número que nombra una puerta de una máquina | 80 |
| Escuchando | esperando conexiones en un puerto | |
| HTTP | el lenguaje de las peticiones y respuestas web | |
| Código de estado | un número de tres cifras que dice cómo fue una petición | 200 |
| Cabecera | una línea de información extra en una petición o respuesta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un puerto es una puerta de la máquina
Una dirección encuentra una máquina. Un puerto encuentra un programa dentro de ella. Un servidor web espera en el puerto 80, y otro programa espera en otro puerto.
Un programa que espera en un puerto está escuchando. La orden ss -ltn lista todos los puertos que escuchan: l de listening, t de TCP y n para números sin traducir.
Lista lo que escucha la máquina LAN
sudo ip netns exec lan ss -ltnSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lista lo que escucha el servidor exterior
sudo ip netns exec srv ss -ltnSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Llama a un puerto para ver quién responde
Desde otra máquina, nc -zv llama a un puerto sin enviar nada. La z significa solo comprobar, y la v decir qué pasó.
Imprime uno de tres resultados, y la tabla de abajo dice qué significa cada uno.
Llama a un puerto abierto
sudo ip netns exec gw nc -zv -w 2 10.0.0.2 80Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Llama a un puerto donde nadie escucha
sudo ip netns exec gw nc -zv -w 2 10.0.0.2 9999Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: qué dice una llamada
| nc imprime | Qué significa | Dónde mirar |
|---|---|---|
| succeeded | Un programa escucha | El propio programa |
| Connection refused | La máquina respondió y nadie escucha ahí | Si el programa funciona, y en qué puerto |
| timed out | No volvió ninguna respuesta | Un cortafuegos, o una ruta que falla |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una respuesta web tiene tres partes
Una petición web es texto sencillo. La respuesta también, en tres partes: una línea de código de estado, unas cabeceras y luego el cuerpo.
El código de estado dice cómo fue. La primera cifra da la familia. Un 2 es éxito y un 3 es un traslado. Un 4 es un error de quien pide, y un 5 es un error del servidor.
Lee una respuesta entera, con cabeceras
sudo ip netns exec gw curl --noproxy '*' -s -i -m 3 http://10.0.0.2/Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Imprime solo el código de estado
sudo ip netns exec gw curl --noproxy '*' -s -o /dev/null -w '%{http_code}\n' http://10.0.0.2:8081/Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: las familias de código
| Código | Familia | En palabras sencillas |
|---|---|---|
| 200 | 2xx | Funcionó, y aquí está la página |
| 301 | 3xx | Se movió: pide esta otra dirección |
| 404 | 4xx | No hay nada en esa ruta |
| 503 | 5xx | El servidor no pudo hacerlo ahora |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Envía una petición a mano
printf 'GET /hello HTTP/1.0\r\n\r\n' | sudo ip netns exec gw nc -w 2 10.0.0.2 80Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que el puerto 80 es la web y que ningún otro puerto puede serlo. Un puerto es un número que alguien eligió, y 80 es solo la elección habitual para HTTP. El servidor exterior habla HTTP en el puerto 8000. Pregunta qué escucha, y hazle una pregunta.
Para ir más lejos: encuentra el proceso
Ejecuta sudo ip netns exec lan ss -ltnp y lee la última columna de cada línea. Nombra el programa que tiene el puerto.
¿Qué programa escucha en el puerto 80? ¿Es el mismo proceso que tiene el 8081? ¿Por qué te ayudaría eso cuando un puerto ya está ocupado?