服务器测评网
我们一直在努力

端口不通怎么办?如何用命令查看端口开放?

在网络管理与系统维护中,了解系统上哪些端口处于开放状态是一项至关重要的基础技能,端口作为网络通信的逻辑端点,是应用程序与外部世界交换数据的门户,无论是排查服务故障、进行安全审计,还是部署新的网络应用,都离不开对端口状态的精确查看,本文将系统性地介绍在不同操作系统下,用于查看开放端口的核心命令,并深入解析其使用方法与应用场景,帮助您掌握这一关键技能。

端口不通怎么办?如何用命令查看端口开放?

理解端口状态:基础概念

在深入具体命令之前,我们首先需要理解几个基本概念,端口通常与IP地址结合,形成“套接字”,唯一标识网络中的一个通信会话,端口状态主要有以下几种:

  • LISTEN(监听):这是最关键的状态,它表示一个应用程序正在该端口上等待传入的连接请求,这是我们常说的“开放端口”。
  • ESTABLISHED(已建立):表示一个连接已经成功建立,双方正在进行数据传输。
  • CLOSE_WAIT(等待关闭):表示远程端已发起关闭连接的请求,本地应用程序尚未关闭它。
  • TIME_WAIT:连接已关闭,但系统仍在等待一段时间以确保网络中的所有相关数据包都已清除。

排查问题时,我们最关注的是处于LISTEN状态的端口,因为它们是系统对外开放的服务入口。


Linux/Unix 系统下的端口查看命令

Linux/Unix 系统提供了多种强大且灵活的工具来查看端口信息,其中最经典和最现代的工具包括 netstatsslsof

netstat:网络统计的传统工具

netstat(Network Statistics)是一个经典的网络工具,功能强大,几乎在所有类Unix系统上都有预装,虽然在一些新的发行版中逐渐被 ss 取代,但其广泛的兼容性使其依然重要。

常用组合:

  • netstat -tuln
    这是最常用的组合之一,用于显示所有处于监听状态的TCP和UDP端口。

    • -t:显示TCP端口。
    • -u:显示UDP端口。
    • -l:仅显示处于监听状态的套接字。
    • -n:以数字形式显示地址和端口号,而不是尝试解析服务名(如将80显示为http),速度更快。
    $ netstat -tuln
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State      
    tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
    tcp6       0      0 :::22                   :::*                    LISTEN     
    udp        0      0 127.0.0.53:53           0.0.0.0:*                          

    上述输出显示,本地SSH服务(端口22)和DNS解析器服务(端口53)正处于监听状态。

  • netstat -tulnp
    在上一个命令的基础上增加了 -p 选项,它会显示占用该端口的进程ID(PID)和程序名称,这对于定位具体是哪个应用开启了端口至关重要。

    $ netstat -tulnp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      840/systemd-resolve 
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1234/sshd: /usr/sbi 

    从这里我们可以清晰地看到,端口22被进程ID为1234的sshd程序占用。

ss:更现代、更快速的替代品

ss(Socket Statistics)是 netstat 的现代替代品,它能够直接从内核获取信息,因此执行速度更快,尤其是在连接数众多的服务器上,优势更为明显,其参数与 netstat 高度相似。

常用组合:

端口不通怎么办?如何用命令查看端口开放?

  • ss -tuln
    效果与 netstat -tuln 完全相同,但输出更简洁,速度更快。

  • ss -tulnp
    同样,这个组合等同于 netstat -tulnp,显示监听端口及对应的进程信息。

    $ ss -tulnp
    Netid  State   Recv-Q  Send-Q     Local Address:Port      Peer Address:Port   Process    
    udp    UNCONN  0       0        127.0.0.53%lo:53         0.0.0.0:*       users:(("systemd-resolve",pid=840,fd=12)) 
    tcp    LISTEN  0       128          0.0.0.0:22             0.0.0.0:*       users:(("sshd",pid=1234,fd=3)) 
    tcp    LISTEN  0       128             [::]:22                [::]:*       users:(("sshd",pid=1234,fd=4)) 

    可以看到,ss 的输出格式更为紧凑,直接在 Process 列给出了详细信息。

lsof:列出打开的文件(包括端口)

在Linux中,“一切皆文件”,网络套接字也被视为一种文件。lsof(List Open Files)命令通过列出进程打开的文件,来反向查看端口占用情况。

