一个执着于技术的公众号

前言

无论是要解决网络连接问题还是配置防火墙,第一件事是要检查系统实际打开了哪些端口。

本文介绍了几种快速查找 Linux 系统上哪些端口向外部开放的方法。

什么是开放端口

监听端口是应用程序监听的网络端口。你要得到的监听端口名单通常可以通过如 ss、netstat 或 lsof 命令查询系统上网络堆栈。每个监听端口都可以使用防火墙打开或关闭(过滤)。

一般而言,开放端口是一个网络端口,它接受来自远程位置的传入数据包。

例如:如果你正在运行的监听端口 80、443 的 Web 服务器,并把这些端口在防火墙上对任何人开放。使用浏览器将能够访问托管在 Web 服务器上的网站。在这种情况下,80 和 443 都是开放端口。

开放端口可能会带来安全风险,因为攻击者可以使用每个开放端口来利用漏洞或执行任何其他类型的攻击。您应该只公开应用程序功能所需的端口,然后关闭所有其他端口。

1 使用 Nmap 命令检查开放端口

Nmap 是功能强大的网络扫描工具,可以扫描单个主机和大型网络。它主要用于安全审核和渗透测试。

Nmap 是端口扫描的首选工具。除端口扫描外,Nmap 还可以检测 Mac 地址、操作系统类型、内核版本等。

nmap工具系统默认没有安装,可通过yum install nmap进行安装


检查系统已安装nmap工具
1.1 确定哪些端口正在监听来自网络的 TCP 连接:


-sT 选项告诉 Nmap 扫描 TCP 端口, -p- 扫描所有端口(65535 个)。如果不使用 -p-,Nmap 将仅扫描 1000 个端口。以上显示,只有端口 22、40402以及 49354 在目标系统上打开。

1.2 要扫描 UDP 端口,请使用 -sU 代替 -sT:


2 使用 Netcat 命令检查开放端口

Netcat(或nc)是一种命令行工具,可以使用 TCP 或 UDP 协议跨网络连接读取和写入数据。

使用 netcat 可以扫描单个端口或端口范围。

首先我们要安装netcat工具,安装步骤如下:

# step 1:下载netcat源码包
wget wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz # step 2:解压
tar -zxvf netcat-0.7.1.tar.gz -C /usr/local # step 3:netcat文件夹重命名
cd /usr/local
mv netcat-0.7.1 netcat # step 4:编译安装
cd /usr/local/netcat
./configure
make && make install # step 5:添加netcat环境变量
vim /etc/profile
追加:
export NETCAT_HOME=/usr/local/netcat
export PATH=$PATH:$NETCAT_HOME/bin # step 6:使环境变量立即生效
source /etc/profile
2.1 扫描远程主机10.43.187.251且端口范围为20-80之间打开的TCP端口


-z 选项指示 nc 仅扫描打开的端口,而不发送任何数据,并且 -v 用于获取更多详细信息。

2.2 要扫描 UDP 端口,请将 -u 选项传递给 nc 命令:
 nc -vz -u 10.43.187.251 20-80

3 使用 Bash 伪设备检查打开的端口

检查某个端口是打开还是关闭的另一种方法是使用 Bash Shell 检查 /dev/tcp/.. 或 /dev/udp/.. 下的伪设备。

在 /dev/HOST/$IP 伪设备上执行命令时,Bash 将在指定端口上打开到指定主机的 TCP 或 UDP 连接。

以下 if..else 语句将检查端口 443 在 kernel.org 是否打开:

if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
echo "Port is open"
else
echo "Port is closed"
fi

输出将如下所示:

Port is open

上面的代码如何工作?

使用伪设备连接到端口时的默认超时时间非常长,因此我们使用 timeout 命令在 5 秒后终止测试命令。如果建立了 kernel.org 端口连接,则 443 测试命令将返回 true。

你也可以使用 for 循环来检查指定的端口范围:

for PORT in {20..80}; do
timeout 1 bash -c "</dev/tcp/192.168.1.251/$PORT &>/dev/null" && echo "port $PORT is open"
done

输出将如下所示:

port 22 is open
port 80 is open

最后

我们为你展示了几种如何使用扫描开放端口的工具,当然你也可以使用其它工具来达到同样的目的,例如:Python Socket 模块、Curl、Telnet 或 Wget。

译者:Mike

链接:https://linuxize.com/post/check-open-ports-linux/

往期精彩

◆  干货 | 给小白的Nginx10分钟入门指南

◆  什么是集群?看完这篇你就知道啦!

◆  干货 | Linux平台搭建网关服务器

