Windows 명령 행을 통해 TCP 및 UDP 포트를 닫는 방법


160

누군가 Windows 명령 줄을 통해 단일 연결을 위해 TCP 또는 UDP 소켓을 닫는 방법을 알고 있습니까?

이것에 대해 인터넷 검색을하면서 일부 사람들이 같은 것을 요구하는 것을 보았습니다. 그러나 답변은 포트를 모니터링하는 방법에 초점을 맞춘 netstat 또는 netsh 명령의 수동 페이지처럼 보였습니다. 모니터링 방법에 대한 답변을 원하지 않습니다 (이미 수행함). 닫고 죽이고 싶습니다.

설명을 위해 편집 : 내 서버가 TCP 포트 80을 수신한다고 가정 해 봅시다. 클라이언트가 연결하고 포트 56789가 할당됩니다. 그런 다음이 연결이 바람직하지 않다는 것을 발견했습니다 (예 :이 사용자가 나쁜 일을하고 있습니다. 중지하도록 요청했지만 연결이 끊어지지 않았습니다). 일반적으로 작업을 수행하기 위해 방화벽을 추가하지만 다소 시간이 걸리며 긴급 상황에 처했습니다. 연결을 소유하는 프로세스를 종료하면 서버를 다운시킬 수 있기 때문에 여기에서 실제로 나쁜 생각입니다 (이 연결 하나만 선택적으로 일시적으로 삭제하려고하면 모든 사용자가 기능을 잃게됩니다).


1
왜? 명령 행이나 파일에서 포트를 닫을 수 없습니다. 자신이 소유 한 프로그램을 닫아야합니다. 아니면 방화벽 작동을 말하는 것입니까? 귀하의 질문은 불분명합니다.
Lorne의 후작

9
다운 투표를 이해할 수 있습니다. 그러나 왜 가까운 투표? 이 질문은 합법적입니다.
Victor Stafusa

37
@ EJP : 뭔가를 요구하고 답변을 기대했기 때문에 실제 질문입니다 (답이 기만적 인 "아니오, 당신은 할 수 없습니다"). 그리고 답을 얻었고 나는 대답을 받아 들였습니다. 더군다나 "그것은 할 수 없습니다"도 유효한 답변입니다. 따라서이 질문은 유효합니다.
Victor Stafusa

1
@ EJP는 그렇게 대답하지 마십시오. 우리는 여기에 여러 가지 형태로 기본적으로 '당신이 대답을 알고 있다면 그 질문을하지 않을 것입니다'라고 말하는 충분한 사람들이 있습니다-나는 당신이 어리 석음을 볼 수 있다고 확신합니다 그것의.
Chalky

답변:


65

예, 가능합니다. 소켓을 소유하기 위해 소켓을 소유 한 현재 프로세스 일 필요는 없습니다. 원격 시스템, 네트워크 카드, 네트워크 케이블 및 OS가 모두 소켓을 닫을 수있는 순간을 고려하십시오.

Fiddler 및 Desktop VPN 소프트웨어는 네트워크 스택에 자신을 삽입하고 모든 트래픽을 표시하거나 모든 트래픽을 다시 라우팅 할 수 있습니다.

따라서 실제로 필요한 것은 Windows가 직접 API를 제공하거나 누군가 VPN이나 ​​Fiddler처럼 작동하는 프로그램을 작성하여 통과하는 소켓을 닫을 수있는 방법입니다.

정확히 이것을 수행하는 적어도 하나의 프로그램 ( CurrPorts )이 있으며 CurrPorts가 시작되기 전에 시작된 프로세스에서 특정 소켓을 닫기 위해 오늘 사용했습니다. 이를 위해서는 물론 관리자 권한으로 실행해야합니다.

프로그램이 포트에서 수신 대기하지 않게하는 것은 아마도 불가능할 수도 있습니다 (물론 가능하지만 기능은 방화벽이라고합니다 ...). 문제는 "프로그램이 수신하는 포트에 대한 하나의 활성 연결 (소켓)을 선택적으로 닫는 방법"이라고 생각합니다. 원치 않는 인바운드 클라이언트 연결에 대한 포트 번호가 제공되고 "포트"라고 불려 지므로 질문의 문구는 약간 벗어났습니다.


3
예, CP는 훌륭한 도구입니다. CurrPorts.exe / close <로컬 주소> <로컬 포트> <원격 주소> <원격 포트> {프로세스 이름}이 줄은 CurrPorts.exe / close * 56789 * * 서버입니다. exe
JasonXA

