Привет!
За годы работы и самообучения Linux'у у меня сформировалась шпаргалка с разными командами. Наконец-то дошли руки — и с помощью ИИ всё это упорядочено, обновлено и отформатировано. Полученный материал представляю вашему вниманию для всех, кто ещё не освоил 100% автоматизацию процесса, но постоянно покупает виртуальные сервера для своих нужд.
Что мы сделаем?
Подключимся по SSH.
Изменим hostname.
Обновим систему и установим ПО.
Настроим timezone.
Изменим порт SSH (опционально).
Настроим firewall (UFW).
Создадим sudo-пользователя.
Настроим SSH-ключи.
Отключим root-логин и заблокируем root.
Включим автоматические обновления.
Установим Fail2Ban.
(Опционально) Добавим nightly reboot и speedtest.
1. Подключение по SSH
VPS обычно доступны под root по SSH.
Из Windows (PowerShell), Linux и macOS команда одна и та же:
Putty не предлагать!
ssh root@YOUR_IP
2. Изменение hostname
Есть хостеры, которые даже не предлагают установить свой hostname, а вместо этого генерируют нечитаемую ерунду. Мне так не нравится, поэтому первым делом меняем hostname.
Установите новый hostname:
hostnamectl set-hostname new-hostname
Замените new-hostname на желаемое (например, my-perfect-vps-01).
Обновите /etc/hosts:
nano /etc/hosts
Измените строки, где есть старое имя сервера:
127.0.1.1 new-hostname
Чтобы настройки применились, нужно перезайти на хост или выполнить reboot. Пока просто проверьте: hostnamectl.
3. Обновление системы и установка утилит
Это святое! Всегда в первую очередь выполняем:
apt update && apt upgrade -y
Теперь устанавливаем всё, что может понадобиться. Простая команда (удалите лишнее и укажите нужное):
apt install curl wget git vim htop tmux unzip zip jq tree net-tools rsync lsof iotop iftop nethogs sysstat dstat glances btop ncdu duf nginx apache2 haproxy caddy certbot postgresql postgresql-contrib redis-server build-essential python3-pip python3-venv nodejs npm neofetch screenfetch ranger mc iptables-persistent wireguard openvpn nfs-common cifs-utils mosh docker.io
Или вот команда с выбором, чтобы не ставить лишнее:
packages_to_install=""; for pkg in curl wget git vim htop tmux unzip zip jq tree net-tools rsync lsof iotop iftop nethogs sysstat dstat glances btop ncdu duf nginx apache2 haproxy docker.io caddy certbot postgresql postgresql-contrib redis-server build-essential python3-pip python3-venv nodejs npm neofetch screenfetch ranger mc iptables-persistent wireguard openvpn nfs-common cifs-utils mosh; do read -p "Install $pkg? [y/n, default=n]: " yn; yn=${yn:-n}; case $yn in [Yy]*) packages_to_install="$packages_to_install $pkg" ;; esac; done; [ -n "$packages_to_install" ] && apt install -y $packages_to_install
Тут много программ — один раз составьте свой список фаворитов, потом просто от ситуации будете выбирать только из нужных программ.
Здесь есть docker.io, но в своих проектах я чаще использую самые свежие версии, поэтому обычно устанавливаю Docker официальным скриптом:
curl -fsSL https://get.docker.com | sh
Чтобы работать с Docker без sudo, добавьте пользователя в группу (делается после создания пользователя):
sudo usermod -aG docker $USER
После этого перезайдите по SSH.
4. Настройка timezone
timedatectl set-timezone Europe/Moscow
Замените на свою (список: timedatectl list-timezones).
Проверьте:
timedatectl
5. Изменение порта SSH (опционально, для hardening)
Поменяйте на порт >1024, чтобы снизить сканирование и попытки подбора пароля.
nano /etc/ssh/sshd_config
Найдите #Port 22, раскомментируйте и измените: Port 2222 (или свой).
Перезапустите:
systemctl restart ssh
Предупреждение: Откройте новое соединение на новом порту перед закрытием старого: ssh -p 2222 root@YOUR_IP.
6. Настройка firewall (UFW)
Установите (если не установлено):
apt install -y ufw
Разрешите порты:
ufw allow OpenSSH # Или ufw allow 2222/tcp для кастомного порта
ufw allow 80/tcp # HTTP, если нужно
ufw allow 443/tcp # HTTPS, если нужно
ufw default deny incoming
ufw default allow outgoing
ufw enable
Проверьте:
ufw status verbose
7. Создание sudo-пользователя
adduser yourusername
usermod -aG sudo yourusername
Проверьте (переключитесь):
su - yourusername
sudo whoami # Должен вывести 'root'
8. Настройка SSH-ключей
На клиенте (Windows/Linux/macOS):
# Рекомендуемый вариант в 2025 году
ssh-keygen -t ed25519 -C "your_email@example.com"
Скопируйте публичный ключ (весь вывод команды):
cat ~/.ssh/id_ed25519.pub
На сервере (под новым пользователем):
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys # Вставьте ключ
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
В /etc/ssh/sshd_config убедитесь, что есть:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Перезапустите:
sudo systemctl restart ssh
Критически важно: Откройте новое окно и убедитесь, что можете зайти по ключу под новым пользователем (с новым портом, если меняли). Только после этого переходите дальше!
9. Отключение root-логина и пароля
Предупреждение: Хостер потеряет root-доступ. Если хостер предоставляет прямой доступ к root (VNC-консоль и т.п.), он перестанет работать. Только rebuild при проблемах.
В /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
Установите:
PermitRootLogin no
PasswordAuthentication no
Перезапустите:
systemctl restart ssh
Заблокируйте root:
sudo passwd -l root # Блокировка пароля
sudo passwd -d root # Или вовсе удаляем пароль, теперь под root никто не пройдёт
Проверьте подключение по ключу ещё раз.
10. Автоматические обновления
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades # Выберите Yes
Настройте /etc/apt/apt.conf.d/50unattended-upgrades (раскомментируйте нужное):
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
"${distro_id}:${distro_codename}-updates"; // Опционально
};
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
Можно добавить уведомления на почту:
Unattended-Upgrade::Mail "your@email.com";
В /etc/apt/apt.conf.d/20auto-upgrades:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
11. Настройка Fail2Ban
sudo apt install -y fail2ban
Создайте /etc/fail2ban/jail.local:
sudo nano /etc/fail2ban/jail.local
Содержимое:
[DEFAULT]
banaction = ufw
bantime = 3600
findtime = 600
maxretry = 5
backend = systemd
ignoreip = 127.0.0.1/8 YOUR_IP # Добавьте свой домашний IP
[sshd]
enabled = true
port = ssh # Или ваш кастомный порт
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
Перезапустите:
systemctl restart fail2ban
Проверьте: sudo fail2ban-client status sshd или sudo ufw status.
12. Ночная перезагрузка (опционально)
Обычно сервера прекрасно работают без этого, но если какое-то ПО сбивается, можно добавить reboot в 3:00:
sudo crontab -e
Добавьте строку:
0 3 * * * /sbin/reboot
Проверьте: crontab -l.
Для теста: sudo /sbin/reboot.
13. Speedtest (для теста сети)
Знаю, что многим Speedtest не нравится, потому что он попсовый, но как по мне идеальный способ быстро оценить канал хостера. Всего 2 команды! А то бывает, что пишут гигабит, а там от силы 300 мбит\с.
apt install speedtest-cli
Запуск:
speedtest # Базовый тест
speedtest --servers # Список серверов
speedtest --server-id=1111 # По ID
Заключение
С помощью простых шагов мы получили базовый минимум солидного сервера, закрыли основные проблемы с безопасностью, настроили вход только по ключу и включили автообновления.
Это точно не финальная версия шпаргалки — я постоянно её дорабатываю. Если у вас есть комментарии, замечания, предложения или возражения, с радостью приму их в свою практику и обновлю текст.
Комментарии (40)