◆  干货 | 理解正向代理与反向代理的区别

◆  硬核科普服务器硬盘组成与基本原理

◆  一文带你速懂虚拟化KVM和XEN

◆  实战 | Hadoo大数据集群搭建

如有收获,点个在看,诚挚感谢

手把手教你在Linux中快速检测端口的 3 个小技巧的更多相关文章

  1. 手把手教你写Sublime中的Snippet

    手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...

  2. 手把手教你调试Linux C++ 代码(一步到位包含静态库和动态库调试)

    手把手教你调试Linux C++ 代码 软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求.Windows下Visual Studio为我们做了很 ...

  3. linux中快速清空文件内容的几种方法

    这篇文章主要介绍了linux中快速清空文件内容的几种方法,需要的朋友可以参考下 $ : > filename $ > filename $ echo "" > f ...

  4. Linux中系统检测工具top命令

    Linux中系统检测工具top命令 本文转自:https://www.cnblogs.com/zhoug2020/p/6336453.html 首先介绍top中一些字段的含义: VIRT:virtua ...

  5. 【技术分享】手把手教你使用PowerShell内置的端口扫描器

    [技术分享]手把手教你使用PowerShell内置的端口扫描器 引言 想做端口扫描,NMAP是理想的选择,但是有时候NMAP并不可用.有的时候仅仅是想看一下某个端口是否开放.在这些情况下,PowerS ...

  6. Linux中查看某个端口占用情况

    譬如在linux中排查某个端口是否被占用,可以通过如下命令进行排查,排查方法如下: 1: 排查 : 应用是否被人debug.  8787 为端口号 netstat -anp |grep 8787 图中 ...

  7. linux中可以查看端口占用的方法

    在自己搭建的服务器中,经常容易出现端口被占用的问题,那么怎么知道自己的端口是否被占用了呢? 可以使用下面的方法: linux中可以查看端口占用的方法. netstat -ant | grep 80 ( ...

  8. 快速掌握iOS API的一个小技巧

    快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承 ...

  9. Linux环境搭建 | 手把手教你安装Linux虚拟机

    前言 作为一名Linux工程师,不管是运维.应用.驱动方向,在工作中肯定会需要Linux环境.想要获得Linux环境,一个办法就是将电脑系统直接换成Linux系统,但我们平常用惯了Windows系统, ...

随机推荐

  1. Dubbo 集群容错有几种方案?

    集群容错方案 说明 Failover Cluster 失败自动切换,自动重试其它服务器(默认) Failfast Cluster 快速失败,立即报错,只发起一次调用 Failsafe Cluster ...

  2. 模糊查询 like 语句该怎么写?

    第 1 种:在 Java 代码中添加 sql 通配符. string wildcardname = "%smi%"; list<name> names = mapper ...

  3. NOW()和 CURRENT_DATE()有什么区别?

    NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒. CURRENT_DATE()仅显示当前年份,月份和日期.

  4. JVM的基础知识

    一.JVM的基础知识 1.JVM内存结构: 1.JVM堆内存结构: 2.JVM内存分配: 3.Java的堆机构和垃圾回收: 4.Jvm堆内存配置参数: 5.JVM新生代概念和配置: 6.JVM老生代概 ...

  5. vue中基于sortablejs与el-upload实现文件上传后拖拽排序

    今天做冒烟测试的时候发现商品发布有一个拖拽图片排序功能没做,赶紧加上 之前别的同事基于 vuedraggable 实现过这个功能,我这里自己深度封装了 el-upload ,用这种方式改动很大,而且感 ...

  6. ACM - 动态规划 - UVA323 Jury Compromise

    UVA323 Jury Compromise 题解 考虑用动态规划.该问题要求解的最终状态为,选出的 \(m\) 个人,使得辩方总分与控方总分差的绝对值最小,总分之和最大.即 \(\left| D(\ ...

  7. 修改if-else多层嵌套的方法

    例子:在判断三角形形状的一个程序中,会出现 if-else 的多层嵌套,可利用程序的顺序执行结构重构代码,使其更可读.如果还想保证代码的安全性,可以用函数封装这段代码. #include <st ...

  8. Robinhood基于Apache Hudi的下一代数据湖实践

    1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...

  9. C++ | 虚函数表内存布局

    虚表指针 虚函数有个特点.存在虚函数的类会在类的数据成员中生成一个虚函数指针 vfptr,而vfptr 指向了一张表(简称,虚表).正是由于虚函数的这个特性,C++的多态才有了发生的可能. 其中虚函数 ...

  10. 11_二阶系统的单位阶跃响应_详细数学推导部分_2nd order system unit step response