CurrPorts는 프로세스에서 오는 UDP 멀티 캐스트 연결을 닫을 수없는 것 같습니다
george_h

143
  1. 열다 cmd

    • 입력 netstat -a -n -o

    • 찾기 TCP [the IP address]:[port number] .... #[target_PID]#(UDP의 경우에는 구분)

    • (Btw, kill [target_PID]나를 위해 일 하지 않았다)

  2. Ctrl + Alt + Delete를 누르고 "작업 관리자 시작"을 선택하십시오.

    • "프로세스"탭을 클릭하십시오

    • 다음으로 이동하여 "PID"열을 활성화하십시오.보기> 열 선택> PID 확인란 선택

    • 관심있는 PID 및 "END PROCESS"찾기

  3. 이제 문제없이 [IP 주소] : [포트 번호]에서 서버를 다시 실행할 수 있습니다.


8
당신이 말하고있는 것은 단지 서버 프로세스를 종료하고 다시 실행하는 것입니다. 원치 않는 것이 아니라 서버에 대한 모든 연결을 끊을 수 있기 때문에 피하고 싶었습니다.
Victor Stafusa

7
특정 질문을 해결하는 데 도움이되지 않았습니다. Windows 포트를 닫는 방법에 대해 인터넷 검색을 할 때 질문이 표시되어 내 문제가있는 다른 사람들에게 도움이 될 것이라고 생각하면서 내 대답을 제공했습니다. :)
HaoQi Li

2
@HaoQiLi, 당신은 단순히 모든 것을 막을 수 없습니다. 예를 들어 SystemWindows 네트워크 연결을 처리하는 프로세스입니다.
Pacerier

2
@HaoQiLi 나는 우리가 taskkill /pid 6168 /f6168 을 사용할 수있는 폐쇄 생각 pid
Madhawa Priyashantha

9
의문의 여지 없이이 답변에는 전체 프로세스가 아니라 단일 연결이 명확하게 표시되면 많은 찬사를 보냅니다!
Mike

59

예를 들어 포트 8080을 해제하려면 다음 명령을 따르십시오.

 netstat -ano
 taskkill /f /im [PID of the port 8080 got from previous command]

끝난!


5
고맙습니다. 귀하의 솔루션 만 도움이되었습니다.
vvator

1
PID를 찾으려고 할 때 실제로 PID를 인쇄하는 데 도움이됩니다. (이 사람들은 누구 니?).
Adrian M.

3
이것은 또한 포트를 닫는 것이 아니라 pid 언급 된 프로세스를 죽이고 있습니다.
NDestiny

1
도움이됩니다.
Tural Asgar

Windows 10에서 테스트했으며 TCP 연결 만 죽이지 않고 전체 프로세스 또는 스레드를 사용합니다. 빅터가 말한 것처럼 그의 목표는 아닙니다.
Sebastian

53

해제하려는 포트를 알고 있으면 다음과 같이 특정 포트를 찾아 netstat 목록을 정렬 할 수 있습니다.

netstat -ano | findstr :8080

그러면 pid는 rigth에 나타나서 taskkill으로 죽일 수 있습니다.

여기에 이미지 설명을 입력하십시오

taskkill/pid 11704 /F

또한 localhost에 대한 이 질문 을보고 싶을 수도 있지만 관련이 있다고 생각합니다.


Windows 10에서 테스트했으며 TCP 연결 만 죽이지 않고 전체 프로세스 또는 스레드를 사용합니다. 빅터가 말한 것처럼 그의 목표는 아닙니다.
Sebastian

27

