Первый час с VPS: полное руководство по настройке от голого сервера до безопасного и готового к работе (сделай свой OpenClaw безопаснее)
Только что купленный VPS — это как незапертая дверь, в которую стучат скрипт-кiddie со всего мира. Эта статья поможет тебе навесить надежный замок. Чтобы твой openclaw не бегал куда не надо и не шалил.
0. Вступление
Купил VPS, радостно получил IP-адрес и root-пароль, а что дальше?
Многие поступают так: сразу начинают ставить софт и деплоить проекты.
Это опасная привычка.
У твоего VPS есть публичный IP-адрес, а значит, любой человек в мире может попытаться к нему подключиться. И при стандартных настройках:
- открыт порт 22
- имя пользователя — всем известное root
- и тебя защищает только один-единственный пароль
Ежедневно бесчисленное множество автоматических ботов сканирует диапазоны IP-адресов и пытается брутфорсить их по словарям популярных паролей. Твой сервер начинает подвергаться атакам с той самой секунды, как появляется в сети.
Поэтому первое, что нужно сделать после покупки VPS, — не устанавливать софт, а провести базовую настройку безопасности.
1. Цель
Цель этой статьи:
- ✅ Настраиваем безопасный удалённый доступ: вход по SSH-ключу + нестандартный порт
- ✅ Создаём обычного пользователя: избегаем работы напрямую от root
- ✅ Настраиваем файрвол: открываем только нужные порты
- ✅ Включаем ускорение сети: BBR — и сеть летает
- ✅ Защищаемся от брутфорса: fail2ban сам банит вредительские IP
Как проделаете всё это, у вашего VPS появится прочная база, и можно со спокойной душой разворачивать любые сервисы.
2. План и размышления
Зачем вообще всё это настраивать?
Только что купленный VPS — это как квартира от застройщика без отделки:
| По умолчанию | Риск | Наше решение |
|---|---|---|
| Вход под root | Слишком широкие права, высокий риск случайных поломок | Создаем обычного юзера + sudo |
| Вход по паролю | Могут сбрутфорсить | Вход по SSH-ключу |
| Стандартный порт 22 | Первая цель для сканеров | Меняем на нестандартный порт |
| Файрвол выключен | Все порты торчат наружу | UFW: открываем только нужное |
| Родная сеть | Высокий loss, большие задержки | Алгоритм BBR |
Общий план

Действуем строго по этому порядку, и на каждом шаге я буду объяснять, зачем мы вообще так делаем.
3. Пошаговая настройка
3.1 Первый вход и обновление системы
Узнаем IP сервера
После покупки VPS провайдер выдаст тебе:
- IP-адрес: например,
192.168.1.100 - Порт: как правило,
22(некоторые хостинги меняют его на другой) - Имя пользователя: обычно
root - Пароль: сгенерированная случайная строка символов

Подключение по SSH
Пользователи Mac / Linux: откройте терминал и просто введите:
1 | ssh root@你的服务器IP |
Пользователи Windows:
- В Windows 10/11 уже встроен OpenSSH, так что эту же команду можно выполнить прямо в PowerShell или CMD
- Либо используйте инструменты вроде Termius или MobaXterm
При первом подключении появится запрос на подтверждение отпечатка ключа:
1 | The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established. |
По сути система спрашивает: «Я эту машину не знаю, ты точно хочешь подключиться?»
Введите yes и нажмите Enter. Затем введите пароль (обратите внимание: при вводе символы не отображаются — это штатная фича безопасности) и снова жмите Enter.

Если видите примерно такое сообщение, значит, вы успешно залогинились:
1 | Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64) |
💡 Зачем вообще проверять отпечаток?
Это защита от атаки «человек посередине» (MITM). При первом подключении мы сохраняем отпечаток сервера. Если при следующем входе он вдруг изменился — это звоночек, что кто-то может притворяться вашим сервером.

Знакомимся с вашим сервером
Залогинились? Отлично, теперь давай осмотримся — посмотрим, что это вообще за машина:
1 | # 查看系统版本 |

