Только что купленный 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

Общий план

VPS初始化流程

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

3. Пошаговая настройка

3.1 Первый вход и обновление системы

Узнаем IP сервера

После покупки VPS провайдер выдаст тебе:

  • IP-адрес: например, 192.168.1.100
  • Порт: как правило, 22 (некоторые хостинги меняют его на другой)
  • Имя пользователя: обычно root
  • Пароль: сгенерированная случайная строка символов

VPS 服务商后台的登录信息页面

Подключение по SSH

Пользователи Mac / Linux: откройте терминал и просто введите:

1
2
ssh root@你的服务器IP
# 例如:ssh [email protected]

Пользователи Windows:

  • В Windows 10/11 уже встроен OpenSSH, так что эту же команду можно выполнить прямо в PowerShell или CMD
  • Либо используйте инструменты вроде Termius или MobaXterm

При первом подключении появится запрос на подтверждение отпечатка ключа:

1
2
3
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

По сути система спрашивает: «Я эту машину не знаю, ты точно хочешь подключиться?»

Введите yes и нажмите Enter. Затем введите пароль (обратите внимание: при вводе символы не отображаются — это штатная фича безопасности) и снова жмите Enter.

首次 SSH 连接的完整过程,包含指纹确认

Если видите примерно такое сообщение, значит, вы успешно залогинились:

1
2
3
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64)
...
root@hostname:~#

💡 Зачем вообще проверять отпечаток?

Это защита от атаки «человек посередине» (MITM). При первом подключении мы сохраняем отпечаток сервера. Если при следующем входе он вдруг изменился — это звоночек, что кто-то может притворяться вашим сервером.

登录成功了

Знакомимся с вашим сервером

Залогинились? Отлично, теперь давай осмотримся — посмотрим, что это вообще за машина:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看 CPU 核心数和型号
nproc
lscpu | grep "Model name"

# 查看内存
free -h

# 查看磁盘
df -h

服务器基本信息输出

Запомни эти данные, они очень пригодятся, если потом придётся что-то дебажить.

Обновление системы

Осмотр закончили, теперь к главному делу — обновляем систему. Образ на свежем сервере может быть несколько месяцев назад, а за это время уже могли выйти новые патчи безопасности:

1
2
# 更新软件包列表 + 升级所有软件 + 清理
apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean

Что значат эти параметры:

  • apt update: обновляет индекс пакетов
  • apt full-upgrade: обновляет вообще всё ПО, включая ядро
  • -y: соглашается на всё автоматически, чтобы не вбивать yes вручную
  • apt autoremove: сносит зависимости, которые больше не нужны
  • apt autoclean: чистит кэш скачанных установщиков

apt update 和 apt upgrade 执行过程

⏱️ Этот шаг может занять пару минут — зависит от объёма обновлений. Если по ходу дела улица попросит подтверждения, просто соглашайся.

Проверяем, нужен ли ребут

После обновления ядра обычно требуется перезагрузка, чтобы изменения вступили в силу:

1
2
# 检查是否需要重启
cat /var/run/reboot-required 2>/dev/null && echo ">>> 需要重启" || echo ">>> 无需重启"

是否需要重启

Если намекают, что пора перезагружаться:

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 Красиво выводит инфу о системе
neofetch 显示的系统信息

3.2 Создаем пользователя без прав root

Почему не стоит работать под root?

У root прав слишком много — один неловкий rm -rf /, и всего коту под хвост. Для рутины лучше использовать обычного пользователя, а права администратора подключать через sudo только когда они реально нужны.

Лобстер (openclaw) — же настоящий монстр, как можно дать ему права root?

Создаем пользователя

1
2
# 创建用户(把 ittinker 换成你想要的用户名)
adduser ittinker

Система попросит задать пароль и заполнить еще пару полей:

1
2
3
4
5
6
7
8
New password:              # 输入密码(不会显示)
Retype new password: # 再输入一次
Full Name []: # 可以直接回车跳过
Room Number []: # 回车跳过
Work Phone []: # 回车跳过
Home Phone []: # 回车跳过
Other []: # 回车跳过
Is the information correct? [Y/n] # 输入 Y 确认

adduser 创建用户的完整交互过程

Даем права sudo

1
2
# 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户
usermod -aG sudo ittinker

Проверяем, всё ли сработало:

1
2
3
4
5
# 切换到新用户 ittinker 换成你自己上面创建的那个用户
su - ittinker

# 测试 sudo 是否生效
sudo whoami

Если в выводе есть root, значит sudo настроен успешно.
测试sudo