TCPView ( http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx ) 또는 CurrPorts ( http://www.nirsoft.net/utils/cports.html )를 사용하십시오.

또는 EXTERNAL SOFTWARE를 사용하지 않으려는 경우 (이 도구는 설치를 필요로하지 않음) 먼저 netstat 명령 (바람직하게 netstat -b)을 실행 한 다음 로컬 보안 정책을 설정하여 IP를 차단할 수 있습니다 문제가되는 사용자 컴퓨터의 주소, 그것은 원치 않거나 알 수없는 연결로 수행 한 것입니다-외부 소프트웨어없이 모든 것을 할 수 있습니다 (Windows와 함께 제공되는 모든 것) ...


2
정답이며 완전히 Microsoft를 지원합니다.
Dan Bonachea

나를 위해 일했습니다. 로컬 컴퓨터에서 로컬 보안 정책-> IP 보안 정책을 사용했습니다. UI는 매우 직관적입니다.
Puterdo Borato

1
이것을 시도했지만 ipv6에 대한 닫기 연결이 회색으로 표시됩니다. ipv6을 닫는 대안은 무엇입니까?
jjxtra

23

sysinternals / microsoft 도구 인 tcpview (gui) 및 Tcpvcon (명령 줄)을 사용해보십시오.


7

해당 소켓을 소유 한 프로세스를 종료하지 않으면 소켓을 닫을 수 없습니다. 소켓은 열린 프로세스에서 소유합니다. 따라서 유닉스 / 리눅스의 프로세스 ID (PID)를 찾으십시오. 다음과 같이 netstat를 사용하십시오.

netstat -a -n -p -l

다음과 같이 인쇄됩니다.

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     PID/Program name   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN     1879/sendmail: acce 
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN     1860/xinetd         

-a는 모든 소켓을 인쇄하고, -n은 포트 번호를, -p는 PID를, -l은 수신중인 항목 만 표시합니다 (이후에 따라 선택 사항 임).

실제 정보는 PID입니다. 이제 다음을 수행하여 해당 프로세스를 종료 할 수 있습니다.

kill 1879

서비스를 종료하는 경우 다음을 사용하는 것이 좋습니다.

service sendmail stop

Kill은 문자 그대로 해당 프로세스와 소유 한 모든 자식 만 죽입니다. service 명령을 사용하면 init.d 디렉토리에 등록 된 종료 스크립트가 실행됩니다. 서비스에서 kill을 사용하면 제대로 종료되지 않아 제대로 시작되지 않을 수 있습니다. 그것은 단지 서비스에 달려 있습니다.

불행히도 Mac은 이런 점에서 Linux / Unix와 다릅니다. netstat를 사용할 수 없습니다. Mac에 관심이 있다면이 튜토리얼을 읽으십시오.

http://www.tech-recipes.com/rx/227/find-out-which-process-is-holding-which-socket-open/

그리고 Windows를 사용하는 경우 TaskManager를 사용하여 프로세스를 종료하고 서비스 UI를 사용하여 서비스를 종료하십시오. Linux / Unix와 마찬가지로 Windows에서 netstat를 사용하여 PID를 식별 할 수 있습니다.

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true


그는 다른 클라이언트가 지적한 것처럼 다른 도구로 닫을 수있는 원격 클라이언트 소켓이라는 그의 질문에 대해 설명했습니다. 이 답변은 대부분 서버 소켓에 초점을 맞추고 있습니다 (OS 내부를 다루지 않고). 이것이 포트 인 경우에 원하는 서버 소켓을 소유 한 프로세스를 깨끗하게 종료하는 방법입니다. 그러나 서버에 들어오는 연결이 많이있는 경우 상황이 다르므로 확실히 죽일 수 있습니다. OP가 요구 한 것만 큼 잘못된 것은 아닙니다.
chubbsondubs

"프로세스 종료"부분은 질문에 대한 답변이 아니므로 제거해야합니다. 또한 트래픽을 중지하기 위해 네트워크 어댑터를 중지 할 수 있지만 여전히 소켓 만 종료하지는 않습니다!
Sebastian

대답은 ipv6의 경우에만 정확합니다. ipv4의 경우 SetTcpEntry
jjxtra

5

CurrPorts 사용 (무료 및 설치 안 됨) : http://www.nirsoft.net/utils/cports.html

/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}

예 :

# Close all connections with remote port 80 and remote address 192.168.1.10: 
/close * * 192.168.1.10 80
# Close all connections with remote port 80 (for all remote addresses): 
/close * * * 80
# Close all connections to remote address 192.168.20.30: 
/close * * 192.168.20.30 *
# Close all connections with local port 80: 
/close * 80 * *
# Close all connections of Firefox with remote port 80: 
/close * * * 80 firefox.exe

또한 검색 및 필터 기능을 갖춘 멋진 GUI 가 있습니다.

참고 :이 답변은 huntharo이며 JasonXA의 답변과 의견은 독자가 쉽게 사용할 수 있도록 정리되고 단순화되었습니다. 예는 CurrPorts 웹 페이지에서 제공됩니다.


3

해당 소켓을 소유하지 않고 서버의 소켓을 닫을 수 없으므로 서버 소켓을 소유 한 프로세스에서 코드를 실행하지 않고 실제로 소켓을 닫을 수 없습니다.

그러나 클라이언트가 소켓을 닫으라고 알려주는 다른 옵션이 있습니다. 클라이언트가 연결중인 포트에 RST TCP 패킷을 보내면 클라이언트가 연결을 끊습니다. nmap을 사용하여 RST 스캐닝으로이를 수행 할 수 있습니다.

