如何在Linux中检查(扫描)开放端口

无论您是要解决网络连接问题还是配置防火墙,首先要检查的事情之一是系统上实际打开了哪些端口。

本文介绍了几种方法来找出在Linux系统上向外部开放了哪些端口。

什么是开放端口

侦听端口是应用程序侦听的网络端口。 您可以通过使用以下命令查询网络堆栈来获取系统上侦听端口的列表: ssnetstat 要么 lsof。 每个侦听端口都可以使用防火墙打开或关闭(过滤)。

一般而言,开放端口是一个网络端口,它接受来自远程位置的传入数据包。

例如,如果您正在运行侦听端口的Web服务器 80443 并且这些端口在您的防火墙上是开放的,任何人(被阻止的ips除外)都可以使用他的浏览器访问Web服务器上托管的网站。 在这种情况下, 80443 是开放端口。

开放端口可能会造成安全风险,因为攻击者可以使用每个开放端口来利用漏洞或进行任何其他类型的攻击。 您应该只公开应用程序功能所需的端口,然后关闭所有其他端口。

使用以下命令检查开放端口 nmap

Nmap是功能强大的网络扫描工具,可以扫描单个主机和大型网络。 它主要用于安全审核和渗透测试。

如果可供使用的话, nmap 在进行端口扫描时,它应该是您的第一个工具。 除了端口扫描 nmap 还可以检测Mac地址,操作系统类型,内核版本等。

从控制台发出的以下命令确定哪些端口正在侦听来自网络的TCP连接:

sudo nmap -sT -p- 10.10.8.8

-sT 告诉 nmap 扫描TCP端口并 -p- 扫描所有65535端口。 如果 -p- 未使用 nmap 将仅扫描1000个端口。

Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-09 23:10 CEST
Nmap scan report for 10.10.8.8
Host is up (0.0012s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 08:00:27:05:49:23 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds

上面的输出显示只有端口 22808069 在目标系统上打开。

要扫描UDP端口,请使用 -sU 代替 -sT

sudo nmap -sU -p- 10.10.8.8

有关更多信息,请访问nmap手册页并了解此工具的所有其他强大功能。

使用以下命令检查开放端口 netcat

Netcat(或 nc)是一种命令行工具,可以使用TCP或UDP协议跨网络连接读取和写入数据。

netcat 您可以扫描单个端口或端口范围。

例如,在具有IP地址的远程计算机上扫描打开的TCP端口 10.10.8.8 范围中 20-80 您将使用以下命令:

nc -z -v 10.10.8.8 20-80

-z 选项告诉 nc 仅扫描打开的端口,而不发送任何数据,并且 -v 用于获取更多详细信息。

输出将如下所示:

nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused
nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
...
Connection to 10.10.8.8 80 port [tcp/http] succeeded!

如果只希望将具有打开端口的行打印在屏幕上,请使用 grep 命令。

nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
Connection to 10.10.8.8 80 port [tcp/http] succeeded!

要扫描UDP端口,请通过 -u 选项 nc 命令:

nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded

2>&1 构造将标准错误重定向到标准输出。

使用Bash伪设备号检查打开的端口

检查某个端口是打开还是关闭的另一种方法是使用Bash shell /dev/tcp/.. 要么 /dev/udp/.. 伪设备。

在执行命令时 /dev/$PROTOCOL/$HOST/$IP 伪设备,Bash将在指定端口上打开到指定主机的TCP或UDP连接。

下面的if..else语句将检查端口是否 443kernel.org 开了:

if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
  echo "Port is open"
else
  echo "Port is closed"
fi
Port is open

上面的代码如何工作?

使用伪设备连接到端口时,默认超时很大,因此我们使用 timeout 5秒后杀死测试命令。 如果建立连接到 kernel.org 港口 443 测试命令将返回true。

要检查端口范围,请使用for循环:

for PORT in {20..80}; do
  timeout 1 bash -c "</dev/tcp/10.10.8.8/$PORT &>/dev/null" &&  echo "port $PORT is open"
done

输出将如下所示:

port 22 is open
port 80 is open

结论#

我们为您展示了几种可用于扫描开放端口的工具。 还有其他工具和方法来检查开放端口,例如,您可以使用Python socket 模块, curltelnet 要么 wget

如果您有任何疑问或意见,请在下面发表评论。

终奌站

Sidebar