如何使用 netstat、lsof 和 nmap 检查 Linux 中的开放端口
本文介绍如何使用 netstat、lsof 和 nmap 命令来查找哪些服务正在侦听哪些端口。
在对网络连接或特定于应用程序的问题进行故障排除时,首先要检查的事情之一应该是系统上实际使用的端口以及哪个应用程序正在侦听特定端口。
网络端口由其编号、关联的 IP 地址以及通信协议类型(例如 TCP 或 UDP)来标识。最重要的是,开放端口是应用程序或进程侦听的网络端口,充当通信端点。
每个侦听端口都可以使用防火墙打开或关闭(过滤)。一般来说,开放端口是接受来自远程位置的传入数据包的网络端口。
使用 netstat 检查开放端口
Netstat(网络统计)是一个命令行工具,用于监控传入和传出网络连接以及查看路由表、接口统计信息等。该工具对于 Linux 网络管理员和系统管理员监控和解决网络相关问题至关重要且有价值并确定网络流量性能。
要列出正在侦听的所有 TCP 或 UDP 端口,包括使用端口的服务和套接字状态,请使用以下命令:
$ sudo netstat -tulnpActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN 24919/amavisd
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 967/master
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 800/tinyproxy
tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 967/master
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 844/pure-ftpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 768/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 967/master
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 1001/dovecot
tcp6 0 0 :::3306 :::* LISTEN 823/mysqld
tcp6 0 0 ::1:783 :::* LISTEN 24911/spamd.pid -d
tcp6 0 0 :::80 :::* LISTEN 781/httpd
tcp6 0 0 :::21 :::* LISTEN 844/pure-ftpd
tcp6 0 0 :::22 :::* LISTEN 768/sshd
tcp6 0 0 :::25 :::* LISTEN 967/master
tcp6 0 0 :::993 :::* LISTEN 1001/dovecot
tcp6 0 0 :::995 :::* LISTEN 1001/dovecot
udp 0 0 0.0.0.0:47967 0.0.0.0:* 460/avahi-daemon: r
udp 0 0 127.0.0.1:123 0.0.0.0:* 472/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 472/ntpd
udp6 0 0 :::123 :::* 472/ntpd 该命令中使用的选项含义如下:
-t:显示 TCP 端口。-u:显示UDP端口。-l:仅显示监听端口。-n:显示数字地址而不是解析主机。-p:显示监听进程的PID和名称。仅当您以 root 或 sudo 用户身份运行命令时才会显示此信息。
我们案例中的基本列是:
- Proto – 套接字使用的协议。
- 本地地址 – 进程侦听的 IP 地址和端口号。
- PID/程序名称 – 进程的 PID 和名称。
此外,如果您想过滤结果,请使用 grep 命令。例如,要查找哪个进程在 TCP 端口 22 上侦听,您可以键入:
$ sudo netstat -tulnp | grep :22tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 768/sshd
tcp6 0 0 :::22 :::* LISTEN 768/sshd如果输出为空,则表明端口上没有任何内容正在侦听。有关 Linux 中 netstat 命令的更多信息,请参阅其手册页。
使用 lsof 检查开放端口
Lsof 的意思是“列出打开的文件”,用于找出哪个进程打开了哪些文件。在Linux中,一切都是文件。您可以将套接字视为写入网络的文件。
要使用 lsof 类型获取所有侦听 TCP 端口的列表:
$ sudo lsof -nP -iTCP -sTCP:LISTENCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 768 root 3u IPv4 16112 0t0 TCP *:22 (LISTEN)
sshd 768 root 4u IPv6 16114 0t0 TCP *:22 (LISTEN)
httpd 781 root 4u IPv6 16328 0t0 TCP *:80 (LISTEN)
httpd 781 root 6u IPv6 16336 0t0 TCP *:443 (LISTEN)
tinyproxy 800 tinyproxy 0u IPv4 16750 0t0 TCP *:8080 (LISTEN)
tinyproxy 805 tinyproxy 0u IPv4 16750 0t0 TCP *:8080 (LISTEN)
mysqld 823 mysql 20u IPv6 17479 0t0 TCP *:3306 (LISTEN)
pure-ftpd 844 root 4u IPv4 16289 0t0 TCP *:21 (LISTEN)
pure-ftpd 844 root 5u IPv6 16290 0t0 TCP *:21 (LISTEN)
master 967 root 13u IPv4 17225 0t0 TCP *:25 (LISTEN)
master 967 root 103u IPv4 17319 0t0 TCP 127.0.0.1:10025 (LISTEN)
dovecot 1001 root 24u IPv4 18600 0t0 TCP *:995 (LISTEN)
dovecot 1001 root 37u IPv6 18623 0t0 TCP *:993 (LISTEN)
httpd 24344 apache 4u IPv6 16328 0t0 TCP *:80 (LISTEN)
httpd 24344 apache 6u IPv6 16336 0t0 TCP *:443 (LISTEN)
/usr/bin/ 24911 root 5u IPv4 25208447 0t0 TCP 127.0.0.1:783 (LISTEN)
/usr/bin/ 24911 root 6u IPv6 25208449 0t0 TCP [::1]:783 (LISTEN)
spamd 24913 root 5u IPv4 25208447 0t0 TCP 127.0.0.1:783 (LISTEN)
spamd 24913 root 6u IPv6 25208449 0t0 TCP [::1]:783 (LISTEN)
/usr/sbin 24919 amavis 5u IPv4 25208583 0t0 TCP 127.0.0.1:10024 (LISTEN)
/usr/sbin 24919 amavis 6u IPv6 25208584 0t0 TCP [::1]:10024 (LISTEN)
smtpd 28403 postfix 6u IPv4 17225 0t0 TCP *:25 (LISTEN)
smtpd 28403 postfix 7u IPv6 17226 0t0 TCP *:25 (LISTEN)使用的选项如下:
-n:不将端口号转换为端口名称。-P:不解析主机名,显示数字地址。-iTCP -sTCP:LISTEN:仅显示 TCP 状态为 LISTEN 的网络文件。
要查找哪个进程正在侦听特定端口(例如端口 3306),您可以使用:
$ sudo lsof -nP -iTCP:3306 -sTCP:LISTENCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 823 mysql 20u IPv6 17479 0t0 TCP *:3306 (LISTEN)输出显示MySQL服务器使用端口3306。
有关 Linux 中 lsof 命令的更多信息,请参阅其手册页。
使用 nmap 检查开放端口
Nmap,或网络映射器,是一个用于网络探索和安全审计的开源Linux命令行工具。借助 nmap,服务器管理员可以快速显示主机和服务、搜索安全问题并扫描开放端口。
nmap 命令可用于检查单个端口或一系列端口是否打开。
以下是扫描目标系统上的 80 端口的方法:
$ sudo nmap -p 80 192.168.0.1Nmap scan report for 192.168.0.1
Host is up (0.000073s latency).
PORT STATE SERVICE
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.26 seconds扫描目标系统上的端口 1 到 200:
$ sudo nmap -p 1-200 192.168.0.1Starting Nmap 6.40 ( http://nmap.org ) at 2020-08-21 16:42 EEST
Nmap scan report for 192.168.0.1
Host is up (0.0000080s latency).
Not shown: 196 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 1.45 seconds扫描(快速)最常见的端口:
$ sudo nmap -F 192.168.0.1Starting Nmap 6.40 ( http://nmap.org ) at 2020-08-21 16:44 EEST
Nmap scan report for 192.168.0.1
Host is up (0.000014s latency).
Not shown: 89 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
443/tcp open https
465/tcp open smtps
587/tcp open submission
993/tcp open imaps
995/tcp open pop3s
3306/tcp open mysql
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 1.46 seconds底线
总之,检查哪些端口是开放的,以及可以从接受这些端口上的连接的服务中获取哪些信息,可以为您提供锁定服务器所需的信息。
例如,从您的计算机泄露的任何无关信息都可能被恶意用户用来尝试利用已知漏洞或开发新漏洞。他们能弄清楚的越少越好。