gliderman
15.12.2025 19:25Прямо с языка снято, делал все то же самое для ssh тоннеля, я записать памятку не догадался.

MountainGoat
15.12.2025 19:25Я бы добавил, что стоит порт SSH делать не 22 и не 2222, а любой другой. В эти два порта ботов иногда столько ломится, что даже просто игнорить их в йух отнимает заметный процент CPU на дешёвой VPSке.
И ещё вот: сервер
icanhazip.comвернёт вам плейнтекстом только IP с которого он вас видит. Например так➜ curl --proxy http://192.168.0.1:8888 icanhazip.com 123.45.67.89Полезно посмотреть, а то результат иногда изумляет.
Если вам нужен TCP forwarding и вы используете ufw, то forwarding включать надо именно средствами ufw. Иначе, он может обратно выключить. И не сейчас, а когда вы спать ляжете.
Если собрались что-то писать в crontab, проверьте, что реализация cron стоит и работает. Файл /etc/crontab в системе может и быть, а вот исполнять его из коробки уже не факт, что кто-то будет на всяких минимальных системах. И да, пользуйтесь systemD. Понимаю, что два файла вместо одной строчки писать лень - самому лень. Их LLM отлично генерирует.

alche
15.12.2025 19:25Я вот тоже несколько лет пользовался нестандартным портом для ssh, vps на М9 хостера с самым высоким рейтингом на Хабре. Но тут на днях попытался зайти, а не могу, тайм-аут. Написал в поддержку. Отвечают: мы не ограничиваем доступ. Подумал, что дело в ТСПУ, пробую подключиться с машины с российским IP - получается. Пришлось менять порт на стандартный, чтобы подключаться из других стран. И такая история не только с 22-м портом.

