첫 번째 호스트에서는
root@xxx:~# netstat -natup | grep xxx
tcp 0 0 10.2.5.3:40740 xxx:10051 ESTABLISHED 1482/zabbix_proxy:
원격 호스트와 연결이 설정된 것을 확인할 수 있습니다.
root@xxx:~# ps -eo uid,pid,etime | grep 1482
106 1482 18-17:10:17
약 18일 동안 연결이 설정되었습니다. SSH를 통해 원격 호스트에 연결하고 다음을 실행하면:
root@xxx:~# netstat -natup | grep 10.2.5.3
항목이 절대 없습니다!
어떻게 이럴 수있어?
답변1
첫 번째 호스트가 트래픽을 시작하지 않으면 로컬 프로세스가 연결을 닫거나 원격 호스트가 연결을 닫을 때까지 연결은 영원히 "ESTABLISHED" 상태로 유지됩니다.
이제 호스트 간의 네트워크 중단을 상상해 보십시오. 원격 호스트의 패킷이 첫 번째 호스트에 도달할 수 없습니다. 이 중단 동안 원격 호스트는 첫 번째 호스트에서 ACK 패킷이 수신되지 않아 시간 초과되어 첫 번째 호스트에 무언가를 보내려고 시도합니다. 얼마 후 연결 시간이 초과되고 원격 호스트가 연결을 닫습니다. 그러나 첫 번째 호스트는 다른 호스트에서 무슨 일이 일어나고 있는지 전혀 모르므로 연결은 "ESTABLISHED" 상태로 유지됩니다.
원격 호스트에 정전이 발생하고 재부팅되는 경우에도 동일한 상황이 발생하며 기존 네트워크 연결을 먼저 종료할 수 없습니다.
이를 방지하려면 소켓 수준에서 tcp keepalive를 켜야 합니다. 이로 인해 호스트 간에 Keepalive 패킷이 정기적으로 교환되므로 정상적인 트래픽이 없는 경우에도 네트워크 중단을 감지할 수 있습니다.
답변2
첫째, 이 etime
필드는 프로세스가 시작된 시기를 나타냅니다. 이는 반드시 연결이 해당 시점에 바인딩되었음을 의미하지는 않습니다.
다음으로, 일종의 네트워크 주소 변환이 사용되고 있을까요? 그렇다면 grep
원격 호스트의 포트 번호를 입력하여 netstat -natup|grep 40740
반환되는 내용을 확인하십시오.