如何通过Windows命令行关闭TCP和UDP端口


160

有人知道如何通过Windows命令行为单个连接关闭TCP或UDP套接字吗?

谷歌搜索,我看到有些人问同样的事情。但是答案看起来像是netstat或netsh命令的手册页,重点放在如何监视端口上。我不想要有关如何监视它们的答案(我已经这样做了)。我想关闭/杀死它们。

编辑,为澄清起见:假设我的服务器侦听TCP端口80。客户端建立连接,并为其分配端口56789。然后,我发现该连接是不希望有的(例如,该用户在做坏事,我们要求他们停止连接,但是连接并没有在途中掉线)。通常,我会添加防火墙来完成这项工作,但这需要一些时间,而且我处于紧急情况下。在这里杀死拥有连接的进程确实不是一个好主意,因为这将导致服务器瘫痪(当我们只想选择性地和暂时地删除该连接时,所有用户都将失去功能)。


1
为什么?您无法从命令行或文件中关闭端口。您必须关闭拥有它们的程序。还是指防火墙操作?您的问题仍然不清楚。
罗恩侯爵,

9
我可以理解反对票。但是为什么要进行密切投票?这个问题是合理的。
维克多·斯塔夫萨

37
@EJP:这是一个真实的问题,因为我在问些什么并且期待一个答案(即使答案是欺骗性的“不,你不能那样做”)。而且,它得到了回答,我接受了答案。而且,即使您的“无法完成”也是一个有效的答案。因此,这个问题是正确的。
维克多·斯塔夫萨

1
@EJP,请不要这样回答,我们这里有足够多的人,他们以一种或另一种形式基本上说:“如果您知道答案,您将不会问这个问题”-我确定您可以看到愚蠢的人其中。
Chalky

Answers:


65

是的,这是可能的。您不必是拥有套接字的当前进程即可关闭它。考虑一下,远程机器,网卡,网络电缆和您的OS都可能导致套接字关闭。

还请考虑Fiddler和Desktop VPN软件可以将自身插入网络堆栈,并向您显示所有流量或重新路由所有流量。

因此,您真正需要的是Windows提供直接允许该功能的API,或者某人编写了某种类似于VPN或Fiddler的程序,并为您提供了一种方法来关闭通过它的套接字。

至少有一个程序(CurrPorts)可以做到这一点,我今天使用它的目的是为了关闭在CurrPorts启动之前启动的进程上的特定套接字。为此,您必须以管理员身份运行它。

请注意,可能不太容易导致程序不监听端口(当然,可以,但是该功能被称为防火墙...),但是我认为这并不是必需的。我相信问题是“我如何有选择地关闭与程序正在侦听的端口的一个活动连接(套接字)?”。这个问题的措辞有点过头,因为给出了不希望的入站客户端连接的端口号,并且将其称为“端口”,但是很显然,它是对那个套接字的引用,而不是对监听端口的引用。


3
是的,CP是一个很棒的工具:CurrPorts.exe / close <本地地址> <本地端口> <远程地址> <远程端口> {进程名称}这行是:CurrPorts.exe / close * 56789 * *服务器。 exe
JasonXA 2014年

CurrPorts似乎无法关闭来自某个进程的UDP多播连接
george_h 2015年

143
  1. 打开 cmd

    • 输入 netstat -a -n -o

    • 查找TCP [the IP address]:[port number] .... #[target_PID]#(UDP的同上)

    • (顺便说一句,kill [target_PID]对我没用)

  2. Ctrl + Alt + Delete并选择“启动任务管理器”

    • 点击“流程”标签

    • 通过以下方式启用“ PID”列:查看>选择列>选中PID复选框

    • 找到感兴趣的PID和“结束过程”

  3. 现在,您可以在[IP地址]:[端口号]上重新运行服务器,而不会出现问题


8
您要说的只是杀死服务器进程并重新运行它,这是我要避免的事情,因为这将断开与服务器的所有连接,而不仅仅是不希望的连接。
Victor Stafusa

7
抱歉,我没有帮助解决您的特定问题。我只是在提供我的答案,因为我在谷歌搜索如何简单地关闭Windows端口时出现了您的问题,并认为这也可能对遇到我问题的其他人有所帮助。:)
李浩琪

2
@HaoQiLi,您不能只是简单地结束一切。例如System,处理Windows网络连接的过程。
和平者

2
@HaoQiLi我认为关闭可以使用taskkill /pid 6168 /f6168是pid
Madhawa Priyashantha

9
当问题明确指出单连接而不是整个过程时,这个答案很荒谬!
迈克

59

例如对于您想要释放端口8080然后,请按照下列命令。

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

做完了!


5
谢谢 只有您的解决方案对我有所帮助。
vvator

1
正确,这有助于在尝试查找PID时实际打印出PID。(这些人是谁?)。
阿德里安M.17年

