在 Linux 系统中,查看端口占用、监听状态等信息的常用命令有以下 8 个,涵盖不同场景需求:
1. netstat - 传统网络状态查看工具
最经典的网络状态命令,可查看端口监听、连接等信息(部分系统需单独安装)。常用参数:
-t:显示 TCP 端口
-u:显示 UDP 端口
-l:仅显示监听状态的端口
-n:以数字形式显示 IP 和端口(不解析域名)
-p:显示占用端口的进程 PID 和名称(需 root 权限)
示例:
bash
# 查看所有监听的 TCP 端口(含进程)
sudo netstat -tlnp
# 查看所有 UDP 端口
netstat -uln
2. ss - 现代替代 netstat 的工具
ss 是 netstat 的替代工具,性能更好,支持更多过滤选项,推荐优先使用。常用参数:
-t/-u:同 netstat,分别对应 TCP/UDP
-l:监听状态
-n:数字形式显示
-p:显示进程信息
-a:显示所有连接(包括非监听状态)
示例:
bash
# 查看所有监听的 TCP 端口(含进程)
ss -tlnp
# 过滤特定端口(如 8080)
ss -tln | grep 8080
3. lsof - 查看进程打开的文件(含端口)
lsof(list open files)可列出进程打开的文件,包括网络端口(Linux 中端口被视为特殊文件)。常用参数:
-i:仅显示网络相关的文件(即端口)
-i :端口号:过滤特定端口
-P:不解析端口名称(显示数字)
示例:
bash
# 查看占用 80 端口的进程
sudo lsof -i :80
# 查看所有 TCP 网络连接
lsof -i tcp
4. netstat -tulpn - 快速汇总监听端口
这是 netstat 的一个常用组合参数,直接显示所有监听的 TCP/UDP 端口及对应进程:
bash
sudo netstat -tulpn
5. ss -tulwn - 快速查看监听端口(更轻量)
ss 的组合参数,-w 显示 RAW 协议端口,-n 数字形式,适合快速排查:
bash
ss -tulwn
6. netstat -antp | grep ESTABLISHED - 查看已建立的连接
过滤出所有已建立的 TCP 连接(非监听状态,显示实际通信的端口):
bash
netstat -antp | grep ESTABLISHED
7. ss -o state established '( dport = :80 or sport = :80 )' - 过滤特定端口的连接
ss 的高级过滤,查看与 80 端口相关的已建立连接(dport 目标端口,sport 源端口):
bash
ss -o state established '( dport = :80 or sport = :80 )'
8. cat /proc/net/tcp 和 cat /proc/net/udp - 从内核文件查看端口
直接读取 Linux 内核维护的 TCP/UDP 连接信息(原始数据,需解析):
bash
# 查看 TCP 端口(第 2 列是本地端口的十六进制表示)
cat /proc/net/tcp
# 查看 UDP 端口
cat /proc/net/udp
总结
日常快速查看监听端口:优先用 ss -tlnp 或 sudo netstat -tlnp
查看特定端口的占用进程:sudo lsof -i :端口号 或 ss -tlnp | grep 端口号
查看已建立的连接:ss -tna 或 netstat -tna
根据系统版本和需求选择合适的命令,ss 和 lsof 功能更强大,是现代 Linux 系统的首选。
----------------------------------------------------------------------------
nmap(Network Mapper)是一款强大的网络扫描工具,不仅可以探测主机存活状态,还能详细扫描目标主机开放的端口、服务版本、操作系统等信息,是网络安全和端口排查的常用工具。
一、nmap 端口扫描核心功能
nmap 对端口的扫描能力非常灵活,支持多种扫描方式,可精准探测端口的开放状态(开放、关闭、过滤等),并识别端口上运行的服务。
二、常用端口扫描命令
1. 基本端口扫描(默认扫描 1000 个常用端口)
bash
nmap 目标IP/主机名
示例:扫描 192.168.1.100 的常用端口
bash
nmap 192.168.1.100
输出会显示开放的端口、协议(TCP/UDP)、服务名称(如 ssh、http)等。
2. 扫描指定端口
通过 -p 参数指定单个或多个端口(TCP 端口默认,UDP 需加 -u):
bash
# 扫描单个端口(如 80 端口)
nmap -p 80 192.168.1.100
# 扫描多个端口(如 80、443、22)
nmap -p 80,443,22 192.168.1.100
# 扫描端口范围(如 1-1000)
nmap -p 1-1000 192.168.1.100
# 扫描 UDP 端口(如 53 域名端口)
nmap -u -p 53 192.168.1.100
# 扫描所有端口(1-65535,耗时较长)
nmap -p- 192.168.1.100
3. 快速扫描(减少扫描时间)
使用 -T4 参数指定扫描速度(T0 最慢,T5 最快,T4 适合常规快速扫描):
bash
nmap -T4 -p 1-1000 192.168.1.100
4. 探测端口服务版本
通过 -sV 参数探测开放端口上运行的服务版本(如 nginx 1.21.0、ssh OpenSSH 8.2):
bash
nmap -sV -p 80,443 192.168.1.100
5. 扫描整个网段的端口
对某个网段(如 192.168.1.0/24)内所有主机的常用端口进行扫描:
bash
nmap -p 80,22 192.168.1.0/24
6. 隐蔽扫描(减少被目标检测的概率)
使用 -sS(TCP SYN 扫描,半开放扫描),不建立完整连接,更隐蔽(需 root 权限):
bash
sudo nmap -sS -p 1-1000 192.168.1.100
7. 查看端口是否被防火墙过滤
通过 -sA(TCP ACK 扫描)判断端口是否被防火墙过滤(开放 / 关闭 / 过滤):
bash
sudo nmap -sA -p 80 192.168.1.100
8. 输出详细扫描结果
通过 -v(详细)或 -vv(更详细)参数查看扫描过程和结果:
bash
nmap -v -p 80-443 192.168.1.100
三、端口状态说明
nmap 扫描后会返回端口的 6 种状态,核心状态如下:
open:端口开放,有服务在监听并接受连接。
closed:端口关闭,目标主机可达,但无服务监听该端口。
filtered:端口被过滤,通常是防火墙阻止了扫描请求,无法确定是否开放。
unfiltered:端口未被过滤,但无法确定是否开放(仅在特定扫描类型中出现)。
四、安装 nmap
大部分 Linux 发行版可通过包管理器安装:
bash
# Ubuntu/Debian
sudo apt install nmap
# CentOS/RHEL
sudo yum install nmap
# Fedora
sudo dnf install nmap
总结
nmap 是端口扫描的 “瑞士军刀”,通过灵活的参数组合可满足不同场景需求:
快速查看目标端口开放状态:nmap -T4 目标IP
精准探测服务版本:nmap -sV -p 端口 目标IP
隐蔽扫描:sudo nmap -sS 目标IP
使用时需注意:扫描非授权网络可能涉及法律风险,仅限合法授权的网络环境使用
----------------------------------------------------------------------------
nc(Netcat)是 Linux 系统中一款功能强大的网络工具,被称为 “网络瑞士军刀”,除了用于网络连接、文件传输外,也可实现简单的端口扫描功能。虽然其扫描能力不如 nmap 专业,但在没有 nmap 的环境下,nc 是一个便捷的替代方案。
一、nc 端口扫描的基本原理
nc 通过尝试与目标主机的指定端口建立连接,根据连接结果判断端口是否开放:
若连接成功(返回 0 状态码),说明端口开放。
若连接失败(返回非 0 状态码),说明端口关闭或被防火墙过滤。
二、nc 端口扫描常用命令
1. 扫描单个 TCP 端口
bash
nc -zv 目标IP 端口号
参数说明:
-z:仅扫描端口,不发送数据(扫描模式)。
-v:显示详细输出(verbose 模式)。
示例:扫描 192.168.1.100 的 80 端口
bash
nc -zv 192.168.1.100 80
成功输出(端口开放):Connection to 192.168.1.100 80 port [tcp/http] succeeded!
失败输出(端口关闭):nc: connect to 192.168.1.100 port 80 (tcp) failed: Connection refused
2. 扫描多个 TCP 端口
指定端口范围(用 - 分隔)或逗号分隔的多个端口:
bash
# 扫描端口范围(如 1-100)
nc -zv 192.168.1.100 1-100
# 扫描离散端口(如 22、80、443)
nc -zv 192.168.1.100 22 80 443
3. 扫描 UDP 端口
添加 -u 参数扫描 UDP 端口(UDP 无连接,扫描速度较慢):
bash
nc -zvu 192.168.1.100 53-161 # 扫描 53-161 之间的 UDP 端口(常见 DNS、SNMP 等服务)
4. 后台快速扫描(减少输出干扰)
结合 grep 过滤仅显示开放的端口,适合批量扫描:
bash
nc -zv 192.168.1.100 1-1000 2>&1 | grep succeeded
2>&1:将错误输出重定向到标准输出,确保所有结果可被 grep 捕获。
grep succeeded:仅显示连接成功(端口开放)的结果。
5. 扫描整个网段的端口
结合 shell 循环扫描网段内所有主机的特定端口(如扫描 192.168.1.1-254 的 22 端口):
bash
for ip in 192.168.1.{1..254}; do
nc -zv $ip 22 2>&1 | grep -q "succeeded" && echo "$ip: 22 端口开放"
done
脚本说明:遍历网段内的 IP,对每个 IP 的 22 端口进行扫描,若开放则输出提示。
6. 设置扫描超时时间
添加 -w 参数设置超时时间(单位:秒),避免因目标无响应导致扫描卡顿:
bash
nc -zv -w 2 192.168.1.100 1-1000 # 超时时间设为 2 秒
三、nc 与 nmap 扫描的对比
工具优势劣势适用场景
nc
系统自带(多数 Linux 发行版预装)、轻量快速
功能简单,无服务版本探测、无复杂过滤
简单端口开放检测、临时快速扫描
nmap
功能强大,支持多种扫描方式、服务识别
需单独安装,扫描逻辑较复杂
专业端口扫描、网络安全审计
四、注意事项
权限问题:部分端口(如 1-1024 特权端口)的扫描可能需要 root 权限(sudo)。
防火墙影响:若目标主机开启防火墙,可能导致扫描结果显示为 “过滤”(无明确开放 / 关闭状态)。
合法性:扫描非授权网络或主机可能违反法律法规,仅限在自己管理的网络中使用。
总结
nc 作为一款轻量网络工具,能满足基本的端口扫描需求,尤其适合临时快速检测端口开放状态。常用命令组合:
单个端口:nc -zv 目标IP 端口
端口范围:nc -zv 目标IP 起始端口-结束端口
过滤开放端口:nc -zv 目标IP 端口范围 2>&1 | grep succeeded
对于复杂扫描场景(如服务版本识别、隐蔽扫描),仍推荐使用专业工具 nmap。
----------------------------------------------------------------------------
iptables 是 Linux 系统中用于配置 IPv4 防火墙规则的命令行工具,通过定义规则链(chain)和规则(rule)来控制网络数据包的进出。以下是 iptables 常用的查询和管理命令,帮助查看当前防火墙规则配置:
一、查看所有规则(基础查询)
1. 查看所有表和链的规则
bash
sudo iptables -L -n -v
参数说明:
-L:列出指定链的规则(默认列出所有链)。
-n:以数字形式显示 IP 和端口(不解析域名和服务名,速度更快)。
-v:显示详细信息(包括数据包计数、字节数、接口等)。
2. 按 “表” 查看规则
Linux 防火墙有 5 个默认表(功能不同),常用的有:
filter:默认表,用于过滤数据包(最常用)。
nat:用于网络地址转换(如端口映射)。
mangle:用于修改数据包标记。
指定表查看:
bash
# 查看 filter 表(默认表,可省略 -t filter)
sudo iptables -t filter -L -n -v
# 查看 nat 表(端口映射等规则)
sudo iptables -t nat -L -n -v
# 查看 mangle 表
sudo iptables -t mangle -L -n -v
二、查看指定链的规则
每个表包含多个预定义链(chain),filter 表常用链:
INPUT:控制进入本机的数据包。
OUTPUT:控制本机发出的数据包。
FORWARD:控制经过本机转发的数据包(如路由器)。
查看指定链:
bash
# 查看 filter 表的 INPUT 链(进入本机的规则)
sudo iptables -L INPUT -n -v
# 查看 nat 表的 PREROUTING 链(端口映射常用)
sudo iptables -t nat -L PREROUTING -n -v
三、查看规则编号(便于删除 / 修改)
规则编号从 1 开始,删除或修改规则时需要用到:
bash
# 显示 filter 表 INPUT 链的规则及编号
sudo iptables -L INPUT -n --line-numbers
# 显示 nat 表所有链的规则及编号
sudo iptables -t nat -L -n --line-numbers
四、查看规则的详细配置(包括匹配条件和目标)
使用 -S 参数以 “规则语句” 形式显示(更适合复制或修改规则):
bash
# 显示所有规则的语句形式
sudo iptables -S
# 显示 filter 表 INPUT 链的规则语句
sudo iptables -t filter -S INPUT
# 显示编号为 3 的 INPUT 链规则
sudo iptables -L INPUT 3 -n -v
五、查看规则的计数器(匹配次数)
规则中的 pkts(数据包数)和 bytes(字节数)表示该规则匹配到的流量,可用于排查规则是否生效:
bash
# 查看所有规则的计数器
sudo iptables -L -n -v
# 重置所有规则的计数器(需谨慎操作)
sudo iptables -Z # 重置当前表所有链
sudo iptables -Z INPUT # 仅重置 INPUT 链
六、保存和恢复规则
1. 保存当前规则(防止重启后丢失)
bash
# 保存到默认文件(不同发行版路径可能不同)
# Ubuntu/Debian
sudo iptables-save > /etc/iptables/rules.v4
# CentOS/RHEL
sudo iptables-save > /etc/sysconfig/iptables
2. 恢复规则(如重启后加载)
bash
sudo iptables-restore < /etc/iptables/rules.v4 # 路径对应保存时的文件
七、常用组合查询场景
查看所有开放的端口(允许进入的规则):
bash
sudo iptables -t filter -L INPUT -n -v | grep ACCEPT
查看端口映射规则(nat 表):
bash
sudo iptables -t nat -L PREROUTING -n -v # 外部访问映射到内部
sudo iptables -t nat -L POSTROUTING -n -v # 内部访问外部的地址转换
查看针对特定 IP 的规则:
bash
sudo iptables -L -n -v | grep 192.168.1.100 # 过滤包含该 IP 的规则
查看针对特定端口的规则:
bash
sudo iptables -L -n -v | grep 80 # 过滤 80 端口的规则
八、注意事项
权限:iptables 命令需要 root 权限,必须加 sudo 执行。
临时生效:直接执行 iptables 命令添加的规则在重启后会丢失,需用 iptables-save 保存。
默认策略:每个链有默认策略(ACCEPT 或 DROP),表示未匹配任何规则时的处理方式,查询时会显示在链的顶部(如 Chain INPUT (policy ACCEPT))。
新版本工具:部分 Linux 发行版(如 CentOS 7+、Ubuntu 20.04+)默认使用 firewalld 或 ufw 管理防火墙,但若手动切换到 iptables,上述命令仍适用。
总结
iptables 查询命令的核心是通过 -L(列出规则)、-t(指定表)、-n(数字显示)、-v(详细信息)等参数组合,快速定位所需规则。常用基础命令:
查看所有规则:sudo iptables -L -n -v
查看 nat 表端口映射:sudo iptables -t nat -L -n -v
查看规则编号:sudo iptables -L INPUT --line-numbers -n
通过这些命令可以清晰了解当前防火墙的配置,为规则调整和网络排查提供依据。
----------------------------------------------------------------------------
ufw(Uncomplicated Firewall)是 Linux 系统中一款简化的防火墙管理工具,基于 iptables 封装,提供更简洁的命令行命令来管理防火墙规则。以下是使用 ufw 查看端口相关规则的常用命令:
一、查看所有端口规则(基础命令)
1. 查看当前防火墙状态及所有规则
bash
sudo ufw status
输出示例(显示已启用的规则,包括端口、允许 / 拒绝状态、协议等):
plaintext
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
若防火墙未启用,会显示 Status: inactive。
2. 查看详细规则(包括端口对应的服务名称、接口等)
bash
sudo ufw status verbose
输出会增加更多细节,如规则编号、接口限制等:
plaintext
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
3. 查看所有规则(包括已禁用但未删除的规则)
bash
sudo ufw show added
显示所有曾添加过的规则(无论是否启用),适合查看历史配置:
plaintext
ufw allow 22/tcp
ufw allow 80/tcp
ufw deny 3306/tcp # 已添加但未启用的规则
二、过滤查看特定端口的规则
1. 查看指定端口的允许 / 拒绝规则
结合 grep 过滤特定端口(如 80 端口):
bash
sudo ufw status | grep 80
输出示例:
plaintext
80/tcp ALLOW Anywhere
8080/tcp DENY Anywhere
2. 查看 TCP 或 UDP 协议的端口规则
指定协议类型过滤(如仅查看 TCP 端口):
bash
sudo ufw status | grep tcp # 查看所有 TCP 端口规则
sudo ufw status | grep udp # 查看所有 UDP 端口规则
三、查看端口规则的编号(用于修改 / 删除)
每条规则都有唯一编号,修改或删除规则时需要用到:
bash
sudo ufw status numbered
输出示例(规则前的数字即为编号):
plaintext
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
四、查看默认策略(未匹配规则时的处理方式)
默认策略决定了未被明确规则匹配的流量如何处理(允许 / 拒绝):
bash
sudo ufw show raw
输出中包含默认策略,例如:
plaintext
*filter
:INPUT DROP [0:0] # 入站默认拒绝
:FORWARD DROP [0:0] # 转发默认拒绝
:OUTPUT ACCEPT [0:0] # 出站默认允许
...
五、常用场景示例
检查 22 端口(SSH)是否允许访问:
bash
sudo ufw status | grep 22
查看所有允许外部访问的端口:
bash
sudo ufw status | grep ALLOW
确认防火墙是否阻止了某个端口(如 3306 MySQL):
bash
sudo ufw status | grep 3306
总结
ufw 查看端口规则的核心命令是 sudo ufw status,通过添加参数或结合 grep 实现更精准的查询:
基础状态:sudo ufw status
详细信息:sudo ufw status verbose
规则编号:sudo ufw status numbered
过滤端口:sudo ufw status | grep 端口号
ufw 命令简洁直观,适合快速查看和管理防火墙端口规则,尤其适合对 iptables 不熟悉的用户。
----------------------------------------------------------------------------
firewalld 是 Linux 系统(如 CentOS 7+、Fedora、RHEL 7+)默认的动态防火墙管理工具,替代了传统的 iptables 服务,支持网络区域(zone)、服务(service)和端口的动态管理,无需重启服务即可使规则生效。以下是 firewalld 常用命令:
一、基础状态管理
1. 查看防火墙状态
bash
sudo firewall-cmd --state
输出:running(运行中)或 not running(未运行)。
2. 启动 / 停止 / 重启防火墙
bash
sudo systemctl start firewalld # 启动
sudo systemctl stop firewalld # 停止
sudo systemctl restart firewalld # 重启
3. 设置防火墙开机自启 / 禁用
bash
sudo systemctl enable firewalld # 开机自启
sudo systemctl disable firewalld # 禁用开机自启
二、查看端口与服务规则
1. 查看当前生效的所有规则(默认区域)
bash
sudo firewall-cmd --list-all
输出包含默认区域的允许端口、服务、源地址等信息,例如:
plaintext
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client http
ports: 8080/tcp 3306/udp
protocols:
forward: no
masquerade: no
...
2. 查看所有区域的规则
bash
sudo firewall-cmd --list-all-zones
3. 查看特定区域的规则(如 public 区域)
bash
sudo firewall-cmd --zone=public --list-all
4. 查看开放的端口(所有区域)
bash
sudo firewall-cmd --list-ports # 默认区域
sudo firewall-cmd --zone=public --list-ports # 指定区域
5. 查看允许的服务(服务是预定义的端口集合,如 http 对应 80/tcp)
bash
sudo firewall-cmd --list-services # 默认区域
sudo firewall-cmd --zone=public --list-services # 指定区域
三、管理端口规则
1. 临时开放端口(重启防火墙后失效)
bash
# 开放 TCP 端口(如 8080)
sudo firewall-cmd --add-port=8080/tcp
# 开放 UDP 端口(如 53)
sudo firewall-cmd --add-port=53/udp
# 开放端口范围(如 1000-2000/tcp)
sudo firewall-cmd --add-port=1000-2000/tcp
# 指定区域开放端口(如 public 区域开放 3306/tcp)
sudo firewall-cmd --zone=public --add-port=3306/tcp
2. 永久开放端口(需重新加载规则生效)
在临时命令基础上添加 --permanent 参数:
bash
sudo firewall-cmd --add-port=8080/tcp --permanent # 永久开放
sudo firewall-cmd --reload # 重新加载规则使永久配置生效
3. 关闭端口
bash
# 临时关闭
sudo firewall-cmd --remove-port=8080/tcp
# 永久关闭
sudo firewall-cmd --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload
四、管理服务规则
服务是预定义的端口集合(如 ssh 对应 22/tcp,http 对应 80/tcp),方便批量管理。
1. 查看所有支持的服务
bash
sudo firewall-cmd --get-services
2. 临时允许服务(如 http、https)
bash
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
3. 永久允许服务
bash
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
4. 禁止服务
bash
# 临时禁止
sudo firewall-cmd --remove-service=http
# 永久禁止
sudo firewall-cmd --remove-service=http --permanent
sudo firewall-cmd --reload
五、区域(Zone)管理
firewalld 通过 “区域” 对不同网络环境(如公共网络、家庭网络)设置不同规则,默认区域为 public。
1. 查看所有区域
bash
sudo firewall-cmd --get-zones
2. 查看默认区域
bash
sudo firewall-cmd --get-default-zone
3. 修改默认区域(如改为 home)
bash
sudo firewall-cmd --set-default-zone=home
4. 为网卡绑定区域(如将 eth0 绑定到 public 区域)
bash
sudo firewall-cmd --zone=public --add-interface=eth0 --permanent
sudo firewall-cmd --reload
六、端口转发(端口映射)
将外部端口转发到内部端口(如将 80 端口转发到 8080):
bash
# 临时转发(需开启 masquerade)
sudo firewall-cmd --add-masquerade # 允许地址伪装(必要条件)
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 永久转发
sudo firewall-cmd --add-masquerade --permanent
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reload
七、常用参数说明
参数作用
--zone=区域名
指定操作的区域(默认使用默认区域)
--permanent
使规则永久生效(需 --reload 加载)
--reload
重新加载规则(不中断现有连接)
--list-ports
列出开放的端口
--list-services
列出允许的服务
--add-port
开放端口
--remove-port
关闭端口
总结
firewalld 命令的核心是通过区域管理端口和服务,常用操作:
查看状态与规则:sudo firewall-cmd --list-all
开放端口:sudo firewall-cmd --add-port=端口/协议 --permanent && sudo firewall-cmd --reload
允许服务:sudo firewall-cmd --add-service=服务名 --permanent && sudo firewall-cmd --reload
相比传统 iptables,firewalld 更易用,适合动态调整防火墙规则,无需重启服务即可生效。
----------------------------------------------------------------------------