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

时间:2011-12-31 15:35:02

标签: networking

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

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

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

17 个答案:

答案 0 :(得分:116)

  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和“END PROCESS”

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

答案 1 :(得分:56)

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

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

所以你真正需要的是为Windows提供一个直接允许这个的API,或者让某人编写一个类似于VPN或Fiddler的程序,并为你提供一种方法来关闭通过它的套接字。

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

请注意,可能不容易导致程序无法侦听端口(嗯,有可能但该功能被称为防火墙...),但我不认为被问到这里。我相信问题是"如何有选择地关闭一个活动连接(套接字)到我的程序正在监听的端口?"。该问题的措辞有点偏,因为给出了不希望的入站客户端连接的端口号,它被称为" port"但很明显,它是对一个套接字而不是监听端口的引用。

答案 2 :(得分:36)

例如,您想要释放端口8080 然后,按照这些命令。

  • netstat -ano
  • taskkill / f / im [端口8080的pid来自上一个命令]

完成!

答案 3 :(得分:25)

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

Card

然后pid将出现在您可以使用taskkill终止的任务中。

enter image description here

netstat -ano | findstr :8080

此外,您可能希望查看专门针对localhost的question,但我认为这是相关的:

答案 4 :(得分:23)

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

答案 5 :(得分:22)

使用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都附带)...

答案 6 :(得分:5)

您无法在不关闭拥有这些套接字的进程的情况下关闭套接字。套接字由打开它们的进程拥有。因此,找出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目录中注册的shutdown脚本。如果你在服务上使用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

答案 7 :(得分:4)

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

答案 8 :(得分:2)

如果不拥有这些套接字,就无法关闭服务器上的套接字,因此如果没有在拥有服务器套接字的进程中运行代码,就无法实际关闭套接字。

但是,还有另一个选项告诉客户端关闭其套接字。将RST TCP数据包发送到客户端连接的端口将导致客户端断开连接。您可以使用nmap进行RST扫描。

http://nmap.org/

答案 9 :(得分:2)

我找到了正确答案。从Sysinternals尝试TCPView,现在由Microsoft拥有。您可以在http://technet.microsoft.com/en-us/sysinternals/bb897437

找到它

答案 10 :(得分:2)

wkillcx是一个可靠的Windows命令行工具,用于从命令行中删除未提及的tcp连接。有时,它确实存在与具有大量连接的服务器有关的问题。我有时使用tcpview进行交互式杀戮,但wkillcx可以在脚本中使用。

答案 11 :(得分: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,并在需要时添加其他规则。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

你可以使用来自sysinternal的tcpview程序。我想它可以帮助你监控和消除不必要的连接。

答案 14 :(得分:0)

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

与以前的回答不同,netstat -a -o -n使用了令人难以置信的长列表,没有使用这些端口的应用程序名称进行查看

答案 15 :(得分:-1)

如果您在安装了上述Windows 8的{​​{1}},Windows Server 2012或更高版本上运行,则可以使用以下脚本。这可以找到与端口和放大器相关的进程。终止它们。

代码

PowerShell v4

文档:

答案 16 :(得分:-3)

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

// Moq-esque

// Arrange
var httpClientAccessor = new Mock<IHttpClientAccessor>();
var httpHandler = new HttpMessageHandler(..) { ... };
var httpContext = new HttpContext(httpHandler);

httpClientAccessor.SetupGet(a => a.HttpClient).Returns(httpContext);

// Act
var restClient = new MyRestClient(httpClientAccessor.Object);
var result = await restClient.GetSomethingAsync(...);

// Assert
...

我希望这对你有用