2010-04-06 03:39:57 +0000 2010-04-06 03:39:57 +0000
116
116

从命令行手动关闭一个端口

我想关闭一个在客户端和服务器程序之间处于监听模式的开放端口,

在Linux中有没有手动命令行选项来关闭端口?

注:我知道 “只有拥有连接的套接字的程序才能关闭它,当程序终止时才会发生。”

我不明白为什么只有打开它的程序才能关闭它?但我还是很想知道是否有其他的方法可以做到这一点。

答案 (13)

137
137
137
2013-11-01 01:43:00 +0000

我也遇到了同样的问题,进程必须保持活力,但socket必须关闭。在运行中的进程中关闭socket不是不可能,但很困难:

1.定位进程:

2.在进程中找到socket的文件描述符

3.现在连接进程:

4.在进程中找到socket的文件描述符。现在连接进程:

  1. 现在关闭套接字库。
20
20
20
2012-02-13 08:44:54 +0000

Fuser也可以使用

fuser -k -n *protocol portno*

这里的协议是tcp/udp,portno是你想关闭的号码。例如:

fuser -k -n tcp 37

更多信息请看 fuser man page

6
6
6
2010-04-06 09:38:15 +0000

你可以使用 iptables:

iptables -I INPUT -p tcp --dport 80 -j DROP

基本上可以达到你想要的效果。这将把所有的TCP流量丢弃到80端口。

3
3
3
2010-04-06 03:45:53 +0000
netstat -anp | grep 80

应该会告诉你,如果你运行的是apache,"httpd"(这只是一个例子,请使用你的应用程序使用的端口,而不是80)

pkill -9 httpd

killall -9 httpd
2
2
2
2015-05-27 03:46:19 +0000

我先找了mongo和节点进程,然后做了如下操作:

ps -A | grep node

10418 pts/23 00:00:05 node

10551 pts/23 00:00:00 node

ps -A | grep mongo

10490 pts/23 00:00:00 mongod
kill -9 10418
kill -9 10490

识别出来后,用kill命令杀死进程就可以了。

&001

最后,输入meteor,应该又能正常工作了。

2
2
2
2012-04-22 05:02:17 +0000

您可以直接找出是哪个进程打开了与该端口相关联的套接字, 然后杀死该进程。另外,在内核意识到进程已经被杀死之前,套接字会一直保持开放。这通常只需要一分钟的时间。

我想更好的问题应该是:

如果你想终止一个你发现的后门或病毒,那么你至少应该在终止它之前了解到哪些数据在来回传输。wireshark很好用)(还有进程的可执行名称,这样你就可以删除它,防止它在重启时再来)或者,如果是你安装的东西(比如HTTPD或者FTPD什么的),那么你应该已经有了对进程本身的访问权限。

通常情况下,它都会有一个控制程序(HTTPD stop|start什么的)。或者说,如果是系统的事情,你可能就不要去惹它了。总之,我想既然大家都在给你讲 “怎么做 "的角度,我应该给你讲讲讲注意事项。

2
2
2
2015-04-23 06:06:09 +0000

如果你想让你的端口提前释放,你必须设置以下值:

echo 1 > /proc/sys/net/ipv4/tcp_fin_timeout

&001

将其从60秒(默认值)设置为1秒

1
1
1
2010-04-06 04:10:46 +0000

你可以写一个脚本来修改iptables 并重新启动它们。

其他的答案已经告诉你如何杀死绑定到端口的进程 - 这可能不是你想要的。如果你想让服务器继续运行, 但要防止来自客户端的连接, 那么你要阻止端口, 而不是停止进程。

1
1
1
2015-07-29 02:25:58 +0000

你可以使用名为killcx的命令,关闭一个连接,而不需要杀死任何进程。

  • 语法:
killcx [dest_ip:dest_port] {interface}

dest_ip : remote IP
dest_port : remote port
interface (optional) : network interface (eth0, lo etc).
  • 示例:
killcx 120.121.122.123:1234
killcx 120.121.122.123:1234 eth0
1
1
1
2015-10-15 08:45:34 +0000

我知道这个答案并不能回答问题本身,严格来说,但读到这里可能会有相关的信息:

绑定一个套接字到一个端口(和地址)的默认行为是,当套接字因进程突然终止而关闭时,套接字会在TIME/WAIT中停留一段时间。这意味着你不能立即重新绑定到这个地址/端口。如果你是通过标准的BSD套接字接口开发系统,你可以(至少在一定程度上)用SO/REUSEADDR套接字选项来控制这个行为。这基本上可以让你在socket处于TIME/WAIT状态时,再次绑定到同一个地址/端口。但是,这个信息只能作为开发辅助,因为TIME/WAIT的存在是有原因的,在其他答案中已经解释过了。

1
1
1
2013-11-01 02:08:35 +0000

还有一个问题:有的时候内核本身就拥有端口。我知道NAT路由会把一些端口开放给NAT使用。你不能为此杀死一个进程,这是内核,需要重新配置和重启。

0
0
0
2016-03-30 10:02:54 +0000

如果你不想在套接字上有任何流量,但又想让这个过程保持活力。

tcpkill -i eth0 host xxx.xxx.xxx.xxx and port yyyy

&001

将启动一个嗅探守护进程,拦截并销毁该端口上的所有流量。非常方便测试你的应用程序的网络分裂。

0
0
0
2019-08-07 15:17:33 +0000

你可以使用 ss 关闭监听套接字:

sudo ss --kill state listening src :1234

其中1234是你的端口号。