如何在 Ubuntu 上检查开放端口:必备命令与安全技巧

1. 介绍

在网络管理和服务器运维中,准确了解端口的状态至关重要。尤其在使用 Ubuntu 时,检查哪些端口是打开的、哪些进程在使用它们,有助于加强安全性并实现更快速的故障排除。

本文阐述了在 Ubuntu 上检查端口的基本命令和工具。为初学者和中级用户提供实用且易于理解的步骤,请务必阅读至文末。

2. 什么是端口?

2.1 端口的基本概念

端口是计算机和网络设备用于发送和接收数据的虚拟通信端点。具体而言,当多个应用程序在同一 IP 地址上同时通信时,端口用于识别并将数据路由到正确的应用程序。

例如,Web 服务器使用端口 80 进行 HTTP 流量。如果同一服务器允许 SSH 访问,则使用端口 22。由于服务是通过端口号来区分的,检查端口状态在网络管理中尤为关键。

2.2 端口的类型和作用

端口主要分为三大类:

  1. 知名端口 (0–1023)
  • 全球统一分配给常用服务的端口号。 wp:list /wp:list

    • 示例:
    • HTTP: 80
    • HTTPS: 443
    • SSH: 22
  1. 注册端口 (1024–49151)
  • 特定应用程序或公司使用的端口。 wp:list /wp:list

    • 示例:
    • MySQL: 3306
    • PostgreSQL: 5432
  1. 动态端口 (49152–65535)
  • 应用程序临时使用的端口,通常用于客户端通信。

了解这些分类有助于快速判断每个端口号的用途。

3. 如何在 Ubuntu 上检查端口

Ubuntu 提供了多种工具用于检查端口状态。本节将介绍四个特别实用的命令。

3.1 使用 ss 命令

ss 命令是 Linux 系统中功能强大的网络管理工具。它运行迅速,并提供详细的连接信息。

基本命令:

sudo ss -ltn

选项详情:

  • -l : 仅显示处于 LISTEN 状态的端口。
  • -t : 仅显示 TCP 协议的连接。
  • -n : 以数字形式显示地址和端口号。

示例输出:

State       Recv-Q Send-Q      Local Address:Port        Peer Address:Port  
LISTEN      0      128              0.0.0.0:22               0.0.0.0:*

3.2 使用 netstat 命令

netstat 命令多年来一直是常用的网络管理工具。虽然它正逐步被 ss 取代,但在许多系统上仍然可用。

基本命令:

sudo netstat -ltn

示例输出:

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN

3.3 使用 lsof 命令

lsof 对于识别使用特定端口的进程非常有帮助。

检查特定端口:

sudo lsof -i :80

示例输出:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2   1234  www    4u   IPv4  12345 0t0      TCP *:http (LISTEN)

3.4 使用 nmap 命令

nmap 是常用于安全诊断的网络扫描工具。

扫描本地主机:

sudo nmap localhost

示例输出:

