如何在 Linux 上检查开放的端口并关闭不需要的端口
检查服务器开放端口并关闭不必要的端口是网络安全管理中的关键环节,开放端口如同服务器的“窗口”,若其中存在未被利用或未受保护的端口,就如同为潜在的攻击者敞开了大门,他们可能会利用这些端口的漏洞来入侵系统、窃取数据或进行恶意操作。通过检查开放端口,可以明确哪些端口正在被合法服务使用,哪些可能是被遗忘或未授权的端口,从而及时发现潜在的安全隐患。关闭不必要的端口则能有效减少攻击面,降低服务器被攻击的风险,同时也有助于优化系统性能,避免资源被无效占用,确保服务器的安全、稳定和高效运行。
本文介绍如何在本地和远程检查服务器上开放的端口,以及如何关闭它们。
1.在本地检查Linux上开放的端口
所有计算机操作系统(OS)都包含netstat命令,用于监控网络连接。
以下命令使用netstat显示使用 TCP 协议的所有监听端口:
[root@monitor ~]# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 localhos:x11-ssh-offset 0.0.0.0:* LISTEN
tcp 0 0 localhost:6011 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 monitor:domain 0.0.0.0:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 localhos:x11-ssh-offset [::]:* LISTEN
tcp6 0 0 localhost:6011 [::]:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
[root@monitor ~]#
其中:
- netstat:调用程序
- -l:列出监听端口
- -t:指定TCP协议
输出内容以人类友好的方式排列,按列显示协议、接收和发送的数据包、本地和远程IP地址以及端口状态。
如果将TCP协议替换为UDP,结果只会显示开放端口(至少在Linux上),而不会指定状态。与TCP协议不同,UDP协议是无状态的。
[root@monitor ~]# netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 monitor:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 0.0.0.0:sunrpc 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:824 0.0.0.0:*
udp 0 0 0.0.0.0:37740 0.0.0.0:*
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp6 0 0 [::]:sunrpc [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:824 [::]:*
[root@monitor ~]#
也可以不指定协议,仅使用-l或–listen选项来获取所有监听端口的信息,无论其使用何种协议:
[root@monitor ~]# netstat --listen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 localhost:6011 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 monitor:domain 0.0.0.0:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 localhost:6011 [::]:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
udp 0 0 monitor:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 0.0.0.0:sunrpc 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:824 0.0.0.0:*
udp 0 0 0.0.0.0:37740 0.0.0.0:*
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp6 0 0 [::]:sunrpc [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:824 [::]:*
raw6 4608 0 [::]:ipv6-icmp [::]:* 7
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 26821 @/tmp/dbus-VWpRiaqJ
unix 2 [ ACC ] STREAM LISTENING 19199 /var/run/spice-vdagentd/spice-vdagent-sock
unix 2 [ ACC ] STREAM LISTENING 19201 /run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 19204 /var/run/libvirt/virtlockd-sock
……
如上,显示了 TCP、UDP和Unix套接字协议的信息。
前面所有示例都展示了如何显示没有建立连接的监听端口信息。以下命令展示了如何显示监听端口和已建立的连接:
netstat -vatn
其中:
- netstat:调用程序
- -v:详细信息
- -a:显示活动连接
- -t:显示TCP连接
- -n:以数字形式显示端口
# 实例:假设现在系统中发现了一个可疑进程,想要检查与之关联的端口。
根据这个问题,我们可以使用
lsof命令,该命令用于列出与进程相关联的打开文件。lsof -i 4 -a -p <进程数字>比如,现在要检查进程
1593:[root@monitor ~]# lsof -i 4 -a -p 1593
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 1593 root 13u IPv4 29723 0t0 TCP localhost:smtp (LISTEN)其中:
- lsof:调用程序
- -i:列出与互联网交互的文件,选项4表示仅打印IPv4,选项6可用于IPv6。
- -a:指示输出结果进行逻辑与操作
- -p:指定要检查的进程的PID编号
正如前面所看到的,该进程与监听的SMTP端口相关联。
2.远程检查 linux 上的开放的端口
如果想要检测远程系统的端口,最常用的工具是Nmap(网络映射器)。下面对远程服务器
haopython.com进行端口扫描:nmap www.haopython.com输出分为 3 列,分别显示端口、端口状态和在端口后面侦听的服务:
[root@monitor ~]# nmap www.haopython.com
Starting Nmap 6.40 ( http://nmap.org ) at 2025-05-08 10:03 CST
Nmap scan report for www.haopython.com (147.94.44.183)
Host is up (0.022s latency).
Not shown: 994 filtered ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
888/tcp open accessbuilder
3306/tcp open mysql
8888/tcp open sun-answerbook
Nmap done: 1 IP address (1 host up) scanned in 9.97 seconds
[root@monitor ~]#默认情况下,Nmap仅扫描最常用的1000个端口。如果要Nmap扫描所有端口,则添加下面参数并运行:
nmap -p- www.haopython.com3.在CentOS 8上移除httpd服务
为确保服务器的安全,除了防火墙规则以保持端口被阻止外,还建议删除不必要的服务。
下面举例删除CentOS 8上已经安装且不提供服务的
httpd服务。1)确认服务状态
systemctl status httpd2)停止服务并禁用自动启动
systemctl stop httpd
systemctl disable httpd3)移除服务
使用
yum或dnf(CentOS 8 默认使用dnf)来移除httpd服务及其相关文件:dnf remove httpd4)验证移除结果
dnf list installed | grep httpd如果没有输出,说明
httpd服务及其相关文件已被成功移除。通过以上步骤,成功移除了 CentOS 8 系统中不再需要的
httpd服务,减少了系统资源的占用,同时也降低了因未使用服务可能带来的安全风险。4.使用 UFW 关闭 Linux 上的开放的端口
如果我们发现有不需要开放的端口,最简单的解决方案是使用UFW(简单防火墙)将其关闭,某些Linux 系统可能需要先安装UFW。
关闭端口有两种方式,一种是使用
deny选项,另一种是使用reject选项,两者的区别在于reject指令会告知另一端连接已被拒绝。要使用
deny规则阻止22端口,则运行:ufw deny 22要使用
reject规则阻止22端口,请运行:ufw reject 225.使用 iptables 关闭 Linux 上的开放的端口
虽然 UFW 是管理端口的最简单方法,但它是 Iptables 的前端。
以下示例显示如何使用 iptables 拒绝与端口
22的连接:iptables -I INPUT -p tcp --dport 22 -j REJECT上述规则表示拒绝所有目标端口(dport)为
22的TCP传入(INPUT)连接。被拒绝后,源端将被告知连接已被拒绝。下面规则只是丢弃所有数据包,而不通知源连接被拒绝:
iptables -A INPUT -p tcp --dport 22 -j DROP6.使用firewalld在Linux上关闭开放的端口
确保 firewalld 防火墙已经运行,假设现在想关闭端口
80/tcp,可以使用以下命令:firewall-cmd --zone=public --remove-port=80/tcp --permanent然后重新加载:
firewall-cmd --reload最后确认端口是否已关闭:
firewall-cmd --list-all
如何在 Linux 上检查开放的端口并关闭不需要的端口的更多相关文章
- 如何在Linux上检查SSH的版本(转)
SSH协议规范存在一些小版本的差异,但是有两个主要的大版本:SSH1 (版本号 1.XX) 和 SSH2 (版本号 2.00). 事实上,SSH1和SSH2是两个完全不同互不兼容的协议.SSH2明显地 ...
- Linux上防火墙开放对应的端口
在Linux上防火墙开放对应的端口的命令如下: 方式一: [root@localhost sbin]# /sbin/iptables -I INPUT -p tcp --dport 80 -j ACC ...
- 关于如何在Linux上使用Nugix反向代理部署net core3.1项目
本文意在教大家如何在Linux上部署net core web项目,本人通过实践已经成功可以通过外网访问我部署在阿里云服务器上的站点. 一:需要用到的东西如下: 1:一个基于net core框架下的we ...
- 如何在 Linux 上安装应用程序
如何在 Linux 上安装应用程序 编译自:https://opensource.com/article/18/1/how-install-apps-linux作者: Seth Kenlon原创:LC ...
- 如何在Linux上使用VIM进行.Net Core开发
对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE. Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linu ...
- 如何在 Linux 上复制文件/文件夹到远程系统?
从一个服务器复制文件到另一个服务器,或者从本地到远程复制是 Linux 管理员的日常任务之一. 我觉得不会有人不同意,因为无论在哪里这都是你的日常操作之一.有很多办法都能处理这个任务,我们试着加以概括 ...
- 如何在Linux上清理内存缓存、缓冲与交换空间
如何在Linux上清理内存缓存.缓冲与交换空间 与其他类型的操作系统一样,GNU/Linux已经有效的实现了内存管理,甚至更加优秀.但是如果任何进程正在吃光你的内存,并且你想清理它,Linux提供了一 ...
- 如何在 Linux 上设置密码策略
https://linux.cn/article-2518-1.html 用户帐号管理是系统管理员最重要的工作之一.而密码安全是系统安全中最受关注的一块.在本教程中,我将为大家介绍如何在 Linux ...
- [转帖]如何在Linux上使用命令行查看硬件信息
如何在Linux上使用命令行查看硬件信息 时间:2016-01-13 作者:admin 分类:新手入门 阅读:126次 http://embeddedlinux.org.cn/emb-linux/ ...
- 如何在Linux上通过grub添加内核参数
转自Linux中国 我们可以在linux内核启动时为其提供各种各样的参数.这些参数可以自定义内核默认的行为,或者通知内核关于硬件的配置信息.内核参数应在内核启动时通过引导装载程序,如GRUB或LILO ...
随机推荐
- 常用的linux命令以及详解
Linux系统中包含了大量的命令,这些命令是用户与系统交互的主要方式.以下是一些常用的Linux命令及其详细解释: 1. 文件和目录操作 ls:列出目录内容. ls:列出当前目录的文件和子目录. ls ...
- FANUCR2000iB发那科机器人保养有哪些
1.机器人保养的重要性 机器人都需要预防性保养,这样可以保证它们在生产线上保持最佳性能和实现一致性.当机器人没有进行定期的预防性保养检查,可能会导致零部件损坏或故障,从而致使生产放慢甚至停机. ...
- C# List LinQ Lambda 表达式
------------恢复内容开始------------ # 参考链接 : https://blog.csdn.net/wori/article/details/113144580 首先 => ...
- 从汇编层解读Golang的闭包实现:逃逸分析与性能影响
本文精心梳理了一系列面试中具有一定难度的高频Golang问题,其中部分知识点可能你之前未曾深入探究,然而它们却在面试和实际工作中至关重要. 包括:Golang的基础语法.并发模型.内存管理等核心知识点 ...
- SparkRDD算子(transformations算子和actions算子)
RDD提供了两种类型的操作:transformation和action1.所有的transformation都是采用的懒策略,如果只是将transformation提交是不会执行计算的,计算只有在ac ...
- redux vs redux-toolkit 及源码实现
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霜序 前言 为何讲这个内容?以为后续大家会使用 redux ...
- Windows 提权-弱服务_1
本文通过 Google 翻译 Weak Service File Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭 ...
- Ansible管理密码库文件
ansible可能需要访问密码或API密钥等敏感数据,以便能配置受管主机.通常,此信息可能以纯文本形式存储在清单变量或其他Ansible文件中.但若如此,任何有权访问Ansible文件的用户或存储,这 ...
- 可视化|数据可视化文档之 echarts 项目初始化
数据可视化文档之 echarts 项目初始化 环境搭建 # node 环境 nvm install v11.15.0 # or nvm use 11.15.0 # 查看 node 版本 node -V ...
- SpringBoot + 布隆过滤器:亿级数据下的高效防护盾与缓存穿透实战指南
在当今高并发.海量数据的应用场景中,布隆过滤器凭借其极低的内存占用和极快的查询效率,成为解决缓存穿透.数据预判等难题的利器.本文深度解析布隆过滤器的核心原理与实战应用,手把手教你如何将这一数据守门员融 ...