Corrupción de puertos usando iptables NAT en Enterprise Linux 6

Corrupción de puertos usando iptables NAT en Enterprise Linux 6

Estoy intentando configurar una redirección de portal web cautivo en CentOS usando la siguiente configuración:

Esta configuración funciona para los primeros paquetes, pero de repente el puerto de destino se daña en la respuesta del servidor. El seguimiento del paquete se ve así:

Cliente: el anfitrión que realiza la solicitud web original. Servidor: Destino original de la solicitud Portal: Servidor de portal cautivo

Este seguimiento de paquetes se toma de un lugar que puede ver tanto el tráfico del cliente como del portal. Las líneas que comienzan con c: son del lado del cliente y p: son del lado del portal.

c: client:57877 -> server:80 [SYN]
p: client:1092 -> portal:80 [SYN]  NAT adjusted SYN
p: portal:80 -> client:1092 [SYN, ACK]
c: server:80 -> client:57877 [SYN, ACL] NAT reversed on the SYN/ACK
c: client:57877 -> server:80 [ACK]
c: client:57877 -> server:80 HTTP GET
p: client:1092 -> portal:80 [ACK]
p: client:1092 -> portal:80 HTTP GET
p: portal:80 -> client:1092 [ACK]
c: server:68 -> client:57877 [ACK]
          ^^ WTF?!?

En este punto la conexión está manguerada. El cliente no espera ningún paquete en ese puerto y envía un RST. El número de puerto roto aumenta en 1 cada vez que se intenta esta conexión (presumiblemente funcionará una vez dentro de 12 intentos). Todas las retransmisiones tienen el mismo número de puerto roto en la respuesta. No tengo idea de qué podría estar causando esto.

¿Es esto un error o estoy haciendo algo mal? Esta máquina tiene una configuración algo inusual. Está configurado como puente. Para aplicar la regla NAT solo a paquetes que van en una sola dirección, los paquetes se marcan primero con una regla NAT de ebtables, y esa marca se verifica cuando se aplica la NAT de iptables.

Esto está en Enterprise Linux 6 con Kernel 2.6.32-279.5.2.el6.x86_64

La regla NAT es:

target     prot opt in     out     source               destination         
DNAT       tcp  --  ilb    any     anywhere             anywhere            multiport dports http,https mark match 0x8 to:<portal IP>

ilb es el puente.

información relacionada