目录
- 查看端口状态与监听信息
ss- 现代、快速的替代品netstat- 传统但依然强大的工具lsof- 列出打开的文件,也能看端口nc/netcat- 网络瑞士军刀,用于探测端口
- 管理端口与服务
firewalld- 动态防火墙管理器(CentOS/RHEL 7+)iptables- 经典的防火墙工具ufw- Uncomplicated Firewall (Ubuntu/Debian)
- 综合示例与实战
- 我如何知道哪个程序占用了 80 端口?
- 如何开放一个端口?
- 如何限制某个 IP 访问我的 22 端口?
- 如何检查远程服务器的一个端口是否可达?
- 常见问题与解答
查看端口状态与监听信息
ss - 推荐 (Socket Statistics)
ss 命令是 netstat 的现代替代品,速度更快,信息更全,在大多数现代 Linux 发行版中是默认安装的。

常用选项:
-t: TCP 端口-u: UDP 端口-l: 只显示监听 (Listening) 的端口-n: 以数字形式显示地址和端口,不进行 DNS 解析(速度快)-p: 显示使用该端口的进程 ID (PID) 和名称-a: 显示所有端口 (包括监听和非监听)-4: 只显示 IPv4 端口-6: 只显示 IPv6 端口
示例:
-
查看所有监听的 TCP 端口:
ss -tlnp
输出示例:
(图片来源网络,侵删)State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 511 [::]:80 [::]:* LISTEN 0 4096 127.0.0.1:631 127.0.0.1:*State: 状态,LISTEN表示正在监听。Local Address:Port: 本地地址和端口号。PID/Program name: 进程 ID 和程序名(由-p选项显示)。
-
查看所有监听的 UDP 端口:
ss -ulnp
-
查找特定端口(如 8080)是否被占用:
ss -tlnp | grep 8080
-
查看所有与某个 IP 地址相关的连接:
ss -tunap | grep 192.168.1.100
netstat - 传统工具
netstat 是一个非常经典和广泛使用的网络工具,虽然在新系统中逐渐被 ss 替代,但仍然非常常见。

