Linux Networking: “three-way handshake”
Para establecer una conexión, TCP utiliza lo que se conoce como negociación en tres pasos (three-way handshake). Antes de que un cliente intente conectar con un servidor, se necesita que el servidor este escuchando por conexiones en un puerto que se encuentre abierto para ello, esto se llama una apertura pasiva (passive open), se debe verificar que el servidor-destino ofrezca el servicio activo y esté aceptando peticiones en el número de puerto que el cliente intenta usar para la sesión. Una vez que se establece la apertura pasiva, un cliente puede iniciar una apertura activa (active open).
Al establecer una negociación en tres pasos ocurre lo siguiente:
- SYN: La apertura activa es iniciada por el cliente que envía un SYN al servidor. El cliente establece el número de secuencia del segmento a un valor al azar A.
- SYN-ACK: En respuesta, el servidor responde con un SYN-ACK. El número de acuse de recibo se fija a uno más que el número de secuencia recibido, por ejemplo, A+1 y el número de secuencia que el servidor elige para el paquete es otro número aleatorio, por ejemplo, puede ser B.
En caso de que el servidor no se encuentre escuchando en ese puerto, se puede regresar al cliente un paquete de respuesta con el bit RST activado, lo que significa el rechazo del intento de conexión. - ACK: Por último, el cliente envía un ACK de regreso al servidor. El número de secuencia se fija al número de acuse de recibo A+1 y el número de acuse de recibo se fija a uno más que el número de secuencia recibido es decir, B+1.
Establecimiento de conexión
Alcanzada esta fase, tanto el cliente como el servidor reconocen la conexión. Se puede decir que:
- Las fases 1, 2 establecen el parámetro de conexión (número de secuencia) para una dirección y se reconoce el acuse de recibo.
- Las fases 2, 3 establecen el parámetro de conexión (número de secuencia) para la otra dirección y se reconoce el acuse de recibo. Con esto es que se establece una comunicación conocida como “full-duplex”.
sudo wireshark&
De la misma manera se puede usar (es mejor crear un grupo y darle sus permisos necesarios):
gksu wireshark
Seguidamente seleccionar la interface, empezar a capturar y luego ingresar el siguiente filtro:
(ip.dst == IP_EXTERNA && ip.src == IP_LOCAL) || (ip.dst == IP_LOCAL && ip.src == IP_EXTERNA) && tcp.port == 80
Usar tcpdump es un poco más divertido:
tcpdump -i eth1 -nN -c 15 ‘(tcp) and (((src host IP_LOCAL) and (dst host IP_EXTERNA)) or ((src host IP_EXTERNA) and (dst host IP_LOCAL))) and (port 80)’