답변:
원래 : 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)이 있으며 시스템에서 올바르게 구성된 경우 이러한 연결을 자동으로 닫아야합니다.
리눅스 커널> = 4.9에서는 ss
iproute2 의 명령을 키와 함께 사용할 수 있습니다-K
ss -K dst 192.168.1.214 dport = 49029
커널은 CONFIG_INET_DIAG_DESTROY
옵션을 활성화 하여 컴파일해야합니다 .
tcpkill
작동 할 수 없음). 그러나, 나는 검사하지 않았다는 것을 인정하지만, killcx
이러한 스푸핑 된 패킷을 허용하도록 iptables를 수정하지 않으면 많은 보안 소프트웨어가 작동하지 못하게하는 것처럼 느껴집니다.
sudo ss -K ....
Ubuntu Bionic 18.04 LTS에서 매력처럼 작동했습니다 . 나는 한 tmux
시간 초과 연결을 원격으로 인해 작은 화면 크기에 붙어 있지만, 죽은 아니라 한 과정을. 모든 고정!
루트로하십시오 netstat -tunp|grep 49029
. 출력의 마지막 열에는 해당 연결을 담당하는 프로세스의 PID 및 프로그램 이름이 표시되어야합니다.
운이 좋으면 해당 연결에 대한 단일 프로세스가 있습니다.
운이 좋지 않으면 더 복잡해집니다 (PID는 하나의 연결 이상을 담당합니다). 이것은 어떤 종류의 서비스입니까?
왜 그 세션을 끝내고 싶습니까?
ss
명령 사용에 대한 대답 은 다른 명령보다 훨씬 쉽고 일반적입니다.