💡 Маленький лайфхак

Введите exit, чтобы вернуться под root. Дальше мы продолжим настройку под root, а когда закончим — переключимся обратно на обычного пользователя.


3.3 Настраиваем вход по SSH-ключу

Ключи против паролей

SSH密钥认证原理

Вход по ключу куда безопаснее паролей:

  • Пароль можно сбрутфорсить, ключ — практически нереально
  • Не нужно каждый раз вводить пароль — сплошное удобство
  • Даже если пароль сольет в сеть, без приватного ключа на сервер все равно не зайти

Шаг 1: Генерируем пару ключей локально

Запускаем на своём компе (не на сервере!):

1
2
# 生成 ED25519 密钥(推荐,更安全更快)
ssh-keygen -t ed25519 -C "[email protected]"

Скрипт спросит:

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 密钥的过程

Когда всё сгенерируется, в папке ~/.ssh/ появятся два файла (ниже указаны стандартные имена, если вы всё жали Enter):

  • id_ed25519: приватный ключ, ни в коем случае не светите его нигде!
  • id_ed25519.pub: публичный ключ, его нужно закинуть на сервер

💡 ed25519 против RSA

ed25519 — это рекомендуемый алгоритм на сегодня: он надёжнее классического RSA, а ключи получаются короче. Если ваша система совсем древняя и его не поддерживает, используйте ssh-keygen -t rsa -b 4096.

Забавная деталь: ключ ed25519 получается довольно компактным, а вот файлы RSA здоровенные. Я сам узнал у ИИ — размер тут ни при чём, всё зависит от алгоритма.

Шаг 2: Загружаем публичный ключ на сервер

Способ А: через ssh-copy-id (рекомендую)

1
2
# 在你的电脑上执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@你的服务器IP

Вводите пароль, и публичный ключ сам скопируется на сервер.

ssh-copy-id 执行成功

Способ Б: копируем вручную

Если ssh-copy-id не сработал, можно всё сделать руками:

1
2
# 1. 在你的电脑上,查看公钥内容
cat ~/.ssh/id_ed25519.pub

Скопируй вывод (это длинная строка, которая начинается с ssh-ed25519).

1
2
3
4
5
6
7
8
9
10
11
# 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名
mkdir -p /home/ittinker/.ssh
chmod 700 /home/ittinker/.ssh

# 3. 创建 authorized_keys 文件并粘贴公钥
vim /home/ittinker/.ssh/authorized_keys
# 按 i 进入编辑模式,粘贴公钥,按 Esc,输入 :wq 保存退出

# 4. 设置正确的权限
chmod 600 /home/ittinker/.ssh/authorized_keys
chown -R ittinker:ittinker /home/ittinker/.ssh

⚠️ Права доступа — это важно!

SSH строго следит за правами на файлы:

  • каталог .ssh: 700 (доступ только у самого пользователя)
  • файл authorized_keys: 600 (чтение и запись только у самого пользователя)

Если права неправильные, SSH просто откажется пускать тебя по ключу.

Шаг 3: Проверяем вход по ключу

Открой новое окно терминала (старое не закрывай — если накосячишь с настройками, будет шанс всё исправить) и проверь вход по ключу:

1
ssh ittinker@你的服务器IP

Если пускает без пароля — значит, ключ настроен правильно! 🎉

(Если ты задал passphrase для приватного ключа, попросит ввести пароль от самого ключа — это нормально)
使用密钥成功登录(无需服务器密码)

Тут мы добавили параметр -i, потому что наш ключ лежит не по стандартному пути, а в текущей папке. Если не указать его явно, система будет искать ключ по умолчанию.


3.4 Усиляем безопасность SSH

Вход по ключу уже работает, давай теперь закрепим результат и настроим SSH посерьёзнее:

  1. Меняем порт по умолчанию (чтобы не ловить сканеры)
  2. Отключаем вход по паролю
  3. Запрещаем прямой вход для root

Редактируем конфиг SSH

1
2
3
4
5
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑配置
nano /etc/ssh/sshd_config

修改前

