
Я пытаюсь настроить перенаправление веб-портала Captive на CentOS, используя следующую конфигурацию:
Эта конфигурация работает для первых нескольких пакетов, но затем внезапно порт назначения оказывается поврежденным в ответе сервера. Трассировка пакета выглядит так:
Клиент: Хост, выполняющий исходный веб-запрос. Сервер: Исходное место назначения для запроса. Портал: Сервер портала Captive.
Этот пакетный след взят из места, которое может видеть как клиентский, так и порталальный трафик. Строки, начинающиеся с 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 только к пакетам, идущим в одном направлении, пакеты сначала помечаются правилом NAT ebtables, и эта отметка проверяется при применении NAT iptables.
Это на Enterprise Linux 6 с ядром 2.6.32-279.5.2.el6.x86_64
Правило 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 — это мост.