리눅스에서 TCP 연결 끊기


49

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

->192.168.1.214:49029 (ESTABLISHED)

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

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


ss명령 사용에 대한 대답 은 다른 명령보다 훨씬 쉽고 일반적입니다.
nealmcb

답변:


35

원래 : 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)이 있으며 시스템에서 올바르게 구성된 경우 이러한 연결을 자동으로 닫아야합니다.


파일 디스크립터 (fd)로 TCP 소켓을 간단히 닫으면 작동합니까? 간부 FD> & -
알렉산더 Gonchiy

@AlexanderGonchiy 라이브 연결의 경우 프로세스가 패킷에 응답하지 못하므로 연결 시간이 초과 될 수 있습니다. 유휴 연결의 경우 아무 일도 일어나지 않습니다. 커널이 fd를 닫을 때 네트워크에 무언가를 보낼지 확실하지 않습니다.
Marki555

시퀀스 번호를 스니핑했습니다. 그럼 어떻게해야합니까?
user3132194

18

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

다음과 같은 것 :

$ sudo tcpkill -i wlan0 host 192.168.1.214

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


4
연결이 무언가를 전송하는 경우에만 작동합니다. 응답하지 않거나 유휴 상태 인 TCP 연결에는 작동하지 않습니다 (자세한 내용은 답변 참조)
Marki555

17

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

ss -K dst 192.168.1.214 dport = 49029

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


1
리눅스의 경우, 이것이 가장 좋은 방법이며 유휴 연결이있는 경우 거의 유일한 방법입니다 ( tcpkill작동 할 수 없음). 그러나, 나는 검사하지 않았다는 것을 인정하지만, killcx이러한 스푸핑 된 패킷을 허용하도록 iptables를 수정하지 않으면 많은 보안 소프트웨어가 작동하지 못하게하는 것처럼 느껴집니다.
세스 로버트슨

감사! sudo ss -K ....Ubuntu Bionic 18.04 LTS에서 매력처럼 작동했습니다 . 나는 한 tmux시간 초과 연결을 원격으로 인해 작은 화면 크기에 붙어 있지만, 죽은 아니라 한 과정을. 모든 고정!
nealmcb

6

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

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

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

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


8
나는 그 과정을 죽일 수 없다. 기어 맨 서버입니다. 연결을 닫고 싶습니다.
Vivek Goel

0

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

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

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