Запомни эти данные, они очень пригодятся, если потом придётся что-то дебажить.
Обновление системы
Осмотр закончили, теперь к главному делу — обновляем систему. Образ на свежем сервере может быть несколько месяцев назад, а за это время уже могли выйти новые патчи безопасности:
1 | # 更新软件包列表 + 升级所有软件 + 清理 |
Что значат эти параметры:
apt update: обновляет индекс пакетовapt full-upgrade: обновляет вообще всё ПО, включая ядро-y: соглашается на всё автоматически, чтобы не вбивать yes вручнуюapt autoremove: сносит зависимости, которые больше не нужныapt autoclean: чистит кэш скачанных установщиков

⏱️ Этот шаг может занять пару минут — зависит от объёма обновлений. Если по ходу дела улица попросит подтверждения, просто соглашайся.
Проверяем, нужен ли ребут
После обновления ядра обычно требуется перезагрузка, чтобы изменения вступили в силу:
1 | # 检查是否需要重启 |

Если намекают, что пора перезагружаться:
1 | reboot |
После ребута нужно будет заново подключиться по SSH.
Установка базовых утилит
1 | apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch |
Зачем вообще нужны эти инструменты:
| Инструмент | Назначение | |
|---|---|---|
sudo |
Позволяет обычным юзерам запускать команды от рута | |
curl / wget |
Скачивание файлов | |
git |
Контроль версий | |
vim |
Текстовый редактор | |
htop |
Более удобный монитор процессов | |
tree |
Дерево директорий | |
net-tools |
Сетевые утилиты (ifconfig, netstat и т.д.) | |
ufw |
Простой и понятный фаервол | |
fail2ban |
Защита от брутфорса | |
neofetch |
Красиво выводит инфу о системе | |
![]() |
3.2 Создаем пользователя без прав root
Почему не стоит работать под root?
У root прав слишком много — один неловкий rm -rf /, и всего коту под хвост. Для рутины лучше использовать обычного пользователя, а права администратора подключать через sudo только когда они реально нужны.
Лобстер (openclaw) — же настоящий монстр, как можно дать ему права root?
Создаем пользователя
1 | # 创建用户(把 ittinker 换成你想要的用户名) |
Система попросит задать пароль и заполнить еще пару полей:
1 | New password: # 输入密码(不会显示) |

Даем права sudo
1 | # 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户 |
Проверяем, всё ли сработало:
1 | # 切换到新用户 ittinker 换成你自己上面创建的那个用户 |
Если в выводе есть root, значит sudo настроен успешно.

💡 Маленький лайфхак
Введите
exit, чтобы вернуться под root. Дальше мы продолжим настройку под root, а когда закончим — переключимся обратно на обычного пользователя.
3.3 Настраиваем вход по SSH-ключу
Ключи против паролей

Вход по ключу куда безопаснее паролей:
- Пароль можно сбрутфорсить, ключ — практически нереально
- Не нужно каждый раз вводить пароль — сплошное удобство
- Даже если пароль сольет в сеть, без приватного ключа на сервер все равно не зайти
Шаг 1: Генерируем пару ключей локально
Запускаем на своём компе (не на сервере!):
1 | # 生成 ED25519 密钥(推荐,更安全更快) |
Скрипт спросит:
1 | Enter file in which to save the key (/Users/你/.ssh/id_ed25519): |
Просто жмём Enter, чтобы оставить путь по умолчанию. В примере выше я указал ./ittinker — это значит, что ключ сохранится в текущей папке под именем ittinker.
1 | Enter passphrase (empty for no passphrase): |
Тут можно задать пароль для ключа (дополнительная защита), а можно просто нажать Enter и оставить пустым.

Когда всё сгенерируется, в папке ~/.ssh/ появятся два файла (ниже указаны стандартные имена, если вы всё жали Enter):
id_ed25519: приватный ключ, ни в коем случае не светите его нигде!id_ed25519.pub: публичный ключ, его нужно закинуть на сервер
💡 ed25519 против RSA
ed25519— это рекомендуемый алгоритм на сегодня: он надёжнее классического RSA, а ключи получаются короче. Если ваша система совсем древняя и его не поддерживает, используйтеssh-keygen -t rsa -b 4096.
Забавная деталь: ключ ed25519 получается довольно компактным, а вот файлы RSA здоровенные. Я сам узнал у ИИ — размер тут ни при чём, всё зависит от алгоритма.
Шаг 2: Загружаем публичный ключ на сервер
Способ А: через ssh-copy-id (рекомендую)
1 | # 在你的电脑上执行 |
Вводите пароль, и публичный ключ сам скопируется на сервер.

