Атаки на сервера в России очень сильно изменились за последние 4 года, их стало в десятки раз больше, атакующие активно использую ИИ и при этом, законодатели решили еще и усилить эффект - запретив использовать западные бесплатные технологии защиты вроде Cloudflare. В сочетание с законом о приземление - когда ты обязан использовать сервера в РФ это дает кошмарный эффект в защите и огромный бонус для атакующего.

В этой статье мы защитим свой сервер, защитим SSH, защитим Nginx, панель управления Fastpanel и еще побочное преимущество - получим VPN на основе Tailscale (Wireguard).

Это статья написана исключительно на основе моего личного опыта - как я защищаю свои сервера. Если вам есть что добавить - буду рад это услышать. И так, у нас в нашем примере у нас чистая Ubuntu 24 server.

1. Подготовка и обновление

Зачем: Уязвимости находят каждый день. Сервер с устаревшим ядром — легкая добыча.

Сразу после входа обновляем систему и настраиваем авто обновления безопасности.

apt update && apt upgrade -y
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

Теперь критические патчи будут ставиться сами, пока вы спите.

2. Упр��вление доступом (IAM)

Работать под root — самоубийство. Любая ошибка в скрипте или троян дают хакеру полные права на уничтожение системы.

Создаем администратора

Создадим пользователя bert и дадим ему права sudo.

adduser bert
usermod -aG sudo bert
su - bert

3. Создание и установка ключа SSH

Генерация SSH-ключей (На вашем ПК)

Зачем: Ключи Ed25519 — нельзя брутфорсить, это точно лучше пароля.

В Windows (PowerShell) или macOS/Linux:

ssh-keygen -t ed25519 -C "admin@company.com"
# Сохраните ключ (обычно ~/.ssh/id_ed25519) и задайте парольную фразу.

Копируем публичный ключ на сервер:

# 1. Если вы на Linux/Mac:
ssh-copy-id user@ip-вашего-сервера

# Если вы на Windows (ручной метод):
# 1. Скопируйте содержимое файла id_ed25519.pub
# 2. На сервере:
su - bert
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 ваш_ключи mail@domain.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

4. Mesh-сети + VPN

Зачем: Войти на сервер по SSH будет возможно только через вашу mesh-сеть

Установка Tailscale

Это mesh-VPN, который объединит все ваши устройства и сервера в закрытую сеть, через которую можно стучаться в свободный интернет.

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
# Пройдите авторизацию по ссылке.
sudo tailscale set --advertise-exit-node

Теперь у сервера есть IP вида 100.x.y.z. Его можно найти в admin-консоли Tailscale, в списке машин — нажать на три точки напротив той, через которую будет идти весь трафик (подсказка, название нашего сервера), Edit Routte Settings → активировать переключатель Use as exit node. И там найдем наш новый IP сервера, потом мы его используем.

Парочку фичей:

Переходим в консоли Tailscale (ссылка) на вкладку DNS, выбираем DNS от CloudflareGoogle или Quad9. Я лично - используй свой proxy-dns, можно и adguard home. И ниже активируем HTTPS Certificates.

5. Настройка Файрвола (UFW)

Зачем: Мы разрешим SSH только из VPN. Весь мир видит только сайт.

sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow in on tailscale0 to any port 10000 #наш новый SSH порт
sudo ufw allow in on tailscale0 to any port 8888 #если используем fastpanel
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

⚠️ Важно: Теперь подключиться по SSH можно только используя IP Tailscale (100.x…). Публичный IP по порту 22 отвечать не будет.

6. Активная оборона (Fail2Ban)

Зачем: SSH у нас скрыт, поэтому Fail2Ban мы натравим на веб-сканеров, которые ищут дыры в сайте (wp-login, .git, env).

Установка: sudo apt install fail2ban

Защитим сервер от взлома через брутфорс и уменьшим нагрузку на сервер от ботов:

sudo apt install fail2ban -y && sudo apt install ufw -y && sudo apt install nano -y
sudo touch /etc/fail2ban/jail.local && sudo nano /etc/fail2ban/jail.local

Откроется редактор, вставим в него код:

[sshd]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
findtime = 600
maxretry = 3
bantime = 43200

[nginx-404-scans]

enabled = true port = http,https filter = nginx-404-scans logpath = /var/log/nginx/access.log

Нажимаем ctlr + x, далее Y и enter, чтобы сохранить.

7. Фильтр для Nginx

Зачем: Создаем sudo nano /etc/fail2ban/filter.d/nginx-404-scans.conf:

[Definition]
failregex = ^<HOST> -.*"(GET|HEAD|POST) .*(/(\.env|\.git|wp-admin|wp-login\.php|xmlrpc\.php|phpinfo\.php)).*" (404|403)
ignoreregex =

Перезапуск

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

8. SSH Hardening

Зачем: Дефолтные настройки SSH слишком дырявые, меняем их.

