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

235

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

通过搜索,我看到一些人问同样的问题。但答案看起来像是netstat或netsh命令的手册,重点是如何监视端口。我不需要关于如何监视它们的答案(我已经在这方面做到了),我想要关闭/终止它们。

编辑,为了澄清:假设我的服务器侦听TCP端口80。客户端建立连接,端口56789被分配给它。然后,我发现这种连接是不必要的(例如,该用户正在做坏事,我们要求他们停止,但连接在某个地方没有断开)。通常,我会添加防火墙来完成这项工作,但这需要一些时间,而我处于紧急情况下。在这里杀死拥有连接的进程真的是一个糟糕的主意,因为这将使服务器崩溃(所有用户将失去功能,而我们只想选择性和暂时地中断这一个连接)。


1
为什么?你无法通过命令行或文件关闭端口。你必须关闭拥有它们的程序。或者你是在指防火墙操作吗?你的问题仍然不清楚。 - user207421
这两个得票最多的答案是错误的(我给它们投了反对票)。 正确且被接受的答案在这里:https://stackoverflow.com/a/14626532/540552 - undefined
18个回答

172
  1. 打开cmd

    • 键入netstat -a -n -o

    • 查找TCP [IP地址]:[端口号] .... #[目标进程ID]# (UDP同理)

    • (顺带一提,kill [目标进程ID]对我没有用)

  2. 按下CTRL+ALT+DELETE并选择“启动任务管理器”

    • 点击“进程”选项卡

    • 通过以下方法启用“PID”列: 视图 > 选择列 > 选中PID的框

    • 找到所需的PID并“结束进程”

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


20
你说的是要杀掉服务器进程并重新运行,这正是我想避免的,因为这将导致所有连接都断开,而不只是不需要的连接。 - Victor Stafusa - BozoNaCadeia
8
抱歉我没有帮助解决你的具体问题。当我在谷歌搜索如何简单关闭Windows端口时,看到了你的问题,想着这可能对其他遇到同样问题的人有所帮助,于是提供了我的答案。 :) - HaoQi Li
3
@HaoQiLi,你不能简单地终止所有一切。例如处理Windows网络连接的“System”进程。 - Pacerier
3
@HaoQiLi 我认为我们可以使用 taskkill /pid 6168 /f 来关闭进程,其中的 6168 是进程 ID。 - Madhawa Priyashantha
22
这个回答明显是针对“单一连接”而不是整个过程,可笑的是它却获得了如此多的赞同! - Mike
请注意,在Windows中,“-a”不会显示所有端口,您需要使用“-q”来包括那些处于“BOUND”状态的端口。 - Martin Lyne

154
如果您知道要释放的端口,可以通过查找特定端口来对netstat列表进行排序,如下所示:
netstat -ano | findstr :8080

然后,进程 ID 将显示在右侧,您可以使用 taskkill 命令结束它。

输入图像描述

taskkill /pid 11704 /F

另外,您可能希望查看这个问题,该问题专门针对本地主机,但我认为它是相关的:


7
我在Windows 10上进行了测试,它不仅会终止TCP连接,还会终止正在使用该连接的整个进程或线程。正如Victor所说,这并不是他的目标。 - Sebastian
netstat -ano | findstr :8090 taskkill /PID 40144 /F - saber tabatabaee yazdi

82

是的,这是可能的。关闭套接字时,您不必是拥有它的当前进程。请考虑一下,远程机器、网络卡、网络电缆和操作系统都可以导致套接字关闭。

还要考虑到 Fiddler 和桌面 VPN 软件可以插入到网络堆栈中并显示所有流量或重定向所有流量。

因此,您实际上只需要 Windows 提供直接允许此操作的 API,或者有人编写了类似 VPN 或 Fiddler 的程序,并为您提供了一种通过它关闭传递的套接字的方法。

至少有一个程序(CurrPorts)完全可以做到这一点,今天我就用它来关闭在 CurrPorts 启动之前启动的进程上的特定套接字。当然,要以管理员身份运行它。

