如何在 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 ...
随机推荐
- 1 前端知识学习-初始Web和Web标准
0️⃣ 初始Web和Web标准 Web Web(World Wide Web) 即全球广域网.也成为万维网.我们常说的Web端就是网页端. 网页 网页是构成网站的基本元素.网页主要由文字.图像 ...
- 傻妞教程——对接PagerMaid-Pyro
PagerMaid-Pyro 是一个开源的 TG 人形自走 Bot 方案,功能强大而丰富,可以帮助你打造专属的便利功能. 为什么叫人形机器人? TG 官方是有 Bot Api 的,但是这个 Api 需 ...
- Nginx - [02] 安装部署&配置
官网下载地址:http://nginx.org/en/download.html 001 || 安装[windows] 解压之后,在命令提示符窗口启动nginx.exe 在浏览器访问80端口:loca ...
- Linux - centos6.6升级openssh9.7p1
一.注意事项 1.任何会被修改的配置文件都要提前备份 2.每一步操作都要记录 3.提前预演,知道可能遇到的问题,以及对应的解决方法,能够在生产环境上升级时,更快完成操作. 4.一开始用来操作的ssh会 ...
- 基于Unity调取摄像头方式的定时抓拍保存图像方法小结
上一篇<Maxmspjitter实现实时抓取摄像头画面并制成序列图 (定时抓拍)>已讲到了定时抓拍的相关问题解决方案,这一篇继续,采用不同的方法,不同的平台----基于Unity. 目标明 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- mysql的自增id
为图方便,建表直接用了mysql的自增id 开发时进行插入操作时,发现插入失败id也自增了,导致id不连续 并且无论是删除还是插入,id是一直在增加 查询结果 MySQL自增ID机制: InnoDB存 ...
- [tldr]windows使用scoop安装make工具辅助程序编译
make是一个好用的GNU工具,用来辅助我们进行自动化的程序编译,只需要一个Makefile文件,即可实现一行指令自动编译 scoop是windows的一个包管理工具 安装 scoop bucket ...
- 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
需求背景 阿里云服务器到期了,正好家里有闲置的电脑,还有公网IP,打算装个linux服务器使用.本文章主要重点是实现远程连接虚拟机内服务器,打通网络连接,更多玩法大家可以自行探索. ps: 公网IP自 ...
- k8s node节点报错 dial tcp 127.0.0.1:8080: connect: connection refused
前言 在搭建好 kubernetes 环境后,master 节点拥有 control-plane 权限,可以正常使用 kubectl. 但其他 node 节点无法使用 kubectl 命令,即使同步过 ...