由于缺少 PSH 标志,AWS 的代理协议 v2 中断应用程序

AWS's Proxy Protocol v2 Breaking Application Due to Absence of PSH Flag

我有一个使用 Netty 构建的网络应用程序。该应用程序位于 Amazon 网络负载均衡器之后。

我现在希望能够检索原始客户端 IP 地址,因此我在网络负载平衡器上打开了代理协议 v2 设置。

不幸的是,这样做会破坏应用程序。

可以使用 nc 或 telnet 之类的终端通过终端与应用程序进行交互。

连接到应用程序时,用户通常会收到一条欢迎消息,然后提示输入查询以与应用程序交互。

启用代理协议 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

从上面可以看出,当Proxy Protocol v2打开时,数据包交换在第三次交换时停止,服务器永远不会发送第4次数据包交换,其中包含[PSH, ACK]当Proxy协议 v2 已关闭。

知道为什么会这样吗?为什么当代理协议 v2 打开时,带有 [PSH, ACK] 标志的数据包从不发送?关于如何解决这个问题的任何提示?

我们不得不联系 AWS 支持以帮助设置目标组属性 NLB 目标组 proxy_protocol_v2.client_to_server.header_placement 到 on_first_ack。

默认情况下尝试设置属性不起作用。但是一旦 AWS 启用它,更新属性的命令将如下所示:

“aws elbv2 modify-target-group-attributes --target-group-arn arn:aws:elasticloadbalancing:us-east-2*************************** --attributes ‘{“Value”: “on_first_ack”, “Key”: “proxy_protocol_v2.client_to_server.header_placement”}’ ”

对我们来说,这是由于我们的应用程序的性质,在建立连接后客户端不会发送任何数据,这不是开箱即用的,因为 headers 是延迟推送的.

您可以阅读此 link 以了解有关此行为的更多信息