Debian 12 部署 Endlessh:用焦油坑拖垮 SSH 爆破扫描器

 

更新:docker版,适用范围广 

docker run -d   --name endlessh-go   --restart always   -p 22:2222   shizunge/endlessh-go -logtostderr -v=1

 

任何暴露在公网的服务器,22 端口几乎时刻都在被自动化脚本爆破。与其被动挨打,不如让它们"黏"在你的服务器上出不去。Endlessh 就是这样一个 SSH 焦油坑(tarpit):它伪装成 SSH 服务,对连进来的扫描器以极慢的速度一个字节一个字节地发送无穷无尽的假 banner,让对方的扫描线程长时间卡死,却几乎不消耗你自己的资源。

本文介绍在 Debian 12 上部署 Endlessh 的完整流程。

前置条件

确认真正的 SSH 服务不在 22 端口。 这是最重要的一步。Endlessh 要占用 22 端口当诱饵,所以你平时登录用的 sshd 必须在其他端口,否则部署后你会把自己锁在服务器外面。

查看 sshd 实际监听的端口:

ss -tlnp | grep sshd

如果显示的是 22 以外的端口(例如 0.0.0.0:45798),说明 22 是空闲的,可以安全部署。如果 sshd 还在 22,请先修改 /etc/ssh/sshd_config 中的 Port,重启 sshd 并用新端口验证能登录后,再继续。

安装

Debian 12 的官方仓库自带 endlessh:

apt update
apt install endlessh

配置

编辑配置文件:

nano /etc/endlessh/config

填入以下内容:

Port 22
Delay 10000
MaxLineLength 32
MaxClients 4096

说明:

  • Port 22 — 监听 22 端口,正是扫描器默认爆破的目标。
  • Delay 10000 — 每发送一行假数据之间间隔 10 秒,拖得越慢对方越难受。
  • MaxLineLength 32 — 每行最多 32 字节,内容是随机垃圾。
  • MaxClients 4096 — 最多同时黏住 4096 个连接,超出后拒绝新连接,保护自身资源。

授予绑定特权端口的权限

22 属于特权端口(小于 1024),服务需要额外权限才能绑定。为 systemd 服务添加 drop-in 配置:

systemctl edit endlessh

在编辑区顶部的空白处写入:

[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE

保存退出。

如果你的服务器是 LXC / OpenVZ 等容器化 VPS,systemd 的沙箱隔离可能导致服务无法启动(报错 status=226/NAMESPACE)。此时在上面的 drop-in 中补充关闭相关隔离项即可,这些加固对 endlessh 没有实际意义:

[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=false
PrivateTmp=false
ProtectSystem=false
ProtectHome=false
RestrictNamespaces=false
RestrictAddressFamilies=
SystemCallFilter=

开启日志

默认启动命令不带 -v,服务虽然正常工作,但不会输出任何日志,你将看不到战果。修改启动命令加上 -v:

systemctl edit --full endlessh

找到 ExecStart 行,改为:

ExecStart=/usr/bin/endlessh -v

保存退出。

启动并设为开机自启

systemctl daemon-reload
systemctl restart endlessh
systemctl enable endlessh
systemctl status endlessh --no-pager

看到 active (running),并用以下命令确认 endlessh 正在监听 22:

ss -tlnp | grep ':22'

输出中应能看到 endlessh 占用 *:22。

验证效果

实时查看日志:

journalctl -u endlessh -f

从另一台机器连接测试:

ssh -p 22 你的服务器IP

连接会一直卡住,终端没有任何反应——这正是焦油坑生效的表现。同时 journalctl 中会出现记录:

ACCEPT host=::ffff:192.168.1.2 port=44336 fd=5 n=1/4096
CLOSE  host=::ffff:192.168.1.2 port=44336 fd=5 time=20.006 bytes=24
  • ACCEPT 表示有连接被黏住,n=1/4096 是当前黏住的连接数。
  • CLOSE 表示对方放弃断开,time=20.006 表示它被拖了约 20 秒,bytes=24 表示这期间只收到 24 字节垃圾数据。

time 越大,说明对方被消耗得越多。按 Ctrl+C 退出日志查看,不影响服务运行。

查看统计

运行一段时间后,可以统计战果。

统计总共黏住了多少次连接:

journalctl -u endlessh --no-pager | grep -c ACCEPT

查看来访最频繁的 IP 排行:

journalctl -u endlessh --no-pager | grep ACCEPT | grep -oE 'host=[^ ]+' | sort | uniq -c | sort -rn | head -20

查看被拖得最久的连接:

journalctl -u endlessh --no-pager | grep CLOSE | grep -oE 'time=[0-9.]+' | sort -t= -k2 -rn | head -10

小结

至此,Endlessh 已常驻守护在 22 端口,把扫描器拦在门口慢慢消耗。它不攻击、不破坏,只是让对方的爆破效率大打折扣,是一种低成本、低风险的被动防护手段。

如果想让防护更彻底,可以进一步搭配 fail2ban,对被黏住的 IP 在拖延一段时间后直接加入防火墙黑名单,实现"拖慢 + 封禁"的组合效果。

posted @ 2026-10-22 15:13  sherlock-merlin  阅读(11)  评论(0)    收藏  举报