У меня есть сервер приложений Amazon Linux 2 с приложением Spring Boot в частной подсети. Перед этим сервером приложений в общедоступной подсети находится шлюз Nat. Приложение отправляет запрос с заголовком Connection: keep-alive на удаленный хост, а удаленный хост возвращает ответ с тем же заголовком. Итак, я вижу установленное соединение через netstat.
netstat -t | grep <remote server ip>
tcp6 0 0 ip-172-30-4-31.eu:57324 <remote server ip>:http ESTABLISHED
Из-за отсутствия трафика в течение 350 секунд шлюз Nat закрывает соединение в соответствии с этим документом: https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-troubleshooting.html#nat-gateway-troubleshooting-timeout соединение все еще находится в состоянии «Установлено» на сервере приложений, поэтому следующий запрос к удаленному серверу дает мне:
java.net.SocketException: Connection reset
Я попытался внести изменения на сервере приложения в sysctl.conf, чтобы закрыть соединение почти одновременно с Nat Gateway:
net.ipv4.tcp_keepalive_time=351
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=2
Но ничего не происходит, и сброс трафика с сервера приложений на удаленный сервер через tcpdump не дает мне пакетов keep-alive. Итак, что я могу сделать, чтобы избежать этой проблемы, кроме удаления заголовка Connection в моем приложении?