http://nmap.org/


이전 답변보다 훨씬 나은 답변입니다! 감사합니다!
Sebastian


2

wkillcx 는 언급되지 않은 명령 줄에서 TCP 연결을 종료하기위한 안정적인 Windows 명령 줄 도구입니다. 그래도 연결 수가 많은 서버에는 문제가 있습니다. 때때로 대화식 종료에 tcpview를 사용하지만 스크립트에서 wkillcx를 사용할 수 있습니다.



1

포트닫으려면 이 포트에서 수신중인 프로세스를 식별하고이 프로세스 를 종료 할 수 있습니다.


2
@ 빅터, 나는 그것을 보았지만 프로세스를 중단시키지 않고 강제로 포트를 닫을 수있는 방법이 없습니다. 또 다른 가능성은 클라이언트를 모니터하고 관리 할 때 일종의 제어판이있는 방식으로 서버 프로그램을 작성하는 것입니다.
Darin Dimitrov

1
또한 소켓이 수신 대기중인 인터페이스가 중단되면 소켓이 닫힙니다.
rustyx

나는 그가 예를 요구하고 있다고 생각합니다.
EyoelD

@rustyx 감사합니다! 그것이이 "프로세스 죽이기"답변을 모두 읽은 후에 제가 생각한 것입니다. 그러나 그의 대답은 단지 제안 일뿐입니다.
Sebastian

1

sysinternal의 tcpview와 같은 프로그램을 사용할 수 있습니다. 원하지 않는 연결을 모니터링하고 종료하는 데 많은 도움이 될 수 있습니다.


1

CurrPorts는 우리에게는 효과가 없었으며 ssh를 통해서만 서버에 액세스 할 수 있었으므로 TCPView도 없습니다. 다른 연결을 끊지 않기 위해 프로세스를 종료 할 수 없습니다. 우리가 끝내고 아직 제안하지 않은 것은 Windows 방화벽에서 연결을 차단하는 것이 었습니다. 예, 이는 규칙에 맞는 모든 연결을 차단 하지만 우리의 경우 단일 연결 (관심있는 연결)이있었습니다.

netsh advfirewall firewall add rule name="Conn hotfix" dir=out action=block protocol=T
CP remoteip=192.168.38.13

IP를 필요한 것으로 바꾸고 필요한 경우 다른 규칙을 추가하십시오.


0

인스턴트 / 실현 가능 / 부분 답변 : https :

//.com/a/20130959/2584794 netstat -a -o -n이 엄청나게 긴 목록 을 사용한 이전 답변과는 달리 응용 프로그램 이름을 사용하지 않고 긴 목록 을 살펴 보았습니다. 포트


5
이것은 HaoQi Li의 답변과 거의 동일합니다. 이것은 원하지 않는 연결뿐만 아니라 모든 연결을 끊는 서버 프로세스를 중단시킵니다. 문제는 원치 않는 것을 포기하는 것입니다.
Victor Stafusa

나는 Victor에 동의합니다. 그것은 그 질문에 대한 답이 아닙니다. 따라서 네트워크 어댑터를 비활성화 할 수도 있습니다.
Sebastian

-3

예, TCP 또는 UDP 포트를 닫을 수 있습니다 .DOS에 명령이 있습니다.

TASKKILL /f /pid 1234 

나는 이것이 당신을 위해 작동하기를 바랍니다


Windows 10에서 테스트했으며 TCP 연결 만 죽이지 않고 전체 프로세스 또는 스레드를 사용합니다. 빅터가 말한 것처럼 그의 목표는 아닙니다.
Sebastian

-3

PowerShell v4 이상이 설치된 Windows 8, Windows Server 2012 이상에서 실행중인 경우 아래 스크립트를 사용할 수 있습니다. 포트와 관련된 프로세스를 찾아 종료합니다.

암호

#which port do you want to kill
[int]$portOfInterest = 80

#fetch the process ids related to this port
[int[]]$processId = Get-NetTCPConnection -LocalPort $portOfInterest | 
    Select-Object -ExpandProperty OwningProcess -Unique | 
    Where-Object {$_ -gt 0} 

#kill those processes
Stop-Process -Id $processId 

선적 서류 비치:


Windows 10에서 테스트했으며 TCP 연결 만 죽이지 않고 전체 프로세스 또는 스레드를 사용합니다. 빅터가 말한 것처럼 그의 목표는 아닙니다.
Sebastian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.