opusmode
15.12.2025 19:25Я бы добавил, что нет вообще никакого смысла менять порт ssh, так как это только немного поможет от школьников со скачанными ботами, а остальные уже давно сканят порты и слушают ответ и ломятся туда, а не на дефолт. Скан занимает секунды и происходит домтаточно регуоярно, так что объем это не снизит.
Да и нагрузки пробивы ботов особой не дают, так что куда важнее, что бы юзер был не root, а доступ был не парольный, а по ключу. Ну и не супер стандартное имя пользователя даст куда больше профита, чем смена порта.
Всё, остальное очень успешно рубится и режется в наше время. Подобрать связку имени и 4096 ключика почти нереально, а уж тем более связку имени и ключика на элептической кривой.
Остальное можно вернуть обратно в 2010 год, все эти смены портов и отключения эхо - абсолютно бесполезная паранойа

MountainGoat
15.12.2025 19:25ак как это только немного поможет от школьников со скачанными ботами,
Так их же большинство. Сменой одной циферки отключаем большую часть мусорной нагрузки, в чём проблема-то? Я своими глазами видел как сервер SSH в топе по жору ресурсов висит.
Хотя кажется там всё таки был вход по паролю.

vadimspriggan Автор
15.12.2025 19:25Вы правы, я не везде меняю порты. Это избыточно. Иногда я делаю доступ к ssh только по белым спискам.
sudo ufw allow from 1.2.3.4 to any port 22 proto tcpЯ бы очень хотел делать так везде, но иногда приходится подключаться через динамические IP. Вот если бы ufw резолвил доменные имена, тогда можно было бы использовать ddns домашнего роутера, например.
PS
И ещё не стоит забывать про поисковики типа SHODAN. После некоторого времени ваш сервер попадёт в выдачу по фильтру default ssh port.

vla3d
15.12.2025 19:25Ломятся боты? То есть авторизацию по логину/паролю в ssh лучше вовсе отключить, оставив только сертификат?