常用方法:

  • lsof -i :<端口号>
    这是 lsof 最常见的用法,用于精确查看某个特定端口的占用情况。

    $ lsof -i :22
    COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd     1234  root    3u  IPv4  20456      0t0  TCP *:ssh (LISTEN)
    sshd     1234  root    4u  IPv6  20458      0t0  TCP *:ssh (LISTEN)

    此命令清晰地显示了端口22被sshd进程占用。

  • lsof -i -P -n
    这是一个更全面的组合,可以列出所有网络连接。

    • -i:列出所有网络连接。
    • -P:不将端口号转换成服务名(类似netstat-n)。
    • -n:不将IP地址解析为主机名。

Windows 系统下的端口查看命令

Windows系统同样提供了内置的工具来完成这项任务,最核心的是 netstat 和 PowerShell 的 Test-NetConnection

netstat (Windows)

Windows版本的 netstat 功能同样强大,只是参数略有不同。

常用组合:

端口不通怎么办?如何用命令查看端口开放?

  • netstat -ano
    这是Windows下最常用的命令,用于查看所有活动的连接和监听端口。

    • -a:显示所有连接和监听端口。
    • -n:以数字形式显示地址和端口。
    • -o:显示每个连接的所属进程ID(PID)。
    C:\> netstat -ano
    Active Connections
      Proto  Local Address          Foreign Address        State           PID
      TCP    0.0.0.0:22             0.0.0.0:0              LISTENING       1234
      TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       856
      TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
      ...

    获取PID后,可以打开任务管理器,在“详细信息”选项卡中找到对应的PID,从而确定是哪个程序占用了该端口。

Test-NetConnection (PowerShell)

这是PowerShell中一个更现代化、功能更丰富的工具,它不仅可以检查本地端口,还可以方便地测试到远程主机的端口连通性。

常用方法:

  • 检查本地端口:
    查看本地特定端口是否被占用,可以通过检查所有监听端口并筛选来实现。

    PS C:\> Get-NetTCPConnection | Where-Object {$_.State -eq 'Listen'} | Select-Object LocalAddress, LocalPort, State
  • 测试远程端口连通性:
    这是 Test-NetConnection 的强项。

    PS C:\> Test-NetConnection -ComputerName www.example.com -Port 443
    ComputerName     : www.example.com
    RemoteAddress    : 93.184.216.34
    RemotePort       : 443
    InterfaceAlias   : Wi-Fi
    SourceAddress    : 192.168.1.100
    TcpTestSucceeded : True

    TcpTestSucceeded : True 表示到目标主机的443端口连接成功,意味着该端口是开放的。


工具对比与选择

下表总结了上述命令的主要特点,帮助您在不同场景下做出最佳选择。

命令 主要操作系统 主要用途 优点 缺点
netstat Linux, Unix, Windows 全面查看网络连接、监听端口和路由表 兼容性极强,功能全面 在高负载下性能较差,输出较繁琐
ss Linux, Unix 查看套接字信息(连接、监听端口等) 速度快,信息精确,输出简洁 较新的工具,老旧系统可能未预装
lsof Linux, Unix 查看进程打开了哪些文件,包括网络端口、普通文件 能精确定位端口到进程,功能强大 参数复杂,信息量非常庞大
Test-NetConnection Windows 测试网络连通性,包括端口可达性 PowerShell原生,面向对象,功能专一 仅适用于PowerShell环境

实际应用场景与最佳实践

  1. 服务部署失败排查:当你启动一个Web服务(如Nginx)失败,提示端口被占用时,可以使用 ss -tulnp | grep :80lsof -i :80 快速定位是哪个进程占用了80端口。
  2. 安全审计:定期使用 ss -tulnnmap -sT localhost 扫描本机开放端口,对比已知的业务端口列表,发现未知或可疑的开放端口,及时进行安全加固。
  3. 防火墙配置验证:配置了防火墙规则(如ufwiptables)只允许特定IP访问22端口后,可以从一个不被允许的IP地址使用 nmap -p 22 <服务器IP> 进行扫描,验证规则是否生效。
  4. 远程服务可用性检查:当应用无法连接到远程数据库时,可以使用 nmap -p 3306 <数据库IP>Test-NetConnection -ComputerName <数据库IP> -Port 3306 来确认数据库端口是否对本地网络开放。

掌握查看端口开放状态的命令,是每一位IT从业者必备的核心技能,从传统的 netstat 到高效的 ss,再到功能专一的 lsofTest-NetConnection,每一款工具都有其独特的优势和适用场景,通过理解它们的工作原理和参数组合,您将能够从容应对各种网络问题,无论是日常的故障排查,还是深入的安全分析,都能做到事半功倍,选择正确的工具,并养成定期检查端口状态的良好习惯,将极大地提升您工作的效率与系统的安全性。

赞(0)
未经允许不得转载:好主机测评网 » 端口不通怎么办?如何用命令查看端口开放?