우리 서버 환경의 네트워크 재해 시뮬레이션을 위해 TCP 소켓을 의도적으로 시간 초과하는 방법을 찾고 있습니다. 기존 소켓을 쉽게 사용할 수 있는 방법이 있나요? 또한 작은 C 테스트 케이스 프로그램이 장점이 될 것입니다.
TCP 버퍼를 읽고 연결이 끊긴 설치 리소스(Samba)에서 읽는 동안 네트워크 인터페이스를 닫으려고 했습니다.
테스트 서버는 Ubuntu 12.04.4입니다.
답변1
기존 연결이 시간 초과되도록 하려면 를 사용할 수 있습니다 iptables
. DROP
비활성화하려는 포트에서 규칙을 활성화하기 만 하면 됩니다 . 따라서 활성 연결이 설정될 때 Samaba 서버 시간 초과를 시뮬레이션하려면 서버에서 다음 명령을 실행하십시오.
sudo iptables -A INPUT -p tcp --dport 445 -j DROP
대상은 DROP
패킷 보낸 사람에게 RST
패킷이나 오류로 응답하지 않습니다. ICMP
클라이언트는 서버로부터 패킷 수신을 중단하고 결국 시간 초과됩니다.
구성 여부/방법에 따라 규칙 세트의 상위에 iptables
규칙을 삽입할 수 있습니다 .INPUT
답변2
첫 번째 대답은 정확하지만 이러한 시간 초과가 어떻게 작동하는지 알아냈으므로 이를 관찰하고 테스트할 수 있습니다(포트를 차단하는 것을 잊지 마세요!).
TCP 시간 초과를 처리하기 위한 가장 흥미로운 커널 매개변수는 4가지가 있습니다.
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2
현재 2가지 상황이 있습니다:
소켓이 열리고 전송이 시도됩니다. 그런 다음 (상대방이 응답하지 않으면) 시스템이
tcp_retries2
여러 번 재시도합니다. 기본값인 "retires"를 사용하면 2분 이상 걸리고 소켓 시간이 초과됩니다.소켓이 열려 있고 유휴 상태입니다. 그러면 연결 유지 제한이 흥미로워집니다. 유휴 소켓의 경우 시스템은 몇 초 간격으로 TCP KEEPALIVE를 전송
tcp_keepalive_time
하기 전에 몇 초를 기다립니다 . 모든 오류가 발생한 후에만 소켓 시간이 초과됩니다.tcp_keepalive_probes
tcp_keepalive_intvl