请注意,可能不容易使程序不侦听端口(嗯,这是可能的,但该功能被称为防火墙...),但我认为这里询问的问题不是那个。我认为问题是“如何有选择地关闭我的程序正在侦听的端口上的一个活动连接(套接字)?”。 问题的措辞有些不对,因为给出了一个不需要的入站客户端连接的端口号,并将其称为“端口”,但很明显这是对那个套接字的引用,而不是监听端口。


4
是的,CP是一个非常好用的工具:CurrPorts.exe /close <本地地址> <本地端口> <远程地址> <远程端口> {进程名称}以下是需要翻译的一行内容: CurrPorts.exe /close * 56789 * * server.exe - JasonXA
CurrPorts似乎无法关闭来自进程的UDP组播连接。 - george_h

79

例如,假设您想释放端口8080,则执行以下命令。

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

完成!


1
对,当你试图定位PID时,实际上打印出PID是有帮助的。(这些人是谁?) - Adrian M.
8
这也会使得被提及的进程(pid)停止运行,而不仅仅是关闭端口。 - NDestiny
2
我在Windows 10上进行了测试,它不仅会终止TCP连接,还会终止使用该连接的整个进程或线程。正如Victor所说,这并不是他的目标。 - Sebastian

35

使用TCPView:http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
或者使用CurrPorts:https://www.nirsoft.net/utils/cports.html

另外,如果您不想使用外部软件(这些工具顺便说一下不需要安装),您可以简单地首先运行 netstat 命令(最好是 netstat -b),然后设置本地安全策略来阻止疑问用户机器的 IP 地址连接,这就是我一直在处理不必要甚至未知连接时所做的——这样可以在没有任何外部软件的情况下完成所有操作(所有东西都自带于 Windows 中)…


对我也起作用了。我使用了本地安全策略->本地计算机上的IP安全策略。用户界面非常直观。 - Puterdo Borato
1
我试过了,关闭IPv6的连接选项是灰色的,如果有的话,有什么替代方法可以关闭IPv6? - jjxtra
Process Hacker(貌似现在叫System Informer)也有这个功能。最新版本在此:https://processhacker.sourceforge.io/nightly.php - mprost

30

9

使用CurrPorts(免费且无需安装):http://www.nirsoft.net/utils/cports.html

/close <本地地址> <本地端口> <远程地址> <远程端口> {进程名称}

示例:

# 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的网页。


7

如果您想关闭套接字,就必须关闭拥有该套接字的进程。 套接字是由打开它们的进程拥有的。 因此要在Unix / Linux中查找进程ID(PID),请使用以下命令:

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,则使用任务管理器结束进程,并使用服务UI关闭服务。您可以像在Linux/Unix上一样在Windows上使用netstat命令标识PID。

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


他对自己的问题进行了澄清,即远程客户端套接字可以使用其他工具关闭,正如其他人所指出的那样。这个答案主要集中在服务器套接字上,如果不在操作系统内部摆弄,就无法关闭它们。这是如何干净地关闭拥有服务器套接字的进程,这正是您想要做的,如果那是端口。但是,如果您的服务器有大量传入连接,则情况就不同了,您肯定可以杀死它们。这并没有错,只是不完全符合OP的要求。 - chubbsondubs
2
你应该删除“杀死进程”的部分,因为它不是问题的答案。你也可以停止网络适配器来停止流量,但这仍然不能完全终止Socket! - Sebastian
答案仅适用于IPv6,对于IPv4,您可以调用SetTcpEntry函数。 - jjxtra

5

如果您知道要关闭的特定端口,只需以管理员身份打开命令提示符(Windows 系统),然后执行以下操作:

npx kill-port 1900

上述例子中的 "1900" 是端口号,我通常在想要关闭 React-Native 开发工具(和 Expo)运行的端口时使用此方法。原因是即使关闭了开发者窗口或停止了服务器,该端口仍然保持占用状态。


3

wkillcx 是一个可靠的 Windows 命令行工具,可用于从命令行终止 TCP 连接。它很少被提及,但有时会出现在与大量连接的服务器上出现问题。我有时会使用 TCPView 进行交互式终止,但 wkillcx 可以用于脚本。


http://superuser.com/questions/384758/how-to-kill-a-particular-tcp-connection-in-windows#comment-1154518 - Pacerier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接