Находим и меняем следующие настройки (некоторые могут быть закомментированы — просто убери # в начале строки):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 修改端口(选一个 1024-65535 之间的数字)
Port 22000

# 禁止 root 登录
PermitRootLogin no

# 允许密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁止密码登录(确保密钥登录测试成功后再改!)
PasswordAuthentication no

# 使用更安全的 SSH2 协议
Protocol 2

# 最大认证尝试次数
MaxAuthTries 3

# 客户端超时设置
ClientAliveInterval 300
ClientAliveCountMax 2

修改后的 sshd_config 关键配置

Сохраняемся и выходим (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防火墙规则

UFW (Uncomplicated Firewall) — это стандартный файрвол в Ubuntu. Настраивать его просто, а работает он на ура.

Базовая настройка

1
2
3
4
5
6
7
8
9
10
11
# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH(使用你设置的端口)
ufw allow 22000/tcp comment 'SSH'
ufw allow 22/tcp comment 'SSH' # 如果是轻量服务器,还是开22端口

# 允许 HTTP 和 HTTPS
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

Включаем файрвол

1
ufw enable

Выскочит предупреждение:

1
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

Вводи y для подтверждения.

Проверяем статус

1
ufw status verbose

ufw status 的输出结果

23022 — это я накосячил, просто ставьте под себя, и всё получится

Вывод будет примерно таким:

1
2
3
4
5
6
7
8
9
10
11
12
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To Action From
-- ------ ----
22000/tcp (SSH) ALLOW IN Anywhere
80/tcp (HTTP) ALLOW IN Anywhere
443/tcp (HTTPS) ALLOW IN Anywhere
22000/tcp (SSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (HTTP (v6)) ALLOW IN Anywhere (v6)
443/tcp (HTTPS (v6)) ALLOW IN Anywhere (v6)

Шпаргалка по частым командам

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看状态
ufw status

# 添加规则
ufw allow 8080/tcp

# 删除规则
ufw delete allow 8080/tcp

# 允许特定 IP 访问所有端口
ufw allow from 192.168.1.100

# 禁用防火墙(不推荐)
ufw disable

# 重置所有规则
ufw reset

3.6 Включаем ускорение BBR

BBR (Bottleneck Bandwidth and Round-trip propagation time) — это алгоритм контроля перегрузки TCP от Google, который ощутимо прокачивает сетевую производительность.

Включаем в одно действие

1
2
3
4
5
6
# 添加 BBR 配置
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

# 使配置生效
sysctl -p

Проверяем, что всё завелось

1
2
# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

Вывод должен быть таким:

1
net.ipv4.tcp_congestion_control = bbr
1
2
# 确认 BBR 模块已加载
lsmod | grep bbr

Вывод будет примерно таким:

1
tcp_bbr    20480  3

💡 Что даёт BBR

После включения BBR, особенно при нестабильной сети или высоком пинге, вы прямо на себе почувствуете:

  • Скорость загрузки выше
  • SSH-сессия работает плавнее
  • Страницы открываются быстрее

bbr 开启


3.7 Настраиваем fail2ban для защиты от брутфорса

fail2ban мониторит логи и автоматически банит IP, с которых сыпятся неудачные попытки входа.

Базовая настройка

1
2
3
4
5
# 复制默认配置(不要直接修改 jail.conf)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
vim /etc/fail2ban/jail.local

Находим секцию [sshd] и проверяем, чтобы там было следующее:

1
2
3
4
5
6
7
8
[sshd]
enabled = true
port = 22000 # 改成你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 最大尝试次数
bantime = 3600 # 封禁时间(秒),这里是 1 小时
findtime = 600 # 在这个时间窗口内

fail2ban

Запуск службы

1
2
3
4
5
# 重启 fail2ban
systemctl restart fail2ban

# 设置开机自启
systemctl enable fail2ban

Проверка статуса

1
2
3
4
5
# 查看 fail2ban 状态
fail2ban-client status

# 查看 SSH 监控状态
fail2ban-client status sshd

fail2ban-client status sshd 的输出

Вывод будет примерно таким:

1
2
3
4
5
6
7
8
9
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

Часто используемые команды

1
2
3
4
5
6
7
8
# 手动封禁 IP
fail2ban-client set sshd banip 1.2.3.4

# 手动解封 IP
fail2ban-client set sshd unbanip 1.2.3.4

# 查看被封禁的 IP
fail2ban-client status sshd

3.8 [Опционально] Управление несколькими серверами через SSH Config

Если у вас несколько серверов, каждый раз вводить ssh -p 22000 user@ip — та еще морока. Используйте SSH Config, чтобы всё упростить.

Файл конфигурации

Отредактируйте ~/.ssh/config на вашем локальном компьютере:

1
vim ~/.ssh/config

Добавьте конфигурацию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 第一台服务器
Host vps1
HostName 192.168.1.100
User yourname
Port 22000
IdentityFile ~/.ssh/id_ed25519

# 第二台服务器
Host vps2
HostName 192.168.1.101
User admin
Port 22222
IdentityFile ~/.ssh/id_ed25519

# 通用设置(应用于所有连接)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes

Как использовать

Теперь можно подключаться напрямую через алиас:

1
2
3
4
5
# 连接第一台服务器
ssh vps1

# 连接第二台服务器
ssh vps2

Больше не нужно держать в голове IP-адреса, порты и имена пользователей!


3.9 [Опционально] Доступ только для Cloudflare

Если ваш сайт полностью находится за Cloudflare, можно разрешить доступ к портам 80/443 только для IP-адресов Cloudflare — так вы добавите сайту безопасности.

⚠️ Внимание: для этой настройки ваш домен уже должен быть подключен к Cloudflare CDN.

Скрипт автоматической настройки

1
2
3
4
5
6
7
8
# 下载脚本
wget -O ~/.cloudflare-ufw.sh https://gist.githubusercontent.com/Xm798/12560579ce11f62027ea8da1fae37456/raw/b07ac8cfe09badf02fc70e2d8bc2da68cabbda50/cloudflare-ufw.sh

# 添加执行权限
chmod +x ~/.cloudflare-ufw.sh

# 执行脚本
~/.cloudflare-ufw.sh

Этот скрипт сделает следующее:

  1. Берём свежие диапазоны IP прямо от Cloudflare
  2. Добавляем правила в UFW, чтобы пускать на 80/443 только эти IP
  3. Перезагружаем UFW

Настраиваем автообновление по расписанию

Диапазоны IP у Cloudflare могут меняться, поэтому настроим еженедельное обновление автоматически:

1
2
# 添加 cron 任务(每周一凌晨执行)
(crontab -l 2>/dev/null; echo "0 0 * * 1 /root/.cloudflare-ufw.sh > /dev/null 2>&1") | crontab -

3.10 Настройка часового пояса

По умолчанию там обычно UTC — поменяем на свой, чтобы логи было удобнее читать:

1
2
3
4
5
6
7
8
# 查看当前时区
timedatectl

# 设置为上海时区(中国用户)
sudo timedatectl set-timezone Asia/Shanghai

# 验证
date

设置时区


3.11 [Опционально] Автоматические обновления безопасности

Пусть система сама ставит патчи безопасности, чтобы не делать всё руками каждый раз:

1
2
3
4
5
# 安装自动更新工具
sudo apt install -y unattended-upgrades

# 配置
sudo dpkg-reconfigure --priority=low unattended-upgrades

Выбираем «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
2
3
4
/etc/ssh/sshd_config        # SSH 服务端配置
~/.ssh/authorized_keys # 允许登录的公钥
~/.ssh/config # 本地 SSH 客户端配置(在你电脑上)
/etc/fail2ban/jail.local # fail2ban 配置

Лучшие практики безопасности

  1. Регулярно обновляйте систему: apt update && apt upgrade
  2. Регулярно проверяйте логи входа: lastb (неудачные входы), last (успешные входы)
  3. Следите за банами в fail2ban
  4. Делайте бэкап перед изменением важных конфигов

5. Журнал проблем

Q1: Вход по ключу не работает, всё равно просит пароль?

Возможные причины:

  1. Проблема с правами доступа (самая частая)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. Публичный ключ скопирован некорректно

    1
    2
    3
    # 检查 authorized_keys 内容
    cat ~/.ssh/authorized_keys
    # 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头
  3. Вмешательство SELinux (в системах CentOS/RHEL)

    1
    restorecon -Rv ~/.ssh

Q2: После смены порта не можете подключиться?

Шаги для траблшутинга:

  1. Убедитесь, что новый порт открыт в файрволе:

    1
    ufw status | grep 你的端口
  2. Проверьте, что конфиг SSH настроен верно:

    1
    grep Port /etc/ssh/sshd_config
  3. Убедитесь, что служба SSH запущена:

    1
    systemctl status sshd
  4. Если подключиться вообще не выходит, зайдите через VNC/консоль провайдера и всё почините.

Q2.5: Смена порта вообще не сработала? (Для легких облачных серверов)

Симптом: изменили /etc/ssh/sshd_config, перезапустили службу, а 22-й порт всё ещё слушается, а новый не заработал.

Как диагностировать:

bash

1
2
# 查看是谁在监听 22 端口
netstat -lntp | grep :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
2
3
4
5
# 用 VNC 登录后解封
fail2ban-client set sshd unbanip 你的IP

# 把你的 IP 加入白名单,编辑 jail.local
ignoreip = 127.0.0.1/8 ::1 你的IP

Q4: После включения UFW сайт перестал открываться?

1
2
3
4
5
6
# 检查 80/443 是否开放
ufw status

# 如果没有,添加规则
ufw allow 80/tcp
ufw allow 443/tcp

Q5: При запуске команд пишет, что sudo не найден?

В минимальной установке Debian sudo может отсутствовать. Установите его из-под root:

1
2
apt install sudo
usermod -aG sudo ittinker

6. Скрипт одной командой (для тех, кто уже во всём разобрался)

Если вы уже освоились с шагами выше, можете использовать этот скрипт для быстрой инициализации.

⚠️ Важно: перед тем как запускать скрипт, убедись, что у тебя уже наготове SSH-ключ (публичный).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# VPS 初始化脚本
# 使用方法:以 root 身份运行

set -e

# === 配置区域(根据你的需求修改)===
NEW_USER="ittinker" # 新用户名
NEW_SSH_PORT="22000" # 新 SSH 端口
TIMEZONE="Asia/Shanghai" # 时区
# =====================================

echo "=== VPS 初始化脚本 ==="
echo ""

# 1. 更新系统
echo "[1/8] 更新系统..."
apt update && apt upgrade -y

# 2. 安装基础工具
echo "[2/8] 安装基础工具..."
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

# 3. 创建新用户
echo "[3/8] 创建用户 $NEW_USER..."
if id "$NEW_USER" &>/dev/null; then
echo "用户已存在,跳过创建"
else
adduser --gecos "" $NEW_USER
usermod -aG sudo $NEW_USER
fi

# 4. 配置 SSH 目录
echo "[4/8] 配置 SSH 目录..."
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
touch /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh

echo ""
echo ">>> 请将你的公钥粘贴到下面(粘贴后按 Ctrl+D 结束):"
cat >> /home/$NEW_USER/.ssh/authorized_keys
echo ""

# 5. 修改 SSH 配置
echo "[5/8] 修改 SSH 配置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*Port .*/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#*PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*PermitEmptyPasswords .*/PermitEmptyPasswords no/" /etc/ssh/sshd_config

# 6. 配置防火墙
echo "[6/8] 配置防火墙..."
ufw default deny incoming
ufw default allow outgoing
ufw allow $NEW_SSH_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable

# 7. 开启 BBR
echo "[7/8] 开启 BBR..."
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 8. 设置时区
echo "[8/8] 设置时区..."
timedatectl set-timezone $TIMEZONE

# 重启 SSH
systemctl restart sshd

echo ""
echo "=========================================="
echo " ✅ 初始化完成!"
echo "=========================================="
echo ""
echo " 新 SSH 端口: $NEW_SSH_PORT"
echo " 新用户: $NEW_USER"
echo " 时区: $TIMEZONE"
echo ""
echo " 请使用以下命令登录:"
echo " ssh -p $NEW_SSH_PORT $NEW_USER@$(curl -s ifconfig.me 2>/dev/null || echo '你的IP')"
echo ""
echo " ⚠️ 重要:请先测试新配置能否登录,再关闭当前终端!"
echo ""

7. Насколько реально выросла безопасность после всех этих шагов?

Шаг Что сделали Почему это важно
Обновление системы Поставили последние патчи Закрываем известные уязвимости
Создание нового юзера Перестали сидеть под root Снижаем риск случайных поломок
SSH-ключи Заменили пароль на ключи Взлом перебором больше не прокатит
Смена порта Ушли со стандартного 22-го Меньше шансов нарваться на сканеры
Отключение пароля Оставили вход только по ключу Полностью отсекаем атаки на пароли
Отключение root root больше не может логиниться напрямую Злоумышленникам сложнее пробиться
UFW (фаервол) Открыли только нужные порты Срезаем поверхность атаки до минимума
Ускорение BBR Оптимизировали сеть Сайт грузится быстрее
fail2ban Автоматически баним плохие IP Отбиваем постоянные атаки

После всего этого твой сервер по безопасности уже обгоняет 90% обычных VPS.


Что будет в следующей статье

В следующей части разберём шпаргалку по настройке входа по SSH-ключам и пройдёмся подробнее по таким темам:

  • Как генерировать ключи на разных ОС
  • Управление несколькими ключами
  • Настройка SSH Agent
  • Базовые настройки популярных SSH-клиентов

Статья последний раз обновлена: январь 2026 г.

Серия «Инструменты независимого разработчика» — подписывайся!