Привет!

За годы работы и самообучения 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)


  1. zbot
    15.12.2025 19:25

    спасибо, актуально.

    еще бы про настройку фаирвола и как убрать ответы на пинг.


    1. JBFW
      15.12.2025 19:25

      sysctl net.ipv4.icmp_echo_ignore_all=1

      сервер перестает отвечать на пинги


      1. kma21
        15.12.2025 19:25

        Странный ответ, конечно. Вы бы ещё выключить сервер предложили. Он тогда тоже перестанет отвечать на пинги.


  1. gliderman
    15.12.2025 19:25

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


  1. 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 отлично генерирует.


    1. x4team_only
      15.12.2025 19:25

      curl eth0.me


      1. MountainGoat
        15.12.2025 19:25

        icanhazip это сейчас сервис Cloudflare. Репутация.

        А про "eth0.me" мне даже Kagi только обсуждения малвари выдаёт. Репутация.


    1. alche
      15.12.2025 19:25

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


    1. opusmode
      15.12.2025 19:25

      Я бы добавил, что нет вообще никакого смысла менять порт ssh, так как это только немного поможет от школьников со скачанными ботами, а остальные уже давно сканят порты и слушают ответ и ломятся туда, а не на дефолт. Скан занимает секунды и происходит домтаточно регуоярно, так что объем это не снизит.

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

      Всё, остальное очень успешно рубится и режется в наше время. Подобрать связку имени и 4096 ключика почти нереально, а уж тем более связку имени и ключика на элептической кривой.

      Остальное можно вернуть обратно в 2010 год, все эти смены портов и отключения эхо - абсолютно бесполезная паранойа


      1. MountainGoat
        15.12.2025 19:25

        ак как это только немного поможет от школьников со скачанными ботами, 

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

        Хотя кажется там всё таки был вход по паролю.


      1. 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.


      1. igorm01
        15.12.2025 19:25

        Секунды? 65к портов с без явного дропа на fw?

        Скрипт в студию


    1. vla3d
      15.12.2025 19:25

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


      1. MountainGoat
        15.12.2025 19:25

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


    1. dotnetfx40
      15.12.2025 19:25

      curl ifconfig.me


    1. kma21
      15.12.2025 19:25

      ifconfig.me
      ifconfig.ca

      Олдам привычнее будет =)


  1. uvelichitel
    15.12.2025 19:25

    На сервере (под новым пользователем):

    nano ~/.ssh/authorized_keys   # Вставьте ключ

    Для удобной и безопасной передачи публичного ssh ключа еще предусмотрена специальная утилита. На рабочей машине:

    ssh-copy-id -i ~/.ssh/id_rsa.pub user@server


    1. MountainGoat
      15.12.2025 19:25

      На Win11 нет ssh-copy-id. Приходится через nano. Или из WSL. Поставить можно конечно, но если раз в год об этом вспоминаешь...


  1. JBFW
    15.12.2025 19:25

    Чтобы работать с Docker без sudo, добавьте пользователя в группу (делается после создания пользователя):

    А потом так, из-под этого пользователя:

    docker run -ti -v /etc:/etc debian rm -rf /etc

    Ой. Кто-то только что всё поломал...

    И с автообновлениями поосторожнее.
    Во-первых, в новой версии пакетов может поломаться совместимость, особенно с тем что вы собирали сами, а не ставили тоже из пакетов. 99% все будет ОК, но 1% запомнится вам надолго.

    Во-вторых, иногда обновление пакета тянет за собой пересборку initrd или замену актуального ядра, с последующими сюрпризами после перезагрузки. Хотите рисковать - велкам.

    Лучше, раз уж поставили докер - делать обновление сначала в докере, ПРОВЕРЯТЬ что всё работает - а потом в хост-системе.

    Хотя зачем я это говорю, всё равно никто же не послушает, пока сам на грабли не наступит )


    1. MountainGoat
      15.12.2025 19:25

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

      А заниматься вот этими вот предварительными проврками не админ не будет.


  1. 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, или отменены.


    1. kfwerqu3ykzn
      15.12.2025 19:25

      А можете подробнее про первый пункт рассказать? Как это должно выглядеть в 2025?


      1. Efrem3112
        15.12.2025 19:25

        nftables, iproute2


        1. alche
          15.12.2025 19:25

          В современных системах по умолчанию установлен и работает nftables. Но никто не запрещает пользоваться синтаксисом и писать команды так, будто вы пользуетесь iptables. Это работает как связка фронтенд (iptables) - бэкенд (nftables).


      1. VenbergV
        15.12.2025 19:25

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


    1. eyeDM
      15.12.2025 19:25

      1. А что, Docker уже научился обходиться без iptables-legacy?

      2. Текст статьи сильно похож на ответ LLM, так наиболее вероятная причина таких советов - наследие интернета не первой свежести)


      1. vadimspriggan Автор
        15.12.2025 19:25

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


    1. MountainGoat
      15.12.2025 19:25

      1_Вот вы серьёзно предлагаете человеку, которому 2 контейнера запустить надо, разбирать nftables вместо ufw?

      3_Сейчас посмотрел на Debian 12, Arch и Bazzite: везде уже есть по умолчанию.

      4_Лучше, чем никакого. Мы говорим про личный сервер, человек не будет еженедельно вручную правильно накатывать туда апдейты с проверкой на виртуалке. Чтобы прям доступ отвалился это маловероятно, а остальное починим.


  1. MedVed-24
    15.12.2025 19:25

    не где не увидел создание резервного локального входа через консоль доступа хостера. как резервную систему.


    1. vadimspriggan Автор
      15.12.2025 19:25

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


      1. MedVed-24
        15.12.2025 19:25

        я про вход только через локаль хостера, который не сможет через ssh, так сказать последний довод.


  1. ErshoffPeter
    15.12.2025 19:25

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


    1. 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, не рвётся даже при разрывах сигнала.


    1. MountainGoat
      15.12.2025 19:25

      В Win10,11 даже без WSL есть уже свой нормальный клиент SSH.


  1. lleo_aha
    15.12.2025 19:25

    +1 инструкция вида:

    • поставим файрвол

    • откроем в нем порты которые у нас listen

    Вопрос - а зачем файрвол то?


    1. MountainGoat
      15.12.2025 19:25

      1. Ставим свежий Linux

      2. Ставим нужный нам софт.

      3. Набираем ss -lntu

      4. Офигеваем, кто все эти люди?

      5. Чтобы долго не офигевать, просто закрываем все порты кроме тех, что нам нужны.

      Не так мало пакетов, которые устанавливаются просто как зависимости, но потом начинают слушать порт для своих целей. Полезных, но нам нафиг не нужных, типа поддержки клиентов с Apple. Особенно среди рукожо NodeJS софта.


      1. lleo_aha
        15.12.2025 19:25

        Я к тому и веду, что для мануала по "настройке сервера" было бы тогда более правильным этот лишний софт туда не допустить, чем изолентой сверху заматывать


        1. MountainGoat
          15.12.2025 19:25

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


          1. lleo_aha
            15.12.2025 19:25

            Уже некорректно пишете. Что такое "разрешить apt и докер"? Подскажу - речь про исходящие подключения. Которые и так (даже с предложенным ufw) все открыты там.


  1. Shurik911
    15.12.2025 19:25

    Putty не предлагать, звучит как политический лозунг.