Редактируем sudo nano /etc/ssh/sshd_config:

# меняем порт
port 17753
# Запрещаем root полностью
PermitRootLogin no
# Белый список (войти может ТОЛЬКО этот юзер)
AllowUsers bert #добавьте

# Запрещаем пароли (только ключи!)
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes

# Отключаем лишнее для скорости и безопасности
X11Forwarding no
UseDNS no

# Максимум 3 попытки ввода ключа
MaxAuthTries 3

Внимание! Вы можете потерять доступ к серверу, если пропустите AllowUsers и port

Проверяем и перезагружаем:

sudo sshd -t
sudo systemctl restart ssh
sudo ufw enable

Также проверьте папку /etc/ssh/sshd_config.d/ на наличие файлов типа 50-cloud-init.conf, которые могут перекрывать настройки (PasswordAuthentication yes). Если есть — удалите или исправьте.

Если у нас последние билды OS, например Ubuntu 24 то там не так просто отключить вход по паролю Проверим вход по паролю:

ls /etc/ssh/sshd_config.d/ cat /etc/ssh/sshd_config.d/*.conf

У меня например, вход по паролю остался включен в 50-cloud-init.conf:
PasswordAuthentication yes

Исправим:
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf

Заменим PasswordAuthentication yes на no

9. Защита приложений (Nginx & Next.js)

Это действенно, если у вас установлен на сервере Nginx

Зачем: Скрываем версии ПО, чтобы хакер не мог подобрать эксплойт под конкретную версию, и защищаем пользователей от XSS.

Nginx Hardening

В /etc/nginx/nginx.conf:

Nginx

http {
    ...
    server_tokens off; # Не светить версию Nginx
    ...
}

В конфиге сайта (блок server):

Nginx

# Security Headers
add_header X-Frame-Options "SAMEORIGIN";       # Защита от Clickjacking
add_header X-Content-Type-Options "nosniff";   # Защита от подмены MIME-типов
add_header X-XSS-Protection "1; mode=block";   # Базовая защита от XSS

Next.js

  1. Никогда не запускайте Node.js от root! Используйте PM2, запущенный от пользователя kendo.

  2. Файл .env должен иметь права 600 (чтение только владельцем).

10. Как использовать и входить?

SSH - используйте новый IP для входа, он есть в найти можно в консоле Tailscale

В Windows, на иконке Tailscale правой клавишей мыши, в появшемся списке выбрать Exit node и выбрать машину через которую будет идти весь трафик (подсказка, название нашего сервера).

В Android, справа вв��рху нажать три точки, далее Use exit node и выбрать машину через которую будет идти весь трафик.

11. Итак, что мы натворили?

  1. Вход: Только по SSH-ключу и только через mesh-сеть (Tailscale). Публичный порт 22 закрыт.

  2. Пользователь: Root отключен, работаем под bert.

  3. Web: Nginx не отдает версию и имеет защитные заголовки. Боты, сканирующие админки, улетают в бан (Fail2Ban).

  4. Firewall: фаервол закрыл все порты, кроме нужных нам.

  5. Fail2ban: ботов ожидает fail

  6. Система: Автоматически ставит критические патчи.

  7. Побочно мы еще и получили VPN, благодаря тому что такое Mesh-сеть

Теперь ваш сервер — не потенциальная дыра в безопасности, а защищённый источник deploy.

Дополнение, чтобы выходить в интернет как VPN:

Согласно документации Tailscale, для реализации вашей задачи нужно выполнить настройку в два этапа: сначала подготовить сервер Ubuntu (чтобы он мог маршрутизировать трафик), а затем включить использование этого узла на клиенте Windows.

Вот пошаговая инструкция для вашего случая:

Шаг 1: Настройка сервера (Ubuntu 24)

По умолчанию Linux не пересылает интернет-трафик других устройств. Вам нужно включить IP-forwarding и объявить сервер как «Exit Node» (выходной узел).

  1. Включите пересылку IP-пакетов.Выполните следующие команды в терминале вашего сервера, чтобы разрешить маршрутизацию трафика (для IPv4 и IPv6):

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
  1. Запустите Tailscale с объявлением Exit Node.

Если Tailscale уже запущен, эта команда просто обновит его конфигурацию:

sudo tailscale up --advertise-exit-node

Шаг 2: Активация маршрутов в панели управления

Даже после ввода команды на сервере, из соображений безопасности Tailscale требует явного подтверждения в веб-консоли.

  1. Перейдите в админ-панель Tailscale.

  2. Найдите ваш сервер Ubuntu 24 в списке устройств.

  3. Нажмите на меню «три точки» справа от названия сервера и выберите Edit route settings (Изменить настройки маршрутизации).

  4. В разделе Exit Node поставьте галочку напротив пункта Use as exit node.

Шаг 3: Подключение с Windows 11

Теперь, когда сервер готов, настройте ноутбук для использования этого сервера в качестве шлюза в интернет.

  1. Убедитесь, что Tailscale установлен и запущен на Windows 11, и вы вошли в тот же аккаунт.

  2. Нажмите правой кнопкой мыши на значок Tailscale в системном трее (возле часов, возможно, скрыт под стрелочкой ^).

  3. Наведите курсор на пункт Exit Node (Выходной узел).

  4. В списке выберите ваш сервер Ubuntu 24

  5. После этого весь ваш интернет-трафик будет проходить через сервер в Ubuntu. Вы можете проверить это, зайдя на любой сайт проверки IP (например, 2ip.ru или whatismyip.com) — там должен отображаться IP-адрес вашего сервера, а не домашнего провайдера.

Комментарии (12)


  1. ki11j0y
    30.01.2026 12:12

    Ну Tailscale он же wg, не особо то работает сейчас, и держать wg на сервере вне страны больше шансов на банан. Внутри страны допустимо. TLS туннель с mTLS лучше справиться с защитой ssh и главное меньше следов VPN, меньше триггеров для тспу. Дополнительный слой безопасности это геофильтр, если это ваш личный сервис либо проект для определённых регионов, ну так обрубите им доступ, хотите на tcp уровне просто reject или на http с deny с указанием причины, единственное нагрузка тут выше, зачем пускать весть трафик через wg не понятно (с.м. выше). Автообновление весьма рискованно, даже безопасности, может случится конфуз, за этим лучше следить регулярно самому, проще докер, но есть потери производительности все таки. Для удобства можно использовать cockpit за mTLS безопасно и удобно.


    1. ingeniare Автор
      30.01.2026 12:12

      Исходя из личного опыта, у меня не было проблем с обрывами связи на Tailscale. До этого был миксер из Hiddify, там почти все заблочено. WG и прокси тем более. Вероятно что Mesh не блочат пока что, потому что часть инфраструктуры на нем замешана и плюс для платных VPN сервисов не совсем подходит.


  1. Black_Spirit
    30.01.2026 12:12

    Если вы находитесь в РФ, то использовать публичные DNS типа cloudflare это остаться однажды без DNS. То же самое использовать WireGuard под Tailscale это прямой путь потерять связь с сервером. И ботов под fail2ban которые будут хотя бы 3 раза в 10 минут стучаться, я тоже давно не видел. Для ssh вполне хватает сменить порт и авторизоваться по ключу. На конкретный диапазон IP разрешить подключение, если есть такая возможность.


    1. ingeniare Автор
      30.01.2026 12:12

      Странно, у меня боты прям ДДОсят сервер в РФ, в других странах такой жути нету. И тут не совсем WireGuard под Tailscale, последний работает на протоколе WG связываю сервера в Mesh-сеть.


      1. Black_Spirit
        30.01.2026 12:12

        Тоже сервер в РФ с ip из пула для организаций. Ssh с fail2ban только если поставить 2 подбора в 4 часа кого нибудь да поймает. Больше ИИ боты достают, когда на сайт налетают сканировать. У нас около 1.5 млн страниц


    1. Taywox
      30.01.2026 12:12

      Полностью согласен про смену порта и авторизацию по ключу!


  1. Ryav
    30.01.2026 12:12

    В tailscale разрешили 10000 порт, а в конфиге ssh указали 17753. Как это будет работать?

    Кроме того, tailscale периодически просит перелогиниться на машине, и в этом случае ваш сервер тупо выйдет из сети и достучаться до него вы не сможете. Чтобы это исключить, нужно отключить key expiry для конкретной машины (в вашем случае сервера).


  1. CatBegomot2
    30.01.2026 12:12

    Crowdsec обделили вниманием


    1. ingeniare Автор
      30.01.2026 12:12

      Интересно, спасибо за подсказку. Я пробовал SafeLine но это оказалось сильно гемморойно, вместо разработки я начал заниматься одним обслуживанием WAF, поэтому мне не зашло. Да нагрузка будет от ботов, но критичные дыры закрыты.


  1. andy2000
    30.01.2026 12:12

    Не очень понимаю смысла Tailscale, а ещё больше не понимаю совета юзать PM2. В вашей версии сервака systemd, что-ли вырезали? Нафига оно надо для одного сервиса? fail2bun тоже сомнительная история. Не лучше crowdsec или просто iptables?


  1. kiff2007200
    30.01.2026 12:12

    В таких инструкциях, коих уже миллионы на хабре и все под копирку, всегда поражало одно. Окей сделали вход по ssh-ключу, дабы никто не мог к нам подключиться и взломать перебором.

    Далее прячем сервер под ВПН и теперь никто уже извне не видит данный сервер. Смысл предыдущей защиты теряется.


  1. Orexon
    30.01.2026 12:12

    Люди, в контексте сказанного, что лучше установить на российский VPS для домашней сети Headscale или ZeroTier?