简介
在管理网络服务器时,了解哪些 IP 地址正在尝试或已经建立了 SSH 连接是非常重要的。本文将介绍如何使用 Linux 中的 ss
命令来列出所有监听 22 端口(默认的 SSH 端口)的连接,并且过滤掉私有 IP 地址,最后对结果进行排序和去重。这个过程可以帮助系统管理员监控潜在的安全威胁以及管理远程访问。
TL;DR: 完整代码我将贴在下方
ss -tnp \ # 使用 ss 命令列出所有 TCP 端口和对应的程序信息
| grep ':22' \ # 过滤出包含端口号 22 的行
| awk '{print $5}' \ # 使用 awk 打印第五列 该列包含了远程地址和端口
| cut -d: -f1 \ # 用冒号作为分隔符 提取第一个字段
| grep -vE '^10\.' \ # 排除以 10. 开头的私有 IP 地址
| grep -vE '^172\.(1[6-9]|2[0-9]|3[0-1])\.' \ # 排除 172.16.0.0 到 172.31.255.255 范围内的私有 IP 地址
| grep -vE '^192\.168\.' \ # 排除 192.168.0.0 到 192.168.255.255 范围内的私有 IP 地址
| sort -u \ # 对结果进行排序并去重
步骤详解
使用 ss
命令获取信息
首先,使用 ss -tnp
来查看所有 TCP 端口及其对应的应用程序信息。这里 -t
表示只显示 TCP 协议的信息,-n
表示不解析服务名称,-p
则是显示与每个套接字相关的进程信息。
ss -tnp \ # 使用 ss 命令列出所有 TCP 端口和对应的程序信息
过滤 SSH 连接
接下来用 grep
来查找包含端口号 22 的行,如果 SSH 默认使用的端口不是 22 请修改。
| grep ':22' \ # 过滤出包含端口号 22 的行
提取 IP 地址
然后,利用 awk
提取出第五列中的数据,这一列包含了远程地址和端口信息。之后再用 cut
命令以冒号为分隔符提取 IP 地址部分。
| awk '{print $5}' \ # 使用 awk 打印第五列
| cut -d: -f1 \ # 用冒号作为分隔符 提取第一个字段 即 IP 地址
排除私有 IP 地址
为了得到更清晰的结果,我们排除了常见的私有 IP 地址段,如 10.0.0.0/8, 172.16.0.0/12 和 192.168.0.0/16。这些范围内的 IP 地址通常用于局域网内,不是来自互联网的真实外部连接。
| grep -vE '^10\.' \ # 排除以 10. 开头的私有 IP 地址
| grep -vE '^172\.(1[6-9]|2[0-9]|3[0-1])\.' \ # 排除 172.16.0.0 到 172.31.255.255 范围内的私有 IP 地址
| grep -vE '^192\.168\.' \ # 排除 192.168.0.0 到 192.168.255.255 范围内的私有 IP 地址
结果整理
最后,使用 sort -u
对最终的 IP 地址列表进行排序并去除重复项,以便于阅读和分析。
| sort -u \ # 对结果进行排序并去重
总结
通过上述步骤,您可以有效地监控和分析针对服务器上 SSH 服务的连接请求。希望这篇教程能够帮助到你!