一个执着于技术的公众号

前言

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

本文介绍了几种快速查找 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. Redis的Jedis操作(五)

    需要把jedis依赖的jar包添加到工程中.Maven工程中需要把jedis的坐标添加到依赖. 推荐添加到服务层. 1.连接单机版 第一步:创建一个Jedis对象.需要指定服务端的ip及端口. 第二步 ...

  2. kafka指定partiton生产

    kafka发送一个消息的时候需要封装成一个ProducerRecord : public ProducerRecord(String topic, Integer partition, Long ti ...

  3. Redis 集群方案什么情况下会导致整个集群不可用?

    有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了, 那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用.

  4. Effective Java —— 优先考虑依赖注入来引用资源

    本文参考 本篇文章参考自<Effective Java>第三版第五条"Prefer dependency injection to hardwiring resources&qu ...

  5. Lambda8 表达式

    Lambda 表达式 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构. JDK 也提 ...

  6. Altium Designer 设置多层方法及各层介绍

    因为PCB板子的层分类有很多,所以通过帮助大家能更好地理解PCB的结构,所以把我所知道的跟大家分享一下 1.PCB各层简介 1. Top Layer顶层布线层(顶层的走线) 2. Bottom Lay ...

  7. C 语言中 static 的作用

    在 C 语言中,static 的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函 ...

  8. 【Flutter】Flutter C/C++ 插件的开发 (支持 windows、macos、ios、android )

    一个各平台调用 C/C++ 源码的例子,如何共享代码,配置相关的编译 官方的例子:https://docs.flutter.dev/development/platform-integration/c ...

  9. Vue2.0一个login跳转实例

    需要解决的问题:store存储登录状态Vue-Router导航钩子拦截路由Vue-Resource获取后台的数据需要判断登录返回的user源码参考原文地址 主要技术栈:Vuex + Vue-Resou ...

  10. 关于css中选择器的小归纳(一)

    关于css中选择器的小归纳 一.基本选择器 基本选择器是我们平常用到的最多的也是最便捷的选择器,其中有元素选择器(类似于a,div,body,ul),类选择器(我们在HTML标签里面为其添加的clas ...