Способ Б: копируем вручную
Если ssh-copy-id не сработал, можно всё сделать руками:
1 | # 1. 在你的电脑上,查看公钥内容 |
Скопируй вывод (это длинная строка, которая начинается с ssh-ed25519).
1 | # 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名 |
⚠️ Права доступа — это важно!
SSH строго следит за правами на файлы:
- каталог
.ssh: 700 (доступ только у самого пользователя)- файл
authorized_keys: 600 (чтение и запись только у самого пользователя)Если права неправильные, SSH просто откажется пускать тебя по ключу.
Шаг 3: Проверяем вход по ключу
Открой новое окно терминала (старое не закрывай — если накосячишь с настройками, будет шанс всё исправить) и проверь вход по ключу:
1 | ssh ittinker@你的服务器IP |
Если пускает без пароля — значит, ключ настроен правильно! 🎉
(Если ты задал passphrase для приватного ключа, попросит ввести пароль от самого ключа — это нормально)

Тут мы добавили параметр -i, потому что наш ключ лежит не по стандартному пути, а в текущей папке. Если не указать его явно, система будет искать ключ по умолчанию.
3.4 Усиляем безопасность SSH
Вход по ключу уже работает, давай теперь закрепим результат и настроим SSH посерьёзнее:
- Меняем порт по умолчанию (чтобы не ловить сканеры)
- Отключаем вход по паролю
- Запрещаем прямой вход для root
Редактируем конфиг SSH
1 | # 备份原配置 |

