Щойно куплений VPS — це як незачинені двері: скрипт-кіди з усього світу вже стукають у них. Ця стаття покаже, як надійно замкнути ці двері, щоб твій openclaw не розбігався і не накоїв дурниць.

0. Вступне слово

Тільки-но купив VPS, радісно отримав IP-адресу та root-пароль, а далі що?

Більшість людей робить так: одразу починають ставити софт і розгортати проєкти.

Це дуже небезпечна звичка.

Твій VPS має публічну IP-адресу, а отже будь-хто у світі може спробувати до нього підключитися. І за замовчуванням:

  • відкритий порт 22
  • всім відомий юзернейм root
  • і лише один пароль захищає тебе

Щодня безліч автоматизованих скриптів сканують діапазони IP, намагаючись збрутити паролі по словниках. Твій сервер атакують ще з тієї самої миті, як він з’явився в мережі.

Тому перша справа після купівлі VPS — не ставити софт, а зробити базове налаштування безпеки.


1. Яка наша мета

Мета цієї статті:

  • ✅ Налаштуй безпечний віддалений доступ: вхід через SSH-ключі + нестандартний порт
  • ✅ Створи звичайного користувача: уникай прямого використання root
  • ✅ Налаштуй фаєрвол: відкривай лише необхідні порти
  • ✅ Увімкни прискорення мережі: BRR змусить мережу летіти
  • ✅ Захистись від брутфорсу: fail2ban автоматично блокуватиме зловмисні IP

Після цього твій VPS матиме міцний фундамент, і ти зможеш спокійно розгортати будь-які сервіси.


2. План та роздуми

Навіщо все це робити?

Щойно куплений VPS — це як квартира в будинку, яку щойно здали в експлуатацію без оздоблення:

Стандартний стан Ризик Наше рішення
Вхід прямо як root Забагато прав, ризик фатальної помилки Створюємо звичайного юзера + sudo
Вхід за паролем Можна збрутфорсити Вхід через SSH-ключ
Стандартний порт 22 Сканери лізнуть до нього першими Змінюємо на нестандартний порт
Фаєрвол вимкнено Усі порти торчать назовні UFW відкриває лише потрібне
Звичайна мережа Високі втрати пакетів, пінги Алгоритм контролю 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:~#

💡 Навіщо перевіряти відбиток?

Це захист від так званих атак «людина посередині» (Man-in-the-Middle). Коли ви підключаєтесь вперше, ви запам’ятовуєте відбиток сервера. Якщо під час наступних підключень він раптом зміниться — це червоний прапорець, хтось міг підмінити ваш сервер.

登录成功了

Знайомство з вашим сервером

Щойно зайшли, давай одразу розвідаемо обстановку і подивимось, що це за машина:

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 vs 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_config) просто не спрацює.

Рішення:

Тип інстансу Як змінити SSH-порт
Класичний VPS/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 року

Серія «Набір інструментів інді-розробника», стежте за оновленнями!