TCP 소켓 시간 초과를 만드는 방법


20

서버 환경의 네트워크 재앙 시뮬레이션을 위해 의도적으로 TCP 소켓을 시간 초과하는 방법을 찾고 있습니다. 기존 소켓에 대한 간단한 방법이 있습니까? 또한 작은 C 테스트 케이스 프로그램은 플러스입니다.

TCP 버퍼 읽기 및 연결이 끊어진 마운트 된 리소스 (samba)에서 읽는 동안 네트워크 인터페이스를 종료하려고 시도했습니다.

테스트 서버는 Ubuntu 12.04.4입니다.

답변:


19

종료 연결이 시간 초과되도록하려면을 사용할 수 있습니다 iptables. DROP비활성화하려는 포트 에서 규칙을 활성화하십시오 . 따라서 Samaba 서버의 시간 초과를 시뮬레이션하려면 활성 연결이 설정된 상태에서 서버에서 다음을 실행하십시오.

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

DROP대상은 회신하지 않습니다 RST패킷 또는 ICMP패킷의 보낸 사람에게 오류입니다. 클라이언트는 서버로부터 패킷 수신을 중지하고 결국 시간 종료됩니다.

iptables구성한 경우 / 방법에 따라 규칙을 규칙 INPUT세트에 더 높게 삽입 할 수 있습니다 .


netcat (데이터 듣기 / 보내기)을 사용하여 이것을 시도하고 영원히 기다렸습니다 ... 시간 초과 없음 : / 그리고 데이터가 삭제되었음을 확인할 수 있습니다. 난 변경 /proc/sys/net/ipv4/tcp_keepalive_time정말 소수
er453r

@ er453r 은 ncat -v정확한 출력을 사용 하여 정확히 무엇을하는지 보십시오 ncat. 바닐라 우분투 12.04 설치에서 2m7.291s가 시간 초과되었습니다.
Creek

맞습니다-첫 번째 테스트 중에 소켓을 통해 아무것도 보내지 않았습니다. 나는 마침내 타임 아웃을 마스터하고 아래에 자세히 설명했습니다 :)
er453r

16

첫 번째 대답은 정확하지만이 시간 초과가 어떻게 작동하는지 발견 했으므로 관찰하고 테스트 할 수 있습니다 (포트를 차단하는 것을 잊지 마십시오!).

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

이제 두 가지 시나리오가 있습니다.

  1. 소켓이 열리고 전송을 시도한 후 (다른 쪽에서 응답이없는 경우) 시스템이 재 시도 tcp_retries2합니다. 기본값 인 은퇴는 2 분 이상 걸리고 소켓 시간이 초과됩니다.

  2. 소켓이 열리고 유휴 상태이므로 keepalive 제한이 흥미 롭습니다. 유휴 소켓을 사용하면 시스템이 tcp_keepalive_time몇 초 동안 대기 한 후 몇 초 tcp_keepalive_probes간격으로 TCP KEEPALIVE를 전송 하려고 시도 tcp_keepalive_intvl합니다. 그리고 그 후에 만 ​​소켓이 시간 초과됩니다.


1
또한netstat -o
er453r
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.