![Linux下如何关闭端口?](https://linux22.com/image/39069/Linux%E4%B8%8B%E5%A6%82%E4%BD%95%E5%85%B3%E9%97%AD%E7%AB%AF%E5%8F%A3%EF%BC%9F.png)
我对关闭端口有一些疑问,我想我遇到了一些奇怪的事情。
当我使用执行时
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
.
当没有进程在侦听端口时,即使没有防火墙阻止,任何连接到该端口的尝试都会立即导致“连接被拒绝”(ECONNREFUSED
至connect(2)
)
查找侦听端口 23 的进程(及其 pid)的一种方法(如果存在这样的进程)是:
sudo lsof -i -P | grep ':23 '
上面-i
列出了开放的互联网端口(UDP 和 TCP),并且 -P 禁止将端口转换为服务名称(通过/etc/services
)
当您发现正在运行的进程正在侦听端口 23 后,您可以通过查看进程树(例如,pstree
)来了解它是如何启动的。如果它的父进程是init
(很可能),您可以递归搜索 下的进程名称/etc
。例如:
sudo grep -r telnet /etc
这应该会引导您找到首先禁用它运行的最佳方法。