Находим и меняем следующие настройки (некоторые могут быть закомментированы — просто убери # в начале строки):
1 | # 修改端口(选一个 1024-65535 之间的数字) |

Сохраняемся и выходим (ctrl + o).
В Nano сохранение — это ctrl + o. Он спросит имя файла, просто жми Enter. А для выхода жми ctrl + x.
Перезапускаем службу SSH
1 | systemctl restart sshd.service |
⚠️ Важный момент!
Не закрывай текущий терминал! Сначала открой новое окно и проверь, нормально ли логинится с новыми настройками:
1 ssh -p 22000 yourname@你的服务器IPЕсли пустило — старое окно можно закрывать. Если зайти не вышло, всегда можно вернуться в старое окно и поправить конфиг.
Если ты взял легковесный сервер, скорее всего, этот порт там изменить не выйдет. А вот на классических ECS это можно сделать, так что имей в виду.
3.5 Настройка файрвола UFW

UFW (Uncomplicated Firewall) — это стандартный файрвол в Ubuntu. Настраивать его просто, а работает он на ура.
Базовая настройка
1 | # 设置默认策略:拒绝所有入站,允许所有出站 |
Включаем файрвол
1 | ufw enable |
Выскочит предупреждение:
1 | Command may disrupt existing ssh connections. Proceed with operation (y|n)? |
Вводи y для подтверждения.
Проверяем статус
1 | ufw status verbose |

23022 — это я накосячил, просто ставьте под себя, и всё получится
Вывод будет примерно таким:
1 | Status: active |
Шпаргалка по частым командам
1 | # 查看状态 |
3.6 Включаем ускорение BBR
BBR (Bottleneck Bandwidth and Round-trip propagation time) — это алгоритм контроля перегрузки TCP от Google, который ощутимо прокачивает сетевую производительность.
Включаем в одно действие
1 | # 添加 BBR 配置 |
Проверяем, что всё завелось
1 | # 查看当前拥塞控制算法 |
Вывод должен быть таким:
1 | net.ipv4.tcp_congestion_control = bbr |
1 | # 确认 BBR 模块已加载 |
Вывод будет примерно таким:
1 | tcp_bbr 20480 3 |
💡 Что даёт BBR
После включения BBR, особенно при нестабильной сети или высоком пинге, вы прямо на себе почувствуете:
- Скорость загрузки выше
- SSH-сессия работает плавнее
- Страницы открываются быстрее

3.7 Настраиваем fail2ban для защиты от брутфорса
fail2ban мониторит логи и автоматически банит IP, с которых сыпятся неудачные попытки входа.
Базовая настройка
1 | # 复制默认配置(不要直接修改 jail.conf) |
Находим секцию [sshd] и проверяем, чтобы там было следующее:
1 | [sshd] |

Запуск службы
1 | # 重启 fail2ban |
Проверка статуса
1 | # 查看 fail2ban 状态 |

Вывод будет примерно таким:
1 | Status for the jail: sshd |
Часто используемые команды
1 | # 手动封禁 IP |
3.8 [Опционально] Управление несколькими серверами через SSH Config
Если у вас несколько серверов, каждый раз вводить ssh -p 22000 user@ip — та еще морока. Используйте SSH Config, чтобы всё упростить.
Файл конфигурации
Отредактируйте ~/.ssh/config на вашем локальном компьютере:
1 | vim ~/.ssh/config |
Добавьте конфигурацию:
1 | # 第一台服务器 |
Как использовать
Теперь можно подключаться напрямую через алиас:
1 | # 连接第一台服务器 |
Больше не нужно держать в голове IP-адреса, порты и имена пользователей!
3.9 [Опционально] Доступ только для Cloudflare
Если ваш сайт полностью находится за Cloudflare, можно разрешить доступ к портам 80/443 только для IP-адресов Cloudflare — так вы добавите сайту безопасности.
⚠️ Внимание: для этой настройки ваш домен уже должен быть подключен к Cloudflare CDN.
Скрипт автоматической настройки
1 | # 下载脚本 |
Этот скрипт сделает следующее:
- Берём свежие диапазоны IP прямо от Cloudflare
- Добавляем правила в UFW, чтобы пускать на 80/443 только эти IP
- Перезагружаем UFW
Настраиваем автообновление по расписанию
Диапазоны IP у Cloudflare могут меняться, поэтому настроим еженедельное обновление автоматически:
1 | # 添加 cron 任务(每周一凌晨执行) |
3.10 Настройка часового пояса
По умолчанию там обычно UTC — поменяем на свой, чтобы логи было удобнее читать:
1 | # 查看当前时区 |

3.11 [Опционально] Автоматические обновления безопасности
Пусть система сама ставит патчи безопасности, чтобы не делать всё руками каждый раз:
1 | # 安装自动更新工具 |
Выбираем «Yes», чтобы включить автообновление.
💡 Эта штука ставит только обновления безопасности и не апгрейдит систему до новых мажорных версий, так что всё довольно безопасно.
4. Подводим итоги
Чеклист после инициализации
Когда всё настроите, прогонитесь по этому чеклисту:
| Что проверяем | Команда | Ожидаемый результат |
|---|---|---|
| Система обновлена | apt update && apt list --upgradable |
Нет пакетов для обновления |
| Обычный пользователь может sudo | sudo whoami |
Вывод root |
| Вход по ключу работает | ssh yourname@ip -p port |
Вход без пароля |
| Вход по паролю отключён | grep PasswordAuth /etc/ssh/sshd_config |
PasswordAuthentication no |
| SSH-порт изменён | grep Port /etc/ssh/sshd_config |
Ваш заданный порт |
| Файрвол включён | ufw status |
Status: active |
| BBR включён | sysctl net.ipv4.tcp_congestion_control |
= bbr |
| fail2ban работает | systemctl status fail2ban |
active (running) |
| Часовой пояс настроен | timedatectl |
Asia/Shanghai или ваш часовой пояс |
| Локальный SSH Config | cat ~/.ssh/config |
Алиас сервера настроен |
Расположение ключевых файлов
1 | /etc/ssh/sshd_config # SSH 服务端配置 |
Лучшие практики безопасности
- Регулярно обновляйте систему:
apt update && apt upgrade - Регулярно проверяйте логи входа:
lastb(неудачные входы),last(успешные входы) - Следите за банами в fail2ban
- Делайте бэкап перед изменением важных конфигов
5. Журнал проблем
Q1: Вход по ключу не работает, всё равно просит пароль?
Возможные причины:
-
Проблема с правами доступа (самая частая)
1
2
3# 检查并修复权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys -
Публичный ключ скопирован некорректно
1
2
3# 检查 authorized_keys 内容
cat ~/.ssh/authorized_keys
# 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头 -
Вмешательство SELinux (в системах CentOS/RHEL)
1
restorecon -Rv ~/.ssh
Q2: После смены порта не можете подключиться?
Шаги для траблшутинга:
-
Убедитесь, что новый порт открыт в файрволе:
1
ufw status | grep 你的端口
-
Проверьте, что конфиг SSH настроен верно:
1
grep Port /etc/ssh/sshd_config
-
Убедитесь, что служба SSH запущена:
1
systemctl status sshd
-
Если подключиться вообще не выходит, зайдите через VNC/консоль провайдера и всё почините.
Q2.5: Смена порта вообще не сработала? (Для легких облачных серверов)
Симптом: изменили /etc/ssh/sshd_config, перезапустили службу, а 22-й порт всё ещё слушается, а новый не заработал.
Как диагностировать:
bash
1 | # 查看是谁在监听 22 端口 |
Если вывод выглядит примерно так:
1 | tcp 0 0.0.0.0:22 0.0.0.0:* LISTEN 1/init |
значит, 22-й порт слушает init (PID 1), а не процесс sshd.
Причина: У некоторых облачных провайдеров SSH для «облегчённых серверов приложений» или «контейнерных инстансов» проксируется на уровне платформы, поэтому настройки sshd внутри самого сервера не работают.
Решение:
| Тип инстанса | Как изменить SSH-порт |
|---|---|
| Классический ECS | Редактируем sshd_config ✅ |
| Облегчённый сервер | Возможно, придётся менять в панели управления облаком, либо вообще не поддерживается |
| Контейнерный инстанс | Обычно изменение не поддерживается |
Если ваш инстанс не поддерживает смену порта, остальные меры безопасности выходят на первый план:
- ✅ Создаём обычного пользователя + отключаем вход для root
- ✅ Вход по SSH-ключу + отключаем вход по паролю
- ✅ fail2ban для защиты от брутфорса
Если всё это настроить как надо, безопасность всё равно будет на высоте.
Q3: fail2ban забанил меня самого?
1 | # 用 VNC 登录后解封 |
Q4: После включения UFW сайт перестал открываться?
1 | # 检查 80/443 是否开放 |
Q5: При запуске команд пишет, что sudo не найден?
В минимальной установке Debian sudo может отсутствовать. Установите его из-под root:
1 | apt install sudo |
6. Скрипт одной командой (для тех, кто уже во всём разобрался)
Если вы уже освоились с шагами выше, можете использовать этот скрипт для быстрой инициализации.
⚠️ Важно: перед тем как запускать скрипт, убедись, что у тебя уже наготове SSH-ключ (публичный).
1 |
|
7. Насколько реально выросла безопасность после всех этих шагов?
| Шаг | Что сделали | Почему это важно |
|---|---|---|
| Обновление системы | Поставили последние патчи | Закрываем известные уязвимости |
| Создание нового юзера | Перестали сидеть под root | Снижаем риск случайных поломок |
| SSH-ключи | Заменили пароль на ключи | Взлом перебором больше не прокатит |
| Смена порта | Ушли со стандартного 22-го | Меньше шансов нарваться на сканеры |
| Отключение пароля | Оставили вход только по ключу | Полностью отсекаем атаки на пароли |
| Отключение root | root больше не может логиниться напрямую | Злоумышленникам сложнее пробиться |
| UFW (фаервол) | Открыли только нужные порты | Срезаем поверхность атаки до минимума |
| Ускорение BBR | Оптимизировали сеть | Сайт грузится быстрее |
| fail2ban | Автоматически баним плохие IP | Отбиваем постоянные атаки |
После всего этого твой сервер по безопасности уже обгоняет 90% обычных VPS.
Что будет в следующей статье
В следующей части разберём шпаргалку по настройке входа по SSH-ключам и пройдёмся подробнее по таким темам:
- Как генерировать ключи на разных ОС
- Управление несколькими ключами
- Настройка SSH Agent
- Базовые настройки популярных SSH-клиентов
Статья последний раз обновлена: январь 2026 г.
Серия «Инструменты независимого разработчика» — подписывайся!




