如何在Linux中关闭端口?


38

我在关闭港口时有疑问,我想我有一些奇怪的事情。

当我使用执行

nmap --top-ports 10 192.168.1.1

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

但是当我执行

nmap --top-ports 10 localhost

它表明23 / tcp端口已关闭。

其中哪一个是正确的?我想在整个系统上关闭此端口,该怎么办?


10
他们都是真的。TCP端口未与主机关联。它们与网络接口关联。差异是微妙的但很重要。接口通常与主机相同,但不总是相同。在这种情况下(如答案中所述)localhost正在访问lo(环回)接口。IP地址为accesing你真正的接口,可能eth0wlan0或诸如此类。
2014年

3
这个问题的天真幼稚导致了一些了不起的答案。感谢你的提问!
dotancohen 2014年

Answers:


47

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

我@我的主机:〜$ sudo netstat -tlnp
活动的Internet连接(仅服务器)
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有所不同:您必须使用sockstat(1)来获取进程信息。

有了进程ID和程序名后,如果您想关闭端口,则可以继续查找进程并终止它。为了进行更细粒度的控制,可以使用防火墙(在Linux上为iptables)将访问权限限制为仅对某些地址进行访问。您可能需要禁用服务启动。如果PID在Linux上为“-”,则可能是一个内核进程(例如,这在NFS中很常见),所以很幸运找到它是什么。

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


14

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

在上运行nmaplocalhost,实际上是在虚拟环回接口上运行portscan 。192.168.1.1是您的物理(最可能是eth0)接口的IP地址。

因此,您已经nmap在两个不同的网络接口上运行,这就是为什么开放端口有所不同的原因。他们都是真的。

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


1
所以我该如何关闭呢?
user74080 2014年

4
@ user74080您可以iptables根据附近的答案建议添加一条规则,但这将使服务保持未使用状态,这会消耗资源。因此,如果您telnetd正在跑步,请将其关闭。
psimon 2014年

12

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

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

1
在此答案中,“关闭端口”表示“忽略对其的任何通信”。该端口仍处于打开状态,但无法再访问它。还要注意,DROP正如它所说的那样,它会看到数据包,然后将其忽略。正常情况下(未启用iptables),内核将发送回ICMP端口不可达的数据包(可以使用REJECTtarget代替来模拟DROP)。
Lekensteyn

3
@Lekensteyn ICMP端口不可访问,用于UDP。要回复的正确数据包是TCP RST数据包,也可以使用REJECTtarget通过写入来生成-j REJECT --reject-with tcp-reset
kasperd 2014年

尽管分数较低,但这是实际回答该问题的第一个答案。谁可以在此处添加更多分数,请这样做。
EnzoR

2

如果这样做nmap localhost,它会告诉您另一种情况:linux上的某些程序虽然只能在本地使用,但它们可以用作服务器。这是因为其他程序像将它们连接到的服务器一样使用它们。因此,两个答案都是正确的,因为您提出了不同的要求。

端口23用于telnet。通常不再使用。尝试nmap -sV 192.168.1.1找出哪个程序打开了端口。

(192 ...是本地网络IP nmap <your outside world IP>,由于可能的防火墙设置等,所以的结果也会给出不同的结果)


1

如果您有一个正在端口23上运行并监听的服务,那么停止(监听)监听端口23的进程(telnet使其保持运行并关闭或阻塞端口23的使用)可能更干净iptables

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

找到侦听端口23的进程(及其pid)的一种方法(如果有)是:

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

在上面的-i列表中,打开Internet端口(UDP和TCP),并且-P禁止将端口转换为服务名称(通过/etc/services

找到正在监听端口23的正在运行的进程之后,可以通过查看进程树(带有pstree)来弄清楚它是如何开始的。如果init(非常可能)其父项,则可以在下递归搜索该进程的名称/etc。例如:

sudo grep -r telnet /etc

这将引导您最好的方法来使其无法在第一位置运行。


不需要使用grep(如果有的话,也不需要引号)。您可以使用sudo lsof -Pi :23
泰奥菲尔

引号的存在是有充分理由的。确保只有telnet端口(23)匹配。如果不包括之后的一个空间:23,它将匹配:234:2345等等
arielf

知道了 这对于grep很有意义。顺便说一句,似乎没有grep(lsof -Pi :23)的命令正在寻找完全匹配的内容。
泰奥菲尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.