Linux下如何关闭端口?

Linux下如何关闭端口?

我对关闭端口有一些疑问,我想我遇到了一些奇怪的事情。

当我使用执行时

nmap --top-ports 10 192.168.1.1

它表明 23/TCP 端口已打开。

但是当我执行时

nmap --top-ports 10 localhost

它显示 23/tcp 端口已关闭。

其中哪一个是真的?我想关闭整个系统上的这个端口,我该怎么做?

答案1

Nmap 是一个很棒的端口扫描器,但有时您想要更权威的东西。您可以使用该实用程序询问内核哪些进程打开了哪些端口netstat

我@myhost:~$ sudo netstat -tlnp
有效的互联网连接(仅限服务器)
Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称
tcp 0 0 127.0.0.1:53 0.0.0.0:* 监听 1004/dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* 监听 380/sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* 监听 822/cupsd       
tcp6 0 0 :::22 :::* 监听 380/sshd        
tcp6 0 0 ::1:631 :::* 听 822/cupsd       

我给出的选项是:

  • -t仅 TCP
  • -l仅监听端口
  • -n不查找服务和主机名,仅显示数字
  • -p显示进程信息(需要root权限)

在本例中,我们可以看到 正在sshd侦听任何接口 ( 0.0.0.0) 端口 22,并且cupsd正在侦听环回 ( 127.0.0.1) 端口 631。您的输出可能显示 其telnetd本地地址为192.168.1.1:23,这意味着它不会响应环回适配器上的连接(例如你不能telnet 127.0.0.1)。

还有其他工具可以显示类似的信息(例如lsof/proc),但 netstat 是最广泛使用的。它甚至可以在 Windows ( netstat -anb) 上运行。 BSD netstat 有点不同:你必须使用袜子统计(1)来获取进程信息。

获得进程 ID 和程序名称后,如果您想关闭端口,就可以找到该进程并杀死它。为了进行更细粒度的控制,您可以使用防火墙(Linux 上的 iptables)来限制仅对某些地址的访问。您可能需要禁用服务启动。如果 Linux 上的 PID 为“-”,则它可能是一个内核进程(例如,这在 NFS 中很常见),所以祝你好运找出它是什么。

注意:我说“权威”是因为您不会受到网络条件和防火墙的阻碍。如果您信任您的计算机,那就太好了。但是,如果您怀疑自己已被黑客攻击,则可能无法信任计算机上的工具。用隐藏某些进程或端口(也称为 rootkit)的实用程序替换标准实用程序(有时甚至是系统调用)是攻击者的标准做法。此时您最好的选择是制作磁盘的取证副本并从备份中恢复;然后使用副本确定他们进入的方式并将其关闭。

答案2

要“关闭”您可以使用的端口iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP

答案3

Linux系统有一个所谓的环回接口,用于内部通信。其主机名是localhost,IP 地址是127.0.0.1

当您nmap在 上运行时localhost,您实际上是在虚拟的环回接口。192.168.1.1是您的IP地址身体的(最有可能eth0)接口。

因此,您在两个不同的网络接口上运行nmap,这就是开放端口存在差异的原因。它们都是真的。

如果您打开了 TCP 端口 23,则很可能您正在telnet运行服务器(由于缺乏加密,这不是一件好事)或者您的计算机上存在某种特洛伊木马。

答案4

如果你有一个服务在端口 23 上运行和侦听,这可以说是更干净的停止侦听端口 23 的进程(可能telnet)而不是保持其运行,并且关闭或阻止端口 23 使用iptables.

当没有进程在侦听端口时,即使没有防火墙阻止,任何连接到该端口的尝试都会立即导致“连接被拒绝”(ECONNREFUSEDconnect(2))

查找侦听端口 23 的进程(及其 pid)的一种方法(如果存在这样的进程)是:

sudo lsof -i -P | grep ':23 '

上面-i列出了开放的互联网端口(UDP 和 TCP),并且 -P 禁止将端口转换为服务名称(通过/etc/services

当您发现正在运行的进程正在侦听端口 23 后,您可以通过查看进程树(例如,pstree)来了解它是如何启动的。如果它的父进程是init(很可能),您可以递归搜索 下的进程名称/etc。例如:

sudo grep -r telnet /etc

这应该会引导您找到首先禁用它运行的最佳方法。

相关内容