고객 사이트에서 네트워크 팀은 클라이언트와 서버 사이에 방화벽을 추가했습니다. 이로 인해 약 40 분의 유휴 시간이 지나면 유휴 연결이 끊어집니다. 네트워크 사람들은 방화벽에 유휴 연결 시간 초과가 없다고 말하지만 사실 유휴 연결이 끊어졌습니다.
이 문제를 해결하기 위해 먼저 tcp_keepalive_time = 300, tcp_keepalive_intvl = 300 및 tcp_keepalive_probes = 30000으로 TCP keepalives가 설정된 서버 (Linux 시스템)를 구성했습니다. 이것은 작동하며 연결은 며칠 이상 지속 가능합니다. 그러나 서버가 죽은 클라이언트를 감지하고 연결을 끊기를 원하기 때문에 설정이 time = 300, intvl = 180, probe = 10으로 변경되었습니다. 클라이언트가 실제로 살아 있다면 서버는 300 대마다 검색 할 것이라고 생각했습니다. (5 분) 클라이언트가 ACK로 응답하면 방화벽이이를 유휴 연결로보고 종료하지 못하게합니다. 클라이언트가 작동 중지 된 경우 10 번의 프로브 후 서버는 연결을 중단합니다. 놀랍게도 유휴 상태이지만 활성 상태 인 연결은 이전과 같이 약 40 분 후에 종료됩니다.
클라이언트 측에서 실행중인 Wireshark는 서버에서 Keepalives가 활성화 된 경우에도 서버와 클라이언트 사이에 Keepalives가 전혀 표시되지 않습니다.
여기서 무슨 일이 일어날 수 있습니까?
서버의 keepalive 설정이 time = 300, intvl = 180, probes = 10 인 경우 클라이언트가 활성 상태이지만 유휴 상태 인 경우 서버는 300 초마다 keepalive 프로브를 보내고 연결을 그대로 둡니다. 클라이언트가 죽었을 때, 300 초 후에 하나를 보내고 연결을 끊기 전에 180 초마다 9 개의 프로브를 더 보냅니다. 내가 맞아?
한 가지 가능성은 방화벽이 서버에서 keepalive 프로브를 가로 채서 클라이언트에 전달하지 못하는 것입니다. 그리고 프로브가 있다는 사실로 인해 연결이 활성화되었다고 생각할 수 있습니다. 방화벽의 일반적인 동작입니까? 우리는 어떤 종류의 방화벽이 관련되어 있는지 모릅니다.
서버는 Teradata 노드이고 Teradata 클라이언트 유틸리티에서 서버 측 포트 1025 인 데이터베이스 서버로의 연결이지만 SSH 연결에서도 동일한 문제가 발생하여 모든 TCP 연결에 영향을 준다고 생각합니다.