从命令行手动关闭一个端口
我想关闭一个在客户端和服务器程序之间处于监听模式的开放端口,
在Linux中有没有手动命令行选项来关闭端口?
注:我知道 “只有拥有连接的套接字的程序才能关闭它,当程序终止时才会发生。”
我不明白为什么只有打开它的程序才能关闭它?但我还是很想知道是否有其他的方法可以做到这一点。
我想关闭一个在客户端和服务器程序之间处于监听模式的开放端口,
在Linux中有没有手动命令行选项来关闭端口?
注:我知道 “只有拥有连接的套接字的程序才能关闭它,当程序终止时才会发生。”
我不明白为什么只有打开它的程序才能关闭它?但我还是很想知道是否有其他的方法可以做到这一点。
我也遇到了同样的问题,进程必须保持活力,但socket必须关闭。在运行中的进程中关闭socket不是不可能,但很困难:
1.定位进程:
2.在进程中找到socket的文件描述符
3.现在连接进程:
4.在进程中找到socket的文件描述符。现在连接进程:
Fuser也可以使用
fuser -k -n *protocol portno*
这里的协议是tcp/udp,portno是你想关闭的号码。例如:
fuser -k -n tcp 37
更多信息请看 fuser man page
你可以使用 iptables:
iptables -I INPUT -p tcp --dport 80 -j DROP
基本上可以达到你想要的效果。这将把所有的TCP流量丢弃到80端口。
您可以直接找出是哪个进程打开了与该端口相关联的套接字, 然后杀死该进程。另外,在内核意识到进程已经被杀死之前,套接字会一直保持开放。这通常只需要一分钟的时间。
我想更好的问题应该是:
如果你想终止一个你发现的后门或病毒,那么你至少应该在终止它之前了解到哪些数据在来回传输。wireshark很好用)(还有进程的可执行名称,这样你就可以删除它,防止它在重启时再来)或者,如果是你安装的东西(比如HTTPD或者FTPD什么的),那么你应该已经有了对进程本身的访问权限。
通常情况下,它都会有一个控制程序(HTTPD stop|start什么的)。或者说,如果是系统的事情,你可能就不要去惹它了。总之,我想既然大家都在给你讲 “怎么做 "的角度,我应该给你讲讲讲注意事项。
你可以写一个脚本来修改iptables 并重新启动它们。
其他的答案已经告诉你如何杀死绑定到端口的进程 - 这可能不是你想要的。如果你想让服务器继续运行, 但要防止来自客户端的连接, 那么你要阻止端口, 而不是停止进程。
我知道这个答案并不能回答问题本身,严格来说,但读到这里可能会有相关的信息:
绑定一个套接字到一个端口(和地址)的默认行为是,当套接字因进程突然终止而关闭时,套接字会在TIME/WAIT中停留一段时间。这意味着你不能立即重新绑定到这个地址/端口。如果你是通过标准的BSD套接字接口开发系统,你可以(至少在一定程度上)用SO/REUSEADDR套接字选项来控制这个行为。这基本上可以让你在socket处于TIME/WAIT状态时,再次绑定到同一个地址/端口。但是,这个信息只能作为开发辅助,因为TIME/WAIT的存在是有原因的,在其他答案中已经解释过了。
还有一个问题:有的时候内核本身就拥有端口。我知道NAT路由会把一些端口开放给NAT使用。你不能为此杀死一个进程,这是内核,需要重新配置和重启。
你可以使用 ss 关闭监听套接字:
sudo ss --kill state listening src :1234
其中1234是你的端口号。