Corrupção de porta usando iptables NAT no Enterprise Linux 6

Corrupção de porta usando iptables NAT no Enterprise Linux 6

Estou tentando configurar um redirecionamento de portal web cativo no CentOS usando a seguinte configuração:

Esta configuração funciona para os primeiros pacotes, mas de repente a porta de destino é corrompida na resposta do servidor. O rastreamento do pacote é assim:

Cliente: O host que faz a solicitação da web original. Servidor: Destino original da solicitação Portal: Servidor do portal cativo

Esse rastreamento de pacote é obtido de um local que pode ver o tráfego do cliente e do portal. As linhas que começam com c: são do lado do cliente e p: são do lado do 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?!?

Neste ponto, a conexão é mangueira. O cliente não espera um pacote nessa porta e envia um RST. O número da porta quebrada aumenta em 1 cada vez que esta conexão é tentada (presumivelmente funcionará uma vez daqui a 12 tentativas). Todas as retransmissões têm o mesmo número de porta quebrado na resposta. Não tenho ideia do que poderia estar causando isso.

Isso é um bug ou estou fazendo algo errado? Esta máquina tem uma configuração um tanto incomum. Está configurado como uma ponte. Para aplicar a regra NAT apenas aos pacotes que vão em uma única direção, os pacotes são marcados primeiro com uma regra NAT ebtables, e essa marca é verificada quando o NAT iptables é aplicado.

Isso está no Enterprise Linux 6 com Kernel 2.6.32-279.5.2.el6.x86_64

A regra NAT é:

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

ilb é a ponte.

informação relacionada