MountainGoat
15.12.2025 19:25По хорошему да. Именно чтобы не жрали ресурсы, пока каждый школьник проверит тебя на пароли admin и princess.

uvelichitel
15.12.2025 19:25На сервере (под новым пользователем):
nano ~/.ssh/authorized_keys # Вставьте ключДля удобной и безопасной передачи публичного ssh ключа еще предусмотрена специальная утилита. На рабочей машине:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
MountainGoat
15.12.2025 19:25На Win11 нет ssh-copy-id. Приходится через nano. Или из WSL. Поставить можно конечно, но если раз в год об этом вспоминаешь...

JBFW
15.12.2025 19:25Чтобы работать с Docker без sudo, добавьте пользователя в группу (делается после создания пользователя):
А потом так, из-под этого пользователя:
docker run -ti -v /etc:/etc debian rm -rf /etc
Ой. Кто-то только что всё поломал...
И с автообновлениями поосторожнее.
Во-первых, в новой версии пакетов может поломаться совместимость, особенно с тем что вы собирали сами, а не ставили тоже из пакетов. 99% все будет ОК, но 1% запомнится вам надолго.Во-вторых, иногда обновление пакета тянет за собой пересборку initrd или замену актуального ядра, с последующими сюрпризами после перезагрузки. Хотите рисковать - велкам.
Лучше, раз уж поставили докер - делать обновление сначала в докере, ПРОВЕРЯТЬ что всё работает - а потом в хост-системе.
Хотя зачем я это говорю, всё равно никто же не послушает, пока сам на грабли не наступит )

MountainGoat
15.12.2025 19:25Человек, ставящий сервер, глядя на инструкцию с Хабра - поднимает в лучшем случае свой почтовый сервер и Nextcloud. Если это раз в 2 года упадёт, это куда меньшая проблема, чем если ему через известную уязвимость закинут следилку и всё просканируют. Поэтому пусть лучше ставит автообновления в лоб, чем не ставит никаких.
А заниматься вот этими вот предварительными проврками не админ не будет.

VenbergV
15.12.2025 19:25Возможно я "альтернативный" ретроград... Но повторю опять:
1. Зачем тащить iptables, ufw, net-tools в ситему 2025 года?
2. Зачем портить sshd.config, если есть целая директория sshd_config.d для кастомизации?
3. Почему используете
PasswordAuthentication no
PermitRootLogin no
но не добавляетеKbdInteractiveAuthentication no
4. Зачем неконтролируемый автоапдейт на удаленном сервере? Можно нежданно получить или автозамену конфигов, или обновленные сервисы, которым не понравятся старые конфиги. Тривиально, какие-то опции ушли в deprecated, или отменены.
kfwerqu3ykzn
15.12.2025 19:25А можете подробнее про первый пункт рассказать? Как это должно выглядеть в 2025?

VenbergV
15.12.2025 19:25Вот была статья: https://habr.com/ru/articles/320278/
Ей уже почти 9 лет! Но мы продолжаем тащить legacy из системы в систему.
Вот еще статья: https://habr.com/ru/companies/ruvds/articles/580648/
Ей уже 4 года!

eyeDM
15.12.2025 19:25А что, Docker уже научился обходиться без
iptables-legacy?Текст статьи сильно похож на ответ LLM, так наиболее вероятная причина таких советов - наследие интернета не первой свежести)

vadimspriggan Автор
15.12.2025 19:25Вы правы, участие LLM в этом есть. Но только в той части, где я попросил её сделать форматирование и проверить достоверность.
Данная "шпаргалка" лежала у меня несколько лет в notion, обрастала новыми командами и прочим мусором.
По этим алгоритмам я настроил не один десяток VPS под разные нужды.
После "причёсывания" LLM-кой я ещё раз прошёлся и отредактировал текст.
В целом текст похож на ответ LLM, потому что я постарался высушить его до базового минимума.

