这篇文章最初是放在内部 WiKi 中,本意是让大家了解除了常用的telnet之外,在运维过程中,如果在服务器中未发现相关命令还可以借用像sshwget 等命令测试端口。当想把数据脱敏后放到个人的博客上又觉得太过简陋,因此基本上重写了本文。

前言

在不同平台和场合测试端口是否开放(服务已经处于监听时)往往需要不同的命令,除了系统的区别之外(Windows 主用 telnet,Linux 可能 nc 较多),当连接其他服务器时,可能未必安装熟悉的工具,也可能一个都没安装。因此,除了了解常用端口测试工具的用法之外,还需要知道如何在没有相应工具下完成测试。

命令

nc

因为个人比较喜欢用 nc,因此从这个命令开始谈起。nc 全称 netcat,是由 Hobbit 编写,如果在终端输入 man nc,将会发现它的功能不仅仅只是简单的用来测试端口开放而已。

# 测试指定端口
nc -vz 10.1.1.1 80
# 指定端口范围
nc -vz 10.1.1.1 1-80
# 指定超时值
nc -vz -w2 10.1.1.1 80
# UDP
nc -vz -u 10.1.1.1 801
  • v:表示生成详细的输出(默认未开放不输出);
  • z:表示零模式,即仅进行端口扫描;

telnet

telnet 应该是 Windows 最常用的端口测试工具,之前还遇上有些客户只认 telnet 的测试结果,也是让人无奈。虽说如此 telnet 的缺点也很明显,速度比 nc 慢了一拍不说,测试连通后还会自动会话模式(Linux 下可避免)。

# 测试指定端口
telnet 10.1.1.1 80
# 测试完成后直接退出
echo "" | telnet 10.1.1.1 80

tcping

其实 tcping 应该是 Windows 下替代 telnet 的最佳命令,速度和 nc 有的一拼。只不过这个命令并非自带,需要从网络上下载。

# 测试指定端口
tcping 10.1.1.1 80

nmap

nmap 的功能很强大,但这里仅用于检测端口:

# 最简单的用法,指定端口
nmap 10.1.1.1 -p 80

# TCP Connect 扫描(连接扫描)
nmap -sT 10.1.1.1

# TCP YSN 扫描(半开扫描)
nmap -sS 10.1.1.1

ssh

ssh 除了能用来连接服务器之外,也可以用来检查服务器端口是否开放,这个应该是在没有安装对应工具情况下最佳方法:

# 测试指定端口,用户可随意
ssh [email protected] -p 80

# 使用调试模式
ssh 10.1.1.1 -v -p 80

wget

同样的,wget 除了用来下载文件之外,也可以用于检查端口开放状态:

# 检查指定端口
wget 10.1.1.1:80

最后

其实端口扫描也是一门学问呐,日常工作使用的基本都是 TCP 连接扫描,但除此之外,还有 TCP SYN 扫描(上面 nmap 有提到)、TCP FIN 扫描、TCP ACK 扫描、UDP 扫描等等。