Starting Nmap 7.80 ( https://nmap.org ) at 2024-12-21 18:00 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http

关键要点:

  • 列出打开的端口及其对应的服务。
  • 可以扫描外部服务器,但必须获得适当授权。

4. 检查防火墙设置

On Ubuntu,防火墙通常用于增强安全性。ufw(Uncomplicated Firewall)尤其是一款简单却强大的管理工具,被广泛用于此目的。本节说明如何使用 ufw 检查端口状态并修改配置。

4.1 检查 ufw 状态

检查防火墙状态的命令:

sudo ufw status verbose

示例输出:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere

解释:

  • 状态:active — 表示防火墙已启用。
  • 日志记录:on — 已启用日志记录,防火墙活动正在被记录。
  • 默认:deny (incoming), allow (outgoing) — 默认拒绝传入连接,允许传出连接。
  • ALLOW — 显示明确允许的端口或服务(例如 SSH 和 HTTP)。

提示:
如果防火墙已禁用(Status: inactive),请使用以下命令启用它:

sudo ufw enable

4.2 允许或阻止端口

允许端口的命令:

sudo ufw allow 22/tcp

解释:

  • 允许在端口 22(SSH)上的 TCP 连接。

阻止端口的命令:

sudo ufw deny 80/tcp

解释:

  • 阻止对端口 80(HTTP)的访问。

示例:仅允许特定 IP 地址访问

sudo ufw allow from 192.168.1.100 to any port 22 proto tcp

解释:

  • 仅允许来自 IP 地址 192.168.1.100 的 SSH 连接。

4.3 重置和审查设置

要重置防火墙配置并重新开始,请运行以下命令:

sudo ufw reset

这将清除所有规则并将防火墙恢复到默认状态。如果您重置了设置,请务必审查并重新应用必要的规则。

5. 实用示例:检查特定端口的状态

本节提供使用 SSH(端口 22)的实用示例,展示如何验证端口状态。

5.1 检查端口状态

示例命令:

sudo ss -ltn | grep ':22'

示例输出:

LISTEN      0      128        0.0.0.0:22            0.0.0.0:*

关键点:

  • 如果输出中出现 LISTEN,则端口已打开并等待连接。
  • 0.0.0.0 表示接受来自所有 IP 地址的连接。

5.2 检查运行中的进程

示例命令:

sudo lsof -i :22

示例输出:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      1234  root   3u   IPv4  56789 0t0      TCP *:ssh (LISTEN)

关键点:

  • sshd 是管理 SSH 连接的守护进程。
  • 您可以使用其进程 ID(PID)来停止或重启该进程。

停止进程的示例:

sudo kill 1234

5.3 故障排除示例

问题: 当端口关闭或不可访问时该怎么办。

步骤:

  1. 检查防火墙设置。
    sudo ufw status verbose
    
  1. 如果端口被阻止,允许它。
    sudo ufw allow 22/tcp
    
  1. 检查服务状态并在需要时重启。
    sudo systemctl restart ssh
    

6. 端口管理与安全

端口管理直接关系到网络安全。本节解释了打开和关闭端口以及保持安全配置的关键点。

6.1 关闭未使用的端口

未使用的端口应关闭,以降低未授权访问的风险。

示例:关闭端口 80

sudo ufw deny 80/tcp

6.2 防范端口扫描的对策

端口扫描是攻击者用来识别系统漏洞的技术。以下方法有助于保护您的服务器:

  1. 加强防火墙规则:
    sudo ufw default deny incoming
    
  1. 监控日志:
    sudo tail -f /var/log/ufw.log
    
  1. 安装端口扫描检测工具: 使用 fail2ban 等工具自动阻止未授权的访问尝试。

7. 总结

本文阐述了在 Ubuntu 上检查端口的具体方法和命令,并介绍了使用 ufw 进行防火墙管理以及实用的安全措施。

7.1 关键要点

  • 端口的基本概念和分类: 端口是通信入口点,分为知名端口、注册端口和动态端口。
  • 如何检查端口: ssnetstatlsofnmap 等命令可提供端口和进程状态信息。
  • 防火墙管理: 使用 ufw 可以允许或阻止端口,以提升系统安全性。
  • 安全性的重要性: 关闭未使用的端口、监控日志、使用安全工具有助于维护安全的网络环境。

7.2 实际应用

端口管理是网络安全的基础环节。请将本文所学用于维护安全、稳定的服务器环境。

FAQ:关于在 Ubuntu 上检查端口的常见问题

Q1. 如果 Ubuntu 上的端口未打开,我该怎么办?

A:
请尝试以下步骤:

  1. 检查防火墙设置:
    sudo ufw status verbose
    

如果端口被阻止,使用以下命令放行:

sudo ufw allow [portnumber]/tcp
  1. 确认服务是否正在运行:
    sudo systemctl status [servicename]
    

以 SSH 为例:
sudo systemctl status ssh

必要时重启服务:

sudo systemctl restart [servicename]
  1. 确认配置的端口是否正确: 检查服务的配置文件,例如 SSH 的 /etc/ssh/sshd_config,以确认使用的端口号是否正确。

Q2. ssnetstat 有何区别?

A:
两者都用于检查网络连接,但区别如下:

  • ss 现代 Linux 系统推荐使用的工具。速度更快,提供更详细的信息。例如:sudo ss -ltn
  • netstat 较老的工具,逐渐被淘汰,但在旧系统上仍然常见。例如:sudo netstat -ltn

在新系统上推荐使用 ss

Q3. 我该如何检测端口扫描?

A:
可采用以下方法:

  1. 检查防火墙日志:
    sudo tail -f /var/log/ufw.log
    

查找可疑 IP 地址或重复的访问尝试。

  1. 安装 IDS/IPS 工具:
  • 使用 fail2banSnort 等工具自动阻止未授权的访问尝试。
  1. 使用 nmap 扫描自己的服务器:
    sudo nmap localhost
    

识别不必要的开放端口并将其关闭。

Q4. 我如何查看哪个进程正在使用特定端口?

A:
使用 lsof 命令:

sudo lsof -i :[portnumber]

以端口 80 为例:

sudo lsof -i :80

示例输出:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2   1234  www    4u   IPv4  12345 0t0      TCP *:http (LISTEN)

Q5. 如何仅允许特定 IP 地址访问 ufw

A:
使用以下命令:

sudo ufw allow from [IP address] to any port [portnumber] proto tcp

示例:仅允许 192.168.1.100 访问 SSH:

sudo ufw allow from 192.168.1.100 to any port 22 proto tcp

Q6. 我该如何更改端口号?

A:
编辑相应服务的配置文件。以 SSH 为例:

  1. 编辑配置文件:
    sudo nano /etc/ssh/sshd_config
    
  1. 找到 Port 指令并设置新的端口号:
    Port 2222
    
  1. 重启 SSH 服务:
    sudo systemctl restart ssh
    
  1. 在防火墙中放行新端口:
    sudo ufw allow 2222/tcp
    

Q7. 我可以一次允许多个端口吗?

A:
可以,使用以下方法一次允许多个端口:

  1. 允许一系列端口:
    sudo ufw allow 1000:2000/tcp
    

说明: 允许端口范围从 1000 到 2000。

  1. 单独允许端口:
    sudo ufw allow 22/tcp
    sudo ufw allow 80/tcp
    
年収訴求