3
这也杀死了提到的pid的过程,而不仅仅是关闭端口。
NDestiny

1
这是有帮助的。
Tural Asgar

我在Windows 10上进行了测试,它不会单独杀死TCP连接,而是会杀死使用它的整个进程或线程。正如维克多(Victor)所说,这不是他的目标。
塞巴斯蒂安

53

如果知道要释放的端口,则可以通过查找specif端口对netstat列表进行排序,如下所示:

netstat -ano | findstr :8080

然后,该pid将显示在您可以使用taskkill杀死的绑定中。

在此处输入图片说明

taskkill/pid 11704 /F

你可能也想看看这个问题, 这是专门为本地主机,但我认为这是相关的:


我在Windows 10上进行了测试,它不会单独杀死TCP连接,而是会杀死使用它的整个进程或线程。正如维克多(Victor)所说,这不是他的目标。
塞巴斯蒂安

27

使用TCPView(http://technet.microsoft.com/zh-cn/sysinternals/bb897437.aspx)或CurrPorts(http://www.nirsoft.net/utils/cports.html)。

或者,如果您不想使用外部软件(这些工具不需要安装),则只需先运行netstat命令(最好是netstat -b),然后设置本地安全策略来阻止IP有问题的用户机器的地址,这就是我一直在处理不需要的或什至未知的连接-无需任何外部软件即可完成所有操作(Windows附带的所有功能)...


2
这是正确的答案,并且完全支持Microsoft。
Dan Bonachea 2014年

也为我工作。我在本地计算机上使用了本地安全策略-> IPSecurity策略。用户界面非常直观。
Puterdo Borato

1
尝试了一下,ipv6的关闭连接显示为灰色,如果有,关闭ipv6的替代方法是什么?
jjxtra

23

尝试使用sysinternals / microsoft工具tcpview(gui)和Tcpvcon(命令行)


7

如果不关闭拥有这些套接字的进程,就无法关闭套接字。 套接字由打开它们的进程所拥有。因此,找出Unix / Linux的进程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

从字面上看,杀死会杀死该进程及其所拥有的任何子进程。使用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关闭服务。您可以在Windows上像Linux / Unix一样使用netstat来识别PID。

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


他澄清了自己的问题,即远程客户端套接字,可以使用其他工具指出的方法关闭该客户端套接字。这个答案主要集中在不能(不能在操作系统内部摆弄)的服务器套接字上。这是清除包含服务器套接字的进程的方法,如果这是端口,则要执行此操作。但是,如果您有很多到服务器的传入连接,那就是另外一种情况,您肯定可以杀死它们。只是不完全符合OP的要求,这没错。
chubbsondubs 2015年

您应该删除“杀死进程”部分,因为它不能解决问题。您也可以停止网络适配器以停止通信,但它仍然不能仅杀死套接字!
塞巴斯蒂安

答案仅对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/


那是比您以前的答案更好的答案!谢谢!
塞巴斯蒂安



1

为了关闭端口,您可以确定正在侦听此端口的进程并终止该进程。


2
@Victor,我看到了,但是没有办法关闭端口就无法强行关闭端口。另一种可能性是编写服务器程序,使您可以在监视和管理客户端时使用某种控制面板。
Darin Dimitrov

1
另外,如果关闭了正在侦听套接字的接口,则套接字将关闭。
rustyx 2015年

我相信他在要求一个例子。
EyoelD

@rustyx谢谢!那就是我在阅读所有“杀死进程”答案之后的想法……但是他的答案只是一个建议,因此对我来说还可以(但不是一个很好的答案),其他答案就像没有办法。
塞巴斯蒂安

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替换IP,并在需要时添加其他规则。


0

即时/可行/部分答案https : //stackoverflow.com/a/20130959/2584794

与之前的答案不同,在以前的答案中使用netstat -a -o -n的情况令人难以置信,很长的列表没有使用这些名称的应用程序名称港口


5
这几乎与李浩琪的回答是一样的。这将导致服务器进程丢弃每个连接,而不仅仅是不想要的连接。面临的挑战是只丢弃不希望的一个,仅此而已。
Victor Stafusa 2013年

我同意维克多。那不是问题的答案。因此,您也可以禁用网络适配器...
Sebastian

-3

是的,可以关闭TCP或UDP端口,DOS中有一个命令

TASKKILL /f /pid 1234 

我希望这对你有用


我在Windows 10上进行了测试,它不会单独杀死TCP连接,而是会杀死使用它的整个进程或线程。正如维克多(Victor)所说,这不是他的目标。
塞巴斯蒂安

-3

如果您是在Windows 8,Windows Server 2012或更高版本上运行并安装了PowerShell v4或更高版本,则可以使用以下脚本。这将找到与端口关联的进程并终止它们。

#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连接,而是会杀死使用它的整个进程或线程。正如维克多(Victor)所说,这不是他的目标。
塞巴斯蒂安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.