常用选项:
-t: TCP-u: UDP-l: 只显示监听-n: 数字形式-p: 显示 PID/程序名-a: 所有-c: 持续刷新(类似top)
示例:
-
查看所有监听的 TCP 端口:
netstat -tlnp
-
查看所有网络连接(包括监听和非监听):
netstat -an
-
持续监控网络连接状态变化:
netstat -c
lsof - List Open Files
lsof 的主要功能是列出系统当前打开的文件,因为 Linux 中一切皆文件,所以网络端口也被视为文件。lsof 是查找端口占用进程的利器。
常用选项:
-i: 列出符合条件的进程。[4|6]: IPv4 或 IPv6。[TCP|UDP]: 指定协议。端口号: 指定端口号。@IP地址: 指定 IP 地址。
-P: 不将端口号解析为服务名(速度更快)。-n: 不将主机名解析为 IP 地址(速度更快)。-s: 显示套接字层信息,如 TCP 状态。
示例:
-
查看谁在使用 80 端口:
sudo lsof -i :80
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN) nginx 1235 www-data 6u IPv4 12345 0t0 TCP *:http (LISTEN) -
查看所有监听的 TCP 端口:
sudo lsof -i -P -n | grep LISTEN
nc / netcat - 网络瑞士军刀
nc 是一个功能强大的网络工具,用于读取和写入网络连接,它常用于网络测试、端口扫描和数据传输。
常用选项:
-z: 只进行端口扫描,不发送数据。-v: 显示详细信息(verbose)。-n: 不进行 DNS 解析。-w <秒数>: 设置超时时间。
示例:
-
扫描本地主机的 1-1024 端口:
nc -zv localhost 1-1024
输出示例:
Connection to localhost 22 port [tcp/ssh] succeeded! Connection to localhost 80 port [tcp/http] succeeded! -
检查远程服务器 (192.168.1.10) 的 22 端口是否开放:
nc -zv 192.168.1.10 22
管理端口与服务
这部分命令用于开放或关闭网络端口,主要通过防火墙实现。
firewalld - 动态防火墙管理器 (CentOS/RHEL 7+)
firewalld 提供了动态管理的防火墙,支持区域、服务和端口,无需重启即可更新规则。
常用命令:
-
启动并设置开机自启:
sudo systemctl start firewalld sudo systemctl enable firewalld
-
开放一个端口(如 8080/TCP):
# 临时添加,重启后失效 sudo firewall-cmd --add-port=8080/tcp # 永久添加 sudo firewall-cmd --permanent --add-port=8080/tcp # 重新加载防火墙使永久规则生效 sudo firewall-cmd --reload
-
查看已开放的端口:
sudo firewall-cmd --list-ports
-
移除一个端口:
sudo firewall-cmd --permanent --remove-port=8080/tcp sudo firewall-cmd --reload
-
开放一个预定义的服务(如 http):
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload
iptables - 经典的防火墙工具
iptables 是 Linux 内核的防火墙工具,功能极其强大,但规则是静态的,修改后需要保存和重启服务才能生效。
常用命令:
-
开放一个端口(如 8080/TCP):
# -A INPUT: 追加规则到 INPUT 链的末尾 # -p tcp: 协议为 TCP # --dport 8080: 目标端口为 8080 # -j ACCEPT: 动作为接受 sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT # 保存规则(CentOS/RHEL) sudo service iptables save # 保存规则 (Debian/Ubuntu) sudo iptables-save > /etc/iptables/rules.v4
-
查看当前规则:
sudo iptables -L -n -v
-
移除一个规则:
# 需要和添加时完全一样,除了 -A 换成 -D sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT sudo service iptables save
ufw - Uncomplicated Firewall (Ubuntu/Debian)
ufw 是 iptables 的一个前端工具,旨在简化防火墙的配置,语法非常简单。
常用命令:
-
启用 UFW:
sudo ufw enable
-
开放一个端口(如 8080):
sudo ufw allow 8080
-
开放特定协议的端口(如 8080/tcp):
sudo ufw allow 8080/tcp
-
开放一个预定义的服务(如 http):
sudo ufw allow http
-
查看防火墙状态和规则:
sudo ufw status verbose
-
删除规则:
# 根据规则序号删除 sudo ufw delete 3 # 根据规则内容删除 sudo ufw delete allow 8080
综合示例与实战
我如何知道哪个程序占用了 80 端口?
# 使用 ss sudo ss -tlnp | grep ':80' # 或者使用 lsof sudo lsof -i :80
目的:快速定位占用端口的进程,以便排查问题或终止进程。
如何开放一个端口?
假设你的应用运行在 3000 端口,你需要从外部访问它。
对于 Ubuntu/Debian 系统:
# 1. 开放端口 sudo ufw allow 3000 # 2. 检查规则是否生效 sudo ufw status
对于 CentOS/RHEL 系统:
# 1. 开放端口(永久) sudo firewall-cmd --permanent --add-port=3000/tcp # 2. 重新加载防火墙 sudo firewall-cmd --reload # 3. 检查端口是否开放 sudo firewall-cmd --list-ports
目的:配置防火墙,允许外部流量访问指定端口。
如何限制某个 IP 访问我的 22 端口?
假设你想禁止 IP 168.1.200 访问你的 SSH 服务(22端口)。
对于 iptables (最灵活):
# -s 192.168.1.200: 源地址 # -j DROP: 丢弃数据包 sudo iptables -A INPUT -p tcp -s 192.168.1.200 --dport 22 -j DROP sudo service iptables save
对于 ufw (语法简单):
# deny from: 拒绝来自 sudo ufw deny from 192.168.1.200 to any port 22
目的:实现基于 IP 地址的访问控制,增强安全性。
如何检查远程服务器的一个端口是否可达?
你想测试你的云服务器(IP 0.113.10)的 80 端口是否可以正常访问。
# 使用 nc (netcat) nc -zv 203.0.113.10 80 # 使用 telnet (传统工具,但很多系统默认有) telnet 203.0.113.10 80 # (如果能连接上,会显示一个空白界面) # (如果不能连接,会显示 connection refused 或 timeout)
目的:网络连通性测试,验证端口是否开放且防火墙没有阻止。
常见问题与解答
Q: ss 和 netstat 有什么区别?我应该用哪个?
A: ss 是 netstat 的现代替代品,它直接从内核获取信息,速度更快,尤其是在连接数很多的系统上。ss 还提供了更多的功能,如 TCP 状态统计。推荐在所有新系统中使用 ss。
Q: 为什么我用 ss 或 netstat 看不到端口?
A: 最常见的原因是 权限问题,查看其他用户或需要特殊权限的进程的端口信息通常需要 sudo。
# 错误(可能看不到所有信息) ss -tlnp # 正确(可以看到所有进程的端口信息) sudo ss -tlnp
Q: LISTEN 状态是什么意思?
A: LISTEN 状态表示一个进程正在某个端口上“监听”或“等待”新的连接请求,这是服务器端程序(如 Nginx, Apache, SSH)的正常状态,客户端程序在连接时不会处于 LISTEN 状态。
Q: 为什么我开放了端口,但外部还是连不上? A: 这是一个经典问题,请按以下顺序排查:
- 防火墙:确认你的系统防火墙(
firewalld,iptables,ufw)已经正确开放了该端口。 - 云服务商安全组:如果你使用的是云服务器(如 AWS, 阿里云, 腾讯云),检查其控制台中的安全组或网络ACL规则,确认入站规则已放行该端口。
- 应用程序:确认你的应用程序确实在监听
0.0.0(监听所有 IP)或正确的公网 IP,而不是0.0.1(仅本地访问)。 - 端口冲突:确认没有其他程序占用了同一个端口。
- 网络:使用
telnet或nc从外部机器测试,看是超时还是connection refused,这能帮你定位问题是网络不通还是服务未启动。
希望这份大全对你有帮助!
