Post

Endlessh (SSH Tarpit): як змусити хакерських ботів чекати вічність на вашому VPS

Endlessh (SSH Tarpit): як змусити хакерських ботів чекати вічність на вашому VPS

🇬🇧 Read this article in English


Кожен, хто орендував хоча б один публічний VPS-сервер, знає сумну реальність: уже через 15 хвилин після активації IP-адреси системний журнал /var/log/auth.log починає тріщати по швах.

Сотні автоматизованих ботнетів та скрипт-кідіс з усього світу цілодобово сканують стандартний порт 22, перебираючи найпростіші паролі: admin, root, test, qwerty.

Зазвичай системні адміністратори захищаються класично:

  1. Переносять SSH на випадковий порт.
  2. Встановлюють утиліту fail2ban, яка блокує IP після кількох невдалих спроб.

Але подумайте самі: коли fail2ban відкидає атакувальника, бот миттєво звільняє свій мережевий сокет і йде сканувати наступну жертву. А що, якщо замість блокування… змусити бота чекати вічність?

Саме так працює концепція SSH Tarpit (Смоляна яма), а найкращим її втіленням є крихітна утиліта Endlessh.

Логи та моніторинг спійманих ботів у Endlessh Мал. 1. Термінал Endlessh: боти застряють у смоляній ямі на 24 години і навіть на 3 дні


Що таке Endlessh і як працює «Смоляна яма»?

Згідно з офіційним стандартом протоколу SSH (RFC 4253, розділ 4.2), перед тим, як сервер і клієнт почнуть узгоджувати версію шифрування, сервер має право відправити довільний текстовий заголовок (банер). Клієнт зобов’язаний його прочитати.

Endlessh експлуатує це правило з витонченим знущанням:

  1. Бот підключається до порту 22 у надії знайти вхід до сервера.
  2. Endlessh приймає підключення, але не просить пароль.
  3. Замість цього він починає відправляти випадкові рядки банера зі швидкістю… один рядок раз на 10 секунд.
  4. Скрипти автоматизованих сканерів зазвичай не мають коротких таймаутів на стадії вітального банера, тому вони сідають на гачок і зависають на години, дні або навіть тижні.
1
2
3
4
5
6
7
8
9
[ Хакерський Бот ]
        │
        ▼ (Спроба підключення на порт 22)
[ Endlessh Tarpit ]
        │ ── (Рядок 1) ──> [Чекає 10 секунд...]
        │ ── (Рядок 2) ──> [Чекає 10 секунд...]
        │ ── (Рядок 3) ──> [Чекає 10 секунд...]
        ▼
   Бот заблокований на тижні! Ресурси атакуючого вичерпано.

При цьому сам Endlessh написаний на C (або Go), використовує неблокуючий асинхронний механізм poll() і споживає менше 2-3 МБ оперативної пам’яті, навіть коли тримає тисячі атакуючих з’єднань одночасно!


Крок 1. Переносимо справжній SSH на безпечний порт

Перш ніж відкрити пастку на порту 22, необхідно перенести справжній вхід до сервера на інший порт (наприклад, 2222).

⚠️ Увага: Не закривайте поточну сесію термінала, поки не перевірите новий порт у паралельному вікні, щоб не втратити доступ до сервера!

  1. Відкрийте конфігурацію SSH-демона:
    1
    
    sudo nano /etc/ssh/sshd_config
    
  2. Знайдіть рядок #Port 22 або Port 22, розкоментуйте його та змініть на:
    1
    
    Port 2222
    
  3. Якщо на сервері увімкнено UFW-фаєрвол, дозвольте новий порт:
    1
    2
    
    sudo ufw allow 2222/tcp
    sudo ufw reload
    
  4. Перезапустіть службу OpenSSH:
    1
    
    sudo systemctl restart ssh
    
  5. Обов’язкова перевірка: Відкрийте нове вікно термінала на своєму комп’ютері та увійдіть:
    1
    
    ssh -p 2222 user@your-server-ip
    

    Якщо вхід успішний — вітаємо, тепер стандартний порт 22 вільний для нашої пастки!


