Приложение AWS Proxy Protocol v2, нарушающее работу приложения из-за отсутствия флага PSH

У меня есть сетевое приложение, созданное с использованием Netty. Приложение стоит за балансировщиком сетевой нагрузки Amazon.

Теперь я хочу получить исходный IP-адрес клиента, поэтому я включил параметр Proxy Protocol v2 в балансировщике сетевой нагрузки.

К сожалению, это нарушает работу приложения.

С приложением можно взаимодействовать через терминал, используя что-то вроде nc или telnet.

При подключении к приложению пользователь обычно получает приветственное сообщение, а затем приглашение ввести запрос для взаимодействия с приложением.

Когда протокол Proxy Protocol v2 включен, при подключении приветственное сообщение больше не записывается клиенту, вместо этого клиент видит что-то вроде этого:

      telnet -4 app.host 43
Trying <IP ADDRESS>...
Connected to some_network_lb.elb.eu-west-1.amazonaws.com.
Escape character is '^]'.

захватив сетевой пакет, я заметил разницу между отключением прокси-протокола v2 (приложение работает нормально) и включенным (приложение не работает нормально)

Когда протокол Proxy v2 выключен, взаимодействие пакетов можно резюмировать следующим образом:

      No.     Time           Source                Destination           Protocol Length Info                                                            port
      1 0.000000       SOURCE-IP        DEST-IP        TCP      78     57059 → 43 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=64 TSval=1158853985 TSecr=0 SACK_PERM=1 43

No.     Time           Source                Destination           Protocol Length Info                                                            port
      2 0.034526       DEST-IP         SOURCE-IP        TCP      74     43 → 57059 [SYN, ACK] Seq=0 Ack=1 Win=26847 Len=0 MSS=1420 SACK_PERM=1 TSval=3185991482 TSecr=1158853985 WS=128 57059

No.     Time           Source                Destination           Protocol Length Info                                                            port
      3 0.034556       SOURCE-IP        DEST-IP          TCP      66     57059 → 43 [ACK] Seq=1 Ack=1 Win=132352 Len=0 TSval=1158854019 TSecr=3185991482 43

No.     Time           Source                Destination           Protocol Length Info                                                            port
      4 0.067278       DEST-IP         SOURCE-IP        TCP      264    43 → 57059 [PSH, ACK] Seq=1 Ack=1 Win=26880 Len=198 TSval=3185991515 TSecr=1158854019 [TCP segment of a reassembled PDU] 57059

No.     Time           Source                Destination           Protocol Length Info                                                            port
      5 0.067301       SOURCE-IP        DEST-IP          TCP      66     57059 → 43 [ACK] Seq=1 Ack=199 Win=132096 Len=0 TSval=1158854051 TSecr=3185991515 43

А когда включен протокол Proxy v2, взаимодействие пакетов можно резюмировать следующим образом:

      No.     Time           Source                Destination           Protocol Length Info                                                            port
      1 0.000000       SOURCE-IP        DEST-IP        TCP      78     55871 → 43 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=64 TSval=1158086997 TSecr=0 SACK_PERM=1 43

No.     Time           Source                Destination           Protocol Length Info                                                            port
      2 0.040204       DEST-IP        SOURCE-IP        TCP      74     43 → 55871 [SYN, ACK] Seq=0 Ack=1 Win=26847 Len=0 MSS=1420 SACK_PERM=1 TSval=3185217396 TSecr=1158086997 WS=128 55871

No.     Time           Source                Destination           Protocol Length Info                                                            port
      3 0.040227       SOURCE-IP        DEST-IP        TCP      66     55871 → 43 [ACK] Seq=1 Ack=1 Win=132352 Len=0 TSval=1158087035 TSecr=3185217396 43

Как видно выше, когда включен протокол прокси v2, обмен пакетами останавливается на третьем обмене, и сервер никогда не отправляет 4-й обмен пакетами, который содержит, когда протокол прокси v2 выключен.

Есть идеи, почему это происходит? Почему так, пакет с флаг никогда не отправляется, когда включен протокол прокси v2? И какие-нибудь советы, как это исправить?

1 ответ

Решение

Нам пришлось обратиться в службу поддержки AWS, чтобы помочь установить атрибут целевой группы. proxy_protocol_v2.client_to_server.header_placement to on_first_ack в целевой группе NLB.

Для нас это было связано с характером нашего приложения, в котором данные не отправляются от клиента после того, как соединение установлено, и это не работает из коробки, потому что заголовки помещаются лениво.

Вы можете прочитать эту ссылку для получения дополнительной информации об этом поведении

Другие вопросы по тегам