Тотальная защита сервера на Mesh и VPN

Атаки на сервера в России очень сильно изменились за последние 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
[!NOTE]
Внимание! Вы можете потерять доступ к серверу, если пропустите 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-адрес вашего сервера, а не домашнего провайдера.

Если статья оказалось полезной — поддержите автора блога, через покупку услуг в одном из самых полезных AI-чатов — vega.chat
Мы получим деньги на развитие, благодаря отличной реферальной программе, а вы — один из действительно хороших сервисов AI — без подписок и с полной защитой ваших данных. Спасибо!

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Политика обработки персональных данных