在运维和开发的日常工作中,检查远程服务器端口是否开放是一项非常重要的技能。通常情况下,我们会使用像 Telnetsslsofnetstat 这样的经典工具来帮助我们快速定位网络问题。不过,设想一下这样的场景:当你登录到一台仅安装了最基本组件的服务器时,发现这些常用的工具都不可用,这时候你会怎么办呢?这种情况虽然少见但确实可能发生,让人一时之间可能会感到有些棘手。

本文将首先介绍这些常见工具的使用方法,然后带你探索在工具缺失时如何利用 Linux 内置功能和其他系统组件来测试服务器端口。

常见工具及其用法

Telnet

Telnet 是最早被广泛应用的网络调试工具之一。它通过建立 TCP 连接来检查指定端口是否开放。例如,要测试目标服务器 192.168.1.100 的 80 端口,可以使用如下命令:

telnet 192.168.1.100 80

如果连接成功,终端会显示类似Connected to 192.168.1.100的信息,否则会提示无法连接。虽然Telnet功能简单,但在很多情况下足以帮助我们迅速排查问题。

ss

ss是现代 Linux 系统中取代netstat的工具,它能够快速展示系统的网络连接、端口使用情况等。使用如下命令,你可以列出所有监听中的端口:

ss -lnt

这里,-l 表示显示监听状态的连接,-n 以数字形式展示端口,-t 限制只显示 TCP 连接。通过ss,我们可以直观地了解系统当前哪些端口正在被监听。

root@didiplus:~# ss -nlt
State               Recv-Q              Send-Q                           Local Address:Port                            Peer Address:Port             Process              
LISTEN              0                   4096                             127.0.0.53%lo:53                                   0.0.0.0:*                                     
LISTEN              0                   511                                    0.0.0.0:443                                  0.0.0.0:*                                     
LISTEN              0                   4096                                   0.0.0.0:21115                                0.0.0.0:*                                     
LISTEN              0                   4096                                   0.0.0.0:21116                                0.0.0.0:*                                     
LISTEN              0                   4096                                   0.0.0.0:21117                                0.0.0.0:*                                     
LISTEN              0                   4096                                   0.0.0.0:21118                                0.0.0.0:*                                     
LISTEN              0                   4096                                   0.0.0.0:21119                                0.0.0.0:*                                     
LISTEN              0                   4096                                   0.0.0.0:18080                                0.0.0.0:*                                     
LISTEN              0                   128                                    0.0.0.0:5320                                 0.0.0.0:*                                     
LISTEN              0                   511                                    0.0.0.0:80                                   0.0.0.0:*  

lsof

lsof 是一个用于列出当前系统打开文件的强大工具,因为在Unix/Linux中一切皆文件,所以它也可以用来检查端口使用情况。例如,检测哪个进程占用了 80 端口:

lsof -i :80

这条命令会列出所有与端口80相关的进程信息,帮助你快速定位端口被占用的原因。

root@didiplus:~# lsof -i :80
COMMAND       PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
openresty  220542 root   27u  IPv4 159427645      0t0  TCP *:http (LISTEN)
openresty  220543 root   27u  IPv4 159427645      0t0  TCP *:http (LISTEN)

netstat

netstat 是一款传统而经典的网络工具,它同样可以显示系统网络连接、路由表、接口状态等。检测服务器上所有监听的端口,可以使用以下命令:

netstat -lnt

ss类似,-lnt 参数分别代表监听、数字显示以及仅显示 TCP 连接。虽然 netstat 在某些新系统中逐渐被 ss 取代,但它仍然在很多环境中存在并发挥作用。

root@didiplus:~# netstat -pantu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:18080           0.0.0.0:*               LISTEN      217479/docker-proxy 
tcp        0      0 0.0.0.0:21115           0.0.0.0:*               LISTEN      2043987/docker-prox 
tcp        0      0 0.0.0.0:21118           0.0.0.0:*               LISTEN      2043898/docker-prox 
tcp        0      0 0.0.0.0:21119           0.0.0.0:*               LISTEN      2043880/docker-prox 
tcp        0      0 0.0.0.0:21116           0.0.0.0:*               LISTEN      2043943/docker-prox 
tcp        0      0 0.0.0.0:21117           0.0.0.0:*               LISTEN      2043919/docker-prox

当这些工具都缺失时,该如何探测端口?

现实中,有时你可能会遇到一个极端场景——服务器环境异常简化,甚至连上述常用工具都不存在。但Linux系统并不会让你完全“手足无措”,下面介绍几种替代方案:

利用Bash内置的/dev/tcp功能

Bash内置了对TCP连接的支持,通过访问特殊的设备文件/dev/tcp,你可以直接测试远程端口。示例如下:

echo > /dev/tcp/192.168.1.100/80 && echo "端口开放" || echo "端口关闭"

这个命令尝试建立到目标主机80端口的连接,成功则输出“端口开放”,失败则显示“端口关闭”。这种方法无需安装任何额外软件,适合快速嵌入脚本中实现自动化检测。

root@didiplus:~# echo > /dev/tcp/127.0.0.1/80 && echo "端口开放" || echo "端口关闭"
端口开放
root@didiplus:~# echo > /dev/tcp/127.0.0.1/180 && echo "端口开放" || echo "端口关闭"
-bash: connect: Connection refused
-bash: /dev/tcp/127.0.0.1/180: Connection refused
端口关闭

结合 Bash 的 /dev/tcp 功能,可以写个循环脚本,批量扫描一系列端口。例如:

#!/bin/bash
HOST="192.168.1.100"
for PORT in {20..25}; do
    (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 &&
    echo "端口 $PORT 开放" ||
    echo "端口 $PORT 关闭"
done

借助Python脚本

如果系统中安装了Python,我们可以利用 Pythonsocket 模块来探测端口状态。以下一行命令可以判断目标主机 80 端口是否开放:

python -c "import socket; s=socket.socket(); s.settimeout(3); print('开放' if s.connect_ex(('192.168.1.100', 80))==0 else '关闭'); s.close()"

此方法依赖 Python 内置的网络库,能快速返回端口状态,适用于批量检测和自定义脚本开发。

总结

在排查网络问题时,我们常依赖Telnetsslsofnetstat等工具来检查服务器端口。当这些工具不可用或受限时,可以利用Linux自带的功能(如Bash/dev/tcp)和通用软件(如Python)来解决。这不仅展现了技术能力,也体现了灵活运用资源解决问题的技巧。掌握这些方法后,面对网络难题或安全挑战时会更加得心应手。你有过类似经历吗?欢迎分享你的解决方案!

推荐文章