Крок 2. Розгортання Endlessh у Docker

Найчистіший та найзручніший спосіб запустити пастку — використати оптимізований образ endlessh-go, який на додаток вміє збирати статистику для Prometheus:

  1. Створимо папку на VPS:
    1
    
    sudo mkdir -p /opt/endlessh && cd /opt/endlessh
    
  2. Створимо файл docker-compose.yml:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    version: '3.8'
    
    services:
      endlessh:
        image: ghcr.io/shizuma/endlessh-go:latest
        container_name: endlessh
        restart: unless-stopped
        ports:
          - "22:2222"   # Слухаємо зовнішній порт 22 і передаємо в контейнер
          - "2112:2112" # Метрики Prometheus (опціонально)
        environment:
          - ENDLESSH_MS_DELAY=10000 # Затримка між рядками (10 000 мс = 10 секунд)
          - ENDLESSH_MAX_CLIENTS=4096 # Максимальна кількість спійманих ботів
          - ENDLESSH_LOG_LEVEL=info
    
  3. Запускаємо пастку:
    1
    
    docker compose up -d
    

Переконайтеся, що порт 22 відкритий у вашому фаєрволі (sudo ufw allow 22/tcp).


Крок 3. Насолоджуємося видовищем (Аналіз логів)

Уже через 10–20 хвилин перші боти відчують на собі всю міць смоляної ями. Перегляньте живий журнал Endlessh:

1
docker logs -f endlessh

У логах ви побачите захопливу картину:

1
2
3
4
2026-09-27T12:30:15Z ACCEPT host=194.26.29.112 port=54122
2026-09-27T12:35:42Z ACCEPT host=45.33.10.154 port=38761
2026-09-27T13:14:02Z CLOSE host=185.112.55.90 duration=86400s (24 hours in tarpit) bytes=8640
2026-09-27T18:22:50Z CLOSE host=194.26.29.112 duration=273600s (3 days, 4 hours in tarpit) bytes=27360

Зверніть увагу на параметр duration:

  • Деякі боти мають таймаут у 15 секунд і відпадають швидко.
  • Проте “найвпертіші” сканери з автоматизованих мереж ботнетів зависають на 24 години, а інколи — на 3-4 дні!
  • Протягом усього цього часу бот тримає відкритий мережевий сокет, витрачає ресурси атакуючого сервера і не може сканувати нікого іншого в інтернеті.
  • А наш VPS відправив йому лише жалкі 27 кілобайт сміттєвого тексту за понад 3 дні.

Бонус: Моніторинг через Grafana та Prometheus

Оскільки ми розгорнули версію endlessh-go, вона віддає метрики на порту 2112/metrics. Якщо у вас уже налаштований стек моніторингу Prometheus + Grafana (про який ми писали раніше), додайте в конфіг Prometheus:

1
2
3
4
scrape_configs:
  - job_name: 'endlessh'
    static_configs:
      - targets: ['localhost:2112']

У Grafana є готові безкоштовні дашборди (наприклад, ID 14197), які візуалізують:

  • Кількість ботів, що “варяться” в ямі просто зараз.
  • Графік найдовших утримань атакуючих.
  • Сумарний обсяг зекономленого трафіку та географію IP-адрес.

Висновок: Чому це найкращий тролінг ботів?

Endlessh — це не просто весела забавка, а філософія активного цифрового опору:

  1. Зниження навантаження: Замість постійного опрацювання тисяч спроб автентифікації процесором OpenSSH, ви зв’язуєте руки ботам в один нескінченний потік.
  2. Внесок у кібербезпеку інтернету: Кожен ботнет має обмежену кількість одночасних TCP-з’єднань. Утримуючи 100-200 ботів на своєму сервері, ви фізично рятуєте чийсь чужий непропатчений сервер від підбору паролів.

Спробуйте розгорнути Endlessh на своєму VPS — це той рідкісний випадок, коли спостерігати за системними логами приємніше, ніж дивитися серіал! 🪤✨

This post is licensed under CC BY 4.0 by the author.