MountainGoat
15.12.2025 19:251_Вот вы серьёзно предлагаете человеку, которому 2 контейнера запустить надо, разбирать nftables вместо ufw?
3_Сейчас посмотрел на Debian 12, Arch и Bazzite: везде уже есть по умолчанию.
4_Лучше, чем никакого. Мы говорим про личный сервер, человек не будет еженедельно вручную правильно накатывать туда апдейты с проверкой на виртуалке. Чтобы прям доступ отвалился это маловероятно, а остальное починим.

MedVed-24
15.12.2025 19:25не где не увидел создание резервного локального входа через консоль доступа хостера. как резервную систему.

vadimspriggan Автор
15.12.2025 19:25Вход через VNC остаётся через созданного пользователя или Вы про другое?

MedVed-24
15.12.2025 19:25я про вход только через локаль хостера, который не сможет через ssh, так сказать последний довод.

ErshoffPeter
15.12.2025 19:25"Putty не предлагать!" - можете пояснить нубу по какой причине не предлагать?

vadimspriggan Автор
15.12.2025 19:25В Windows 10+ используется PowerShell 7+ у него есть встроенный клиент Open SSH. Сам Powershell на текущий момент является OpenSource и вполне функциональный из коробки.
PuTTY - это сторонняя программа, которая одновременно является и интерпретатором команд, и эмулятором терминала. PowerShell с нормальным эмулятором может всё то же самое. Я использую Fluent, так как он есть в репозиториях Windows и ставится через winget.
Минусы PuTTY:
- Его надо ставить отдельно, следить за версией.
- Для генерации ключей нужна утилита PuTTYgen. В PS используется встроенный ssh-keygen.
- Имеет свой формат ключей .ppk - нужно конвертировать.
- Нет интеграции с основной системой.
- Ну и напоследок PuTTY из коробки выглядит ужасно.
- Кажется, у него нет полноэкранного режима, но точно уже не помню.Плюсы:
+ Может быть portable, так как это всего один exe.
+ Сохраняет сессии. Fluent тоже так умеет, а ещё поддерживает mosh - это ssh по udp, не рвётся даже при разрывах сигнала.

lleo_aha
15.12.2025 19:25+1 инструкция вида:
поставим файрвол
откроем в нем порты которые у нас listen
Вопрос - а зачем файрвол то?

MountainGoat
15.12.2025 19:25Ставим свежий Linux
Ставим нужный нам софт.
Набираем ss -lntu
Офигеваем, кто все эти люди?
Чтобы долго не офигевать, просто закрываем все порты кроме тех, что нам нужны.
Не так мало пакетов, которые устанавливаются просто как зависимости, но потом начинают слушать порт для своих целей. Полезных, но нам нафиг не нужных, типа поддержки клиентов с Apple. Особенно среди
рукожоNodeJS софта.
lleo_aha
15.12.2025 19:25Я к тому и веду, что для мануала по "настройке сервера" было бы тогда более правильным этот лишний софт туда не допустить, чем изолентой сверху заматывать

MountainGoat
15.12.2025 19:25И я к тому и веду, что следить и выискивать, что там может стоять такое с открытым портом - это требует и времени и знаний. А файрволл сразу закрывает огромное количество возможных проблем и ничему нужному не мешает. Тем более, что у многих вся нагрузка сейчас в докере, а там свой файрволл - поэтому в системном обычно можно прописать "Разрешить SSH, apt и докер, всё остальное в обе стороны запретить"

lleo_aha
15.12.2025 19:25Уже некорректно пишете. Что такое "разрешить apt и докер"? Подскажу - речь про исходящие подключения. Которые и так (даже с предложенным ufw) все открыты там.
zbot
спасибо, актуально.
еще бы про настройку фаирвола и как убрать ответы на пинг.
JBFW
sysctl net.ipv4.icmp_echo_ignore_all=1
сервер перестает отвечать на пинги
kma21
Странный ответ, конечно. Вы бы ещё выключить сервер предложили. Он тогда тоже перестанет отвечать на пинги.