리눅스에서 TCP 연결 끊기 명령 줄에서 이러한 옵션을 종료하는 방법이

클라이언트 시스템이 작동하지 않으면 하나의 응용 프로그램에서 연결이 끊겼습니다.

->192.168.1.214:49029 (ESTABLISHED)

서버를 다시 시작하지 않고 Linux 명령 줄에서 이러한 옵션을 종료하는 방법이 있습니까?

검색 후 tcpkill이라는 솔루션을 찾았습니다. 그러나 그것은 나를 위해 작동하지 않습니다. IP를 영구적으로 차단합니다.



답변

원래 : http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html

소켓을 “킬 (kill)”하려면 TCP 재설정 패킷을 보내야합니다. 그것을 보내려면 (그리고 다른 쪽에서 받아들이려면), 실제 TCP 시퀀스 번호를 알아야합니다.

1) 이미 언급 한 tcpkill방법은 네트워크에서 수동으로 스니핑하고이 연결의 유효한 패킷이 도착할 때까지 대기하여 SEQ 번호를 학습합니다. 그런 다음 학습 된 SEQ 번호를 사용하여 RSET 패킷을 양쪽에 보냅니다. 그러나 연결이 유휴 / 중단되어 있고 데이터 흐름이 없으면 아무런 작업도 수행하지 않고 영원히 기다립니다.

2) 다른 방법은 killcx( Sourceforge 링크 ) 라는 perl 스크립트를 사용합니다 . 이것은 스푸핑 된 SYN 패킷을 적극적으로 보내고 응답에서 SEQ 번호를 학습합니다. 그런 다음와 같은 방식으로 RSET 패킷을 보냅니다 tcpkill.

또는 달성하려는 것을 기반으로 한 접근법은 gdb디버거 를 사용 하여이 소켓 / 연결을 소유하는 프로세스에 연결 close()하고이 답변에 설명 된대로 대신 syscall을 발행 하는 입니다.

중단 된 연결 만 처리하려는 경우 (다른 쪽이 종료 된 경우) 다양한 시간 제한 (예 : TCP keepalive)이 있으며 시스템에서 올바르게 구성된 경우 이러한 연결을 자동으로 닫아야합니다.


답변

tcpkill당신을 위해 그것을 할 수 있습니다. 우분투에서는 dsniff패키지에 있습니다.

다음과 같은 것 :

$ sudo tcpkill -i wlan0 host 192.168.1.214

(또는 tcpdump죽일 연결에 대한 다른 유사한 표현).


답변

리눅스 커널> = 4.9에서는 ssiproute2 의 명령을 키와 함께 사용할 수 있습니다-K

ss -K dst 192.168.1.214 dport = 49029

커널은 CONFIG_INET_DIAG_DESTROY옵션을 활성화 하여 컴파일해야합니다 .


답변

루트로하십시오 netstat -tunp|grep 49029. 출력의 마지막 열에는 해당 연결을 담당하는 프로세스의 PID 및 프로그램 이름이 표시되어야합니다.

운이 좋으면 해당 연결에 대한 단일 프로세스가 있습니다.

운이 좋지 않으면 더 복잡해집니다 (PID는 하나의 연결 이상을 담당합니다). 이것은 어떤 종류의 서비스입니까?

왜 그 세션을 끝내고 싶습니까?


답변

tcpkill연결이 끊어진 연결을 닫을 수 없습니다. 그것은 기반 libpcap이며, 전송 된 FIN패킷 으로 패킷을 구성합니다 . 연결이 이미 종료 된 경우 올바른 시퀀스 번호를 얻을 수 없습니다.

유일한 방법은 프로세스를 닫는 것이므로 어디에서나 SPOF가 아닙니다.