在Linux系统中,测试端口是网络运维和开发中的常见需求,主要用于检查端口是否开放、服务是否正常监听、网络连通性是否正常等,通过合理使用工具,可以快速定位问题,以下是Linux下测试端口的常用方法及详细操作步骤。
基础端口状态检查:netstat与ss
netstat
和ss
是Linux中最基础的网络工具,用于查看端口监听状态、连接情况等,其中ss
是netstat
的替代工具,性能更优,推荐优先使用。
使用netstat
检查端口
netstat
通过读取/proc/net/tcp
、/proc/net/udp
等文件获取网络状态信息,支持TCP、UDP协议。
常用参数:
-t
:显示TCP端口-u
:显示UDP端口-l
:仅显示监听端口-n
:以数字形式显示地址和端口(避免DNS解析,加快速度)-p
:显示占用端口的进程ID(PID)和名称(需root权限)
示例命令:
# 查看所有监听的TCP端口 netstat -tuln # 查看指定端口(如80)是否监听 netstat -tuln | grep 80 # 查看端口占用的进程(需root) sudo netstat -tulnp | grep 80
输出解读:Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
其中Local Address
为本地IP和端口,State
为端口状态(如LISTEN
表示监听中,ESTABLISHED
表示已连接)。
使用ss
检查端口
ss
是iproute2工具包的一部分,通过查询内核Netlink接口获取网络信息,速度更快,尤其在处理大量连接时优势明显。
常用参数:
-t
:TCP端口-u
:UDP端口-l
:监听端口-n
:数字形式-p
:显示进程信息
示例命令:
# 查看所有监听端口 ss -tuln # 查看指定端口(如443)的监听状态 ss -tuln | grep 443 # 查看端口占用的进程 sudo ss -tulnp | grep 22
ss
的输出格式与netstat
类似,但信息更简洁,支持更多过滤条件(如-4
仅显示IPv4,-6
仅显示IPv6)。
netstat
与ss
参数对比
参数 | 作用 | 示例 |
---|---|---|
-t |
显示TCP端口 | ss -t |
-u |
显示UDP端口 | ss -u |
-l |
仅显示监听端口 | ss -l |
-n |
数字形式,避免DNS解析 | ss -n |
-p |
显示进程信息(需root) | sudo ss -p |
远程端口连通性测试:telnet与nc
当需要测试本地是否能连接到远程主机的某个端口时(如测试Web服务器的80端口),可使用telnet
或nc
(netcat)。
使用telnet
测试
telnet
是一个基于TCP的协议工具,可测试远程端口的连通性,但默认未安装(需手动安装)。
安装(CentOS/RHEL):
sudo yum install telnet
安装(Ubuntu/Debian):
sudo apt install telnet
测试命令:
# 测试远程主机(如example.com)的80端口 telnet example.com 80 # 测试指定IP的22端口 telnet 192.168.1.100 22
结果分析:
- 连接成功:显示
Connected to example.com.
,进入交互界面(可输入GET / HTTP/1.1
测试HTTP服务)。 - 连接失败:显示
Connection refused
(端口未开放)、No route to host
(网络不可达)或Connection timed out
(防火墙拦截或主机未开机)。
使用nc
测试
nc
(netcat)是一个功能强大的网络工具,支持TCP/UDP协议,比telnet
更灵活,常用于端口扫描、数据传输等。
安装(CentOS/RHEL):
sudo yum install nmap-ncat
安装(Ubuntu/Debian):
sudo apt install netcat
测试TCP端口:
# 测试远程主机的80端口(-z:扫描模式,不发送数据;-v:详细输出) nc -zv example.com 80 # 测试多个端口 nc -zv example.com 80 443 8080
测试UDP端口:
# 测试UDP的53端口(DNS) nc -uzv example.com 53
结果解读:
Connection to example.com 80 port [tcp/http] succeeded!
:端口开放且连通。Connection refused
:端口未开放或目标主机未监听。
专业端口扫描:nmap
nmap
(Network Mapper)是开源的网络扫描和安全审计工具,功能强大,支持端口扫描、服务探测、操作系统检测等。
安装nmap
CentOS/RHEL:
sudo yum install nmap
Ubuntu/Debian:
sudo apt install nmap
常用扫描方式
基础端口扫描:
# 扫描目标主机的所有常见端口(1-1000) nmap example.com # 扫描指定端口(如80,443,8080) nmap -p 80,443,8080 example.com # 扫描端口范围(如1-1024) nmap -p 1-1024 example.com
详细扫描(显示服务版本、操作系统信息):
sudo nmap -sV -O example.com
(-sV
:探测服务版本;-O
:检测操作系统)
TCP SYN扫描(半开放扫描,速度快且不易被日志记录):
sudo nmap -sS example.com
(需root权限,避免完成三次握手)
UDP扫描:
nmap -sU example.com
(UDP扫描较慢,需耐心等待)
nmap扫描结果状态
状态 | 说明 |
---|---|
open |
端口开放,服务可接受连接 |
closed |
端口关闭,无服务监听 |
filtered |
端口被防火墙或过滤器阻挡 |
端口与进程关联:lsof
当需要查看某个端口被哪个进程占用时,可使用lsof
(List Open Files)。
安装(CentOS/RHEL):
sudo yum install lsof
安装(Ubuntu/Debian):
sudo apt install lsof
使用方法:
# 查看端口80被哪个进程占用 sudo lsof -i :80 # 查看指定PID(如1234)的进程占用的端口 sudo lsof -i -P -g 1234
输出解读:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
其中NAME
为IP:PORT
,如*:80
(监听所有IP的80端口)。
其他工具:curl与wget
对于HTTP/HTTPS端口,可直接使用curl
或wget
测试服务是否正常。
使用curl测试
# 测试HTTP服务的80端口 curl -v http://example.com:80 # 测试HTTPS服务的443端口 curl -v https://example.com:443
-v
参数显示详细连接过程,包括端口连接状态、HTTP响应码等。
使用wget测试
# 测试HTTP服务 wget --spider example.com:80 # 测试HTTPS服务 wget --spider https://example.com:443
--spider
参数仅检查连接,不下载文件。
Linux下测试端口需根据场景选择工具:
- 本地端口状态检查:优先使用
ss
(高效),或netstat
(传统工具)。 - 远程连通性测试:
telnet
(简单TCP测试)、nc
(支持TCP/UDP,更灵活)。 - 专业端口扫描:
nmap
(功能全面,支持高级扫描)。 - 端口进程排查:
lsof
(查看端口占用进程)。 - HTTP/HTTPS服务测试:
curl
或wget
(直接测试服务响应)。
通过组合使用这些工具,可快速定位端口相关问题,保障网络服务的正常运行。
相关问答FAQs
Q1:为什么用telnet
测试端口显示“Connection refused”,但nmap
却显示“open”?
A:可能原因包括:
- 防火墙差异:
telnet
需要完成TCP三次握手才能建立连接,若目标主机防火墙仅允许nmap
的SYN扫描(半开放扫描),会拒绝telnet
的完整连接请求,导致telnet
显示“Connection refused”,而nmap
的-sS
扫描可能识别为“open”。 - 服务配置:目标端口可能被服务监听,但服务配置了TCP Wrapper(如
/etc/hosts.deny
)或防火墙规则,拒绝来自telnet
客户端的IP,但允许nmap
扫描。 - 扫描方式:
nmap
的-sT
(TCP连接扫描)与telnet
类似,若nmap
显示“open”而telnet
失败,可能是nmap
绕过了某些本地防火墙规则。
解决方法:使用nmap
的-sT
或-PN
(跳过主机发现)参数重新扫描,或检查目标主机的防火墙和服务配置。
Q2:如何查看某个进程(如Nginx)占用的所有端口?
A:可通过以下步骤操作:
-
查找进程PID:使用
ps
命令查找Nginx进程的PID。ps aux | grep nginx
输出中第二列为PID(如
1234
)。 -
查看该PID占用的端口:使用
lsof
或ss
/netstat
过滤该PID的端口。# 方法1:使用lsof sudo lsof -i -P -g 1234 # 方法2:使用ss sudo ss -tulnp | grep 1234 # 方法3:使用netstat sudo netstat -tulnp | grep 1234
输出中会显示该进程监听的端口(如
*:80
、*:443
)及对应的IP地址。
若需查看所有Nginx进程的端口,可省略PID过滤,直接用sudo lsof -i -P -c nginx
(-c
按进程名筛选)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/37507.html