Enterprise Linux 6에서 iptables NAT를 사용한 포트 손상

Enterprise Linux 6에서 iptables NAT를 사용한 포트 손상

다음 구성을 사용하여 CentOS에서 캡티브 웹 포털 리디렉션을 설정하려고 합니다.

이 구성은 처음 몇 개의 패킷에는 작동하지만 갑자기 서버의 응답으로 대상 포트가 손상됩니다. 패킷 추적은 다음과 같습니다.

클라이언트: 원래 웹 요청을 수행하는 호스트입니다. 서버: 요청의 원래 대상 포털: 종속 포털 서버

이 패킷 추적은 클라이언트와 포털 트래픽을 모두 볼 수 있는 위치에서 가져옵니다. c:로 시작하는 줄은 클라이언트 측에서, p:는 포털 측에서 가져온 것입니다.

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?!?

이 시점에서 연결이 호스로 연결됩니다. 클라이언트는 해당 포트에서 패킷을 기대하지 않고 RST를 보냅니다. 끊어진 포트 번호는 이 연결이 시도될 때마다 1씩 증가합니다(아마 지금부터 12번 시도하면 작동할 것입니다). 모든 재전송에는 응답에서 동일한 손상된 포트 번호가 있습니다. 나는 이 문제의 원인이 무엇인지 전혀 모릅니다.

이것은 버그입니까, 아니면 제가 뭔가 잘못하고 있습니까? 이 기계는 다소 특이한 구성을 가지고 있습니다. 브리지로 구성됩니다. 단일 방향으로 가는 패킷에만 NAT 규칙을 적용하기 위해 해당 패킷에 먼저 ebtables NAT 규칙을 표시하고, iptables NAT를 적용할 때 해당 표시를 확인합니다.

이는 커널 2.6.32-279.5.2.el6.x86_64를 사용하는 Enterprise Linux 6에 있습니다.

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는 다리입니다.

관련 정보