Начальная настройка Linux сервера на примере Debian
Приветствую!

В этот раз мы будем выполнять базовую настройка сервера Linux на примере дистрибутива Debian 12.

Предисловие

Продолжаем тему администрирования Linux сервера. В прошлые разы мы:

Сегодня мы выполним начальную настройку сервера Debian версии 12 перед его дальнейшей эксплуатацией.

Данная инструкция актуальна для настройки как виртуальных серверов, созданных, например в VirtualBox локально или у хостеров, например Virtual Private Server (VPS), так и для классических железных (bare-metal) серверов.

Начальная настройка сервера Debian

Вводные данные, используемые в этой статье:

IP адрес ВМ сервера192.168.56.102
Новый hostname сервераr4ven-test
Имя локального пользователя на сервереivan
Новый порт SSH, отличный от стандартного27244

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

Открываем консоль нашей ВМ и первым делом..

Смена пароля пользователя root

Выполняем:

BASH
passwd
Нажмите, чтобы развернуть и увидеть больше

и дважды указываем новый пароль:

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

BASH
ssh root@192.168.56.102
Нажмите, чтобы развернуть и увидеть больше

Установка необходимых утилит

Теперь обновим кэш пакетов, обновим сами пакеты и установим некоторые полезные утилиты, для дальнейшей работы с сервером:

BASH
apt update && apt upgrade -y

apt install -y sudo ufw zsh software-properties-common neovim curl wget git mc fzf
Нажмите, чтобы развернуть и увидеть больше

Описание устанавливаемых пакетов:

Название пакетаОписание
sudoУтилита для получения привилегий суперпользователя
ufwудобный фронтенд для родного фаервола Linux — iptables/nftables
zshинтерактивная командная оболочка (есть отдельная статья по настройке)
software-properties-commonпакет для управления дополнительными репозиториями ПО
neovimпродвинутый консольный текстовый редактор (есть статья по знакомству с Vim/Neovim)
curlутилита взаимодействия между узлами в интернете по протоколам передачи данных
wgetудобная утилита для скачивания контента из интернета
gitсистема контроля версий
mcMidnightCommander — двухпанельный консольный файловый менеджер
fzfутилита «нечёткого» поиска

Настройка сети с помощью systemd-networkd

⚠️Если сеть у вас уже настроена, то можете пропустить этот шаг.

В целях унификации я предпочитаю настраивать сеть на Linux серверах с помощью systemd-networkd.

❗Перед внесением каких-либо изменений, обязательно убедитесь, что у вас есть физический доступ к серверу / доступ к консоли ВМ с гипервизора, чтобы вы могли оперативно откатить конфигурацию, если что-то пойдет не так.

Предварительно делаем бэкапы текущих файлов настроек по рекомендации из документации Debian:

BASH
mv -v /etc/network/interfaces{,.backup}
mv -v /etc/network/interfaces.d{,.backup}
Нажмите, чтобы развернуть и увидеть больше

Если вы используете netplan, то бэкапим и его:

BASH
mv -v /etc/netplan{,.backup}
Нажмите, чтобы развернуть и увидеть больше

Теперь открываем на редактирование новый файл с настройками сети:

BASH
nvim /etc/systemd/network/10-lan0.network
Нажмите, чтобы развернуть и увидеть больше

💡Цифра 10 в имени определяет очередность считывания настроек из файлов, если их несколько (10, 20 и т.д).

Для статической адресации наполняем файл примерно таким содержимым:

⚠️Замените сетевые параметры на свои. Подсмотреть их можно в файлах /etc/network/interfaces*.

PLAINTEXT
[Match]
Name=eth0
   
[Network]
Description=Local network
Address=192.168.56.102/24
Gateway=192.168.56.1
Нажмите, чтобы развернуть и увидеть больше

Если сетевые параметры вы получаете по DHCP, тогда содержимое будет примерно таким:

PLAINTEXT
[Match]
Name=eth0

[Network]
DHCP=ipv4
Нажмите, чтобы развернуть и увидеть больше

systemd-networkd принимает групповые символы. Если у вас несколько интерфейсов получают настройки по DHCP, то можно заполнить файл так:

PLAINTEXT
[Match]
Name=e*

[Network]
DHCP=ipv4
Нажмите, чтобы развернуть и увидеть больше

💡Подробнее про все параметры systemd-networkd смотрите тут.

Применяем настройки и активируем автозапуск:

BASH
systemctl restart systemd-networkd

systemctl enable systemd-networkd

systemctl status systemd-networkd
Нажмите, чтобы развернуть и увидеть больше

💡Для управления сетью используйте стандартные команды systemctl start|stop|restart systemd-networkd.

В составе systemd-networkd идет удобная утилита networkctl, с помощью которой можно смотреть информацию по сетевым подключениям и управлять ими:

BASH
networkctl status
Нажмите, чтобы развернуть и увидеть больше

Посмотреть статус можно и классическим способом:

BASH
ip address
Нажмите, чтобы развернуть и увидеть больше

Проверяем доступ в интернет:

BASH
ping -c3 r4ven.me
Нажмите, чтобы развернуть и увидеть больше

Крайне рекомендуется перезапустить сервер, чтобы убедиться, что автоматическое поднятие сети происходит корректно:

BASH
reboot
Нажмите, чтобы развернуть и увидеть больше

systemd-networkd позволяет довольно гибко конфигурировать сеть в Linux. Подобным образом в файлах задаются сетевые маршруты, правила маршрутизации, DNS, настройки NTP и так далее.

Настройка DNS с помощью systemd-resolved

⚠️Если у вас DNS уже настроен, то можете пропустить этот шаг.

Во многих современных дистрибутивах Linux для управления DNS используется один из модулей systemd — systemd-resolved.

systemd-resolved — это компонент Systemd, отвечающий за работу DNS. Он управляет запросами, кэширует результаты и поддерживает различные протоколы.

Выполняем установку пакета:

❗Также убедитесь, что у вас есть доступ к консоли сервера, перед внесением изменений.

BASH
apt install systemd-resolved
Нажмите, чтобы развернуть и увидеть больше

☝️В соответствии с политикой Debian чаще всего устанавливаемые сервисы-демоны запускаются после установки с включением автозапуска при старте системы.

Для редактирования параметров DNS открываем файл конфигурации:

BASH
nvim /etc/systemd/resolved.conf
Нажмите, чтобы развернуть и увидеть больше

И в блоке Resolve изменяем (или дополняем) директиву DNS= своими значениями:

PLAINTEXT
[Resolve]
DNS=8.8.8.8 1.1.1.1
Domains=~.
Нажмите, чтобы развернуть и увидеть больше

☝️Если не указать опцию Domains=~., то systemd-resolved может использовать DNS-серверы из настроек отдельных сетевых интерфейсов, если параметр Domains=~. в них есть. Данная опция не повлияет на запросы доменных имён, которые совпадают с каким-то более точным поисковым доменом из настроек интерфейса.

Сохраняем и перезапускаем службу, на всякий активируем автозапуск + очищаем кэш DNS:

💡В составе пакета systemd-resolved идет утилита управления настройками DNS — resolvectl.

BASH
systemctl restart systemd-resolved

systemctl enable systemd-resolved

systemctl status systemd-resolved

resolvectl flush-caches
Нажмите, чтобы развернуть и увидеть больше

Также для совместимости с приложениями, которые не используют библиотечные вызовы, а обращаются к DNS серверу напрямую, рекомендуется создать такой симлинк (с предварительным бэкапом файла resolv.conf):

BASH
mv /etc/resolv.conf{,.backup}

ln -sv /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
Нажмите, чтобы развернуть и увидеть больше

Для подробного ознакомления с процессом настройки DNS посредством systemd-resolved рекомендую ознакомиться c этим вики-материалом.

⚠️ По опыту, в случае systemd-resolved предпочтительным будет перезапустить систему целиком, но это необязательно.

Проверяем работу DNS:

BASH
resolvectl status

resolvectl query r4ven.me

ping -c3 r4ven.me

nslookup r4ven.me
Нажмите, чтобы развернуть и увидеть больше

💡Для управления DNS используйте стандартные команды systemctl start|stop|restart systemd-resolved.

systemd-resolved имеет гибкие настройки, включая DNSSEC, DNS over TLS, Multicast DNS (mDNS), Link-Local Multicast Name Resolution (LLMNR) и др.

Подробнее про работу подсистемы DNS в Linux читайте тут и тут.

Настройка NTP с помощью systemd-timesyncd

Для многих сервисов в Linux важна точность времени. Чтобы сервер всегда знал точное время рекомендуется настраивать его синхронизацию с билжайшим NTP сервером. Для этой цели воспользуемся модулем systemd-timesyncd.

Выполняем установку:

BASH
apt install systemd-timesyncd
Нажмите, чтобы развернуть и увидеть больше

Открываем на редактированием конфиг файл сервиса:

BASH
nvim /etc/systemd/timesyncd.conf
Нажмите, чтобы развернуть и увидеть больше

И наполняем примерно таким содержимым:

⚠️При необходимости замените список NTP серверов на свои.

PLAINTEXT
[Time]
NTP=0.ru.pool.ntp.org 1.ru.pool.ntp.org 2.ru.pool.ntp.org 3.ru.pool.ntp.org
FallbackNTP=0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org
RootDistanceMaxSec=5
PollIntervalMinSec=32
PollIntervalMaxSec=2048
Нажмите, чтобы развернуть и увидеть больше

Используемый NTP-сервер будет определяться с помощью следующих правил:

Для более подробного описания работы systemd-timesyncd изучите эту wiki-статью.

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

BASH
systemctl restart systemd-timesyncd

systemctl enable systemd-timesyncd

systemctl status systemd-timesyncd
Нажмите, чтобы развернуть и увидеть больше

В составе Systemd идет удобная утилита управления timedatectl. Посмотреть статус службы с ее помощью можно так:

BASH
timedatectl status

timedatectl timesync-status
Нажмите, чтобы развернуть и увидеть больше

💡Для управления systemd-timesyncd используйте стандартные команды systemctl start|stop|restart systemd-timesyncd.

systemd-timesyncd — удобный и простой в использовании клиент NTP, который позволяет быстро настроить синхронизацию времени по сети.

Добавление нового пользователя

⚠️ Если у вас уже существует локальный пользователь, то можете пропустить данный шаг.

Если вы при установке Debian 12 или настройке ВМ, например, в случае VPS, не создали нового пользователя системы, то создаём:

BASH
useradd -m -G sudo -s /bin/bash ivan

passwd ivan
Нажмите, чтобы развернуть и увидеть больше

Где в первой команде:

А командой passwd мы задаём новому пользователю пароль. По умолчанию у новых пользователей он отсутствует/отключён.

Настройка SSH на клиентском хосте

Постулатами безопасности рекомендуется не работать в Linux-based системах от имени пользователя root напрямую. Подключение под этим пользователем к удалённым серверам обычно отключают. Что и сделаем мы, но чуть позже, а пока настроим подключение с авторизацией по SSH ключу от имени ранее созданного нами пользователя.

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

Пару слов, про тип генерируемых ключей. Для генерации ключей используется утилита ssh-keygen, которая по умолчанию создаёт ключи типа RSA. Это довольно старый, созданный еще в 1977 году криптографический алгоритм, но который всё еще очень популярный, т.к. поддерживается большинством систем. Подробнее про него можно почитать на википедии.

Сами разработчики протокола SSH рекомендуют использовать ключи более современного алгоритма шифрования — EdDSA, а именно ed25519. Данный алгоритм основан на эллиптических кривых. Подробнее также на вики. Как утверждается, он является более безопасным и лучше оптимизирован по скорости работы. Его мы и будем использовать.

И так, на нашей desktop системе открываем терминал и генерируем новые ключи (если вы не делали этого ранее):

BASH
test -e ~/.ssh || mkdir -v $HOME/.ssh/ && chmod 700 ~/.ssh

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
Нажмите, чтобы развернуть и увидеть больше

Командой test -e ~/.ssh || mkdir $HOME/.ssh/ && chmod 700 ~/.ssh мы проверили наличие директории файлов SSH, и если такая директория отсутствует — создаём её и выставляем правильные права.

Подробнее про механизм перенаправления и операторы управления выполнением команд можно почитать тут: Контроль выполнения команд: операторы «&&», «||», «;» и «&».

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

По-хорошему, нужно пароль задать, но тогда пропадает смысл «безпарольной» авторизации на удаленных системах. Тут все зависит от уровня вашей паранойи и места, с которого вы будете подключаться. Если это ваши личные проекты, то для удобства пароль можно не задавать. В этом примере я не буду задавать пароль. Для этого дважды кликаем Enter на запрос парольной фразы для ключа.

Существуют и альтернативные решения, позволяющие зашифровать файл-ключ, но при этом не вводить пароль каждый раз для его расшифровки — это использование утилиты ssh-agent. Но это тема для отдельной заметки)

После генерации в директории ~/.ssh появятся два файла:

Проверяем:

BASH
ls -l ~/.ssh/id_ed*
Нажмите, чтобы развернуть и увидеть больше

Теперь копируем наш публичный SSH ключ для входа на наш сервер специальной командой:

BASH
ssh-copy-id -i $HOME/.ssh/id_ed25519.pub ivan@192.168.56.102
Нажмите, чтобы развернуть и увидеть больше

Не забудьте подставить свои имя пользователя и ip адрес сервера.

При выполнении система запросит пароль нашего пользователя на сервере.

После отработки команды, в домашней директории пользователя на нашем сервере появится файл ~/.ssh/authorized_keys, где будет прописан наш публичный ключ с клиентской машины. Можем это проверить:

BASH
cat ~/.ssh/id_ed25519.pub
Нажмите, чтобы развернуть и увидеть больше
BASH
cat /home/ivan/.ssh/authorized_keys
Нажмите, чтобы развернуть и увидеть больше

По сути, мы могли и вручную добавить этот ключ/набор символов в файл ~/.ssh/authorized_keys, но утилита сама всё делает + выставляет корректные права на файлы.

Обратите внимание, что права на чувствительные файлы SSH должны быть выставлены исключительно для владельца файлов. А именно:

  • 700 для директорий, в т.ч. ~/.ssh
  • 600 для файлов, в т.ч. ~/.ssh/authorized_keys

Иначе система просто не позволит вам ими воспользоваться.

Теперь пробуем подключится к серверу с помощью SSH ключа:

BASH
ssh ivan@192.168.56.102
Нажмите, чтобы развернуть и увидеть больше

Как видим, пароль больше не запрашивается.

Теперь, успешно подключившись к серверу под новым пользователем, продолжаем настройку.

Прежде чем продолжить, хотел бы осветить еще один нюанс. С целью обеспечения большей безопасности и предотвращении нежелательных последствий — работать в консоли Linux рекомендуется от имени обычного пользователя, но у которого есть возможность выполнять команды от имени суперпользователя root.

Другими словами: подключение к системе, выполнение типичных задач, не требующих привилегий и пр. необходимо выполнять от имени обычного юзера. А при необходимости провести более серьезные манипуляции, например, внести какие-то изменения в настройки системы — то использовать команду sudo, при этом не переходя в учётную запись root.

Таким образом повышается общая безопасность и уменьшается вероятность что-то случайно сломать. Конечно временами так бывает не удобно, и никто не запрещает вам просто перейти в root. Не забывайте, что сказанное выше — это рекомендация, которой просто желательно следовать.

Настройка текстового редактора по умолчанию

Читатели моих предыдущих статей уже знают, что в качестве консольного текстового редактора я предпочитаю Vim/Neovim. Если интересно узнать что это такое и почему мой выбор пал именно на него, то прошу к прочтению . Если что, мой конфиг Neovim, по мере настройки, будет дополняться в репе на GitHub.

Чтобы задать в косноли сервера редактора по умолчанию выполним команду:

BASH
echo 'SELECTED_EDITOR="/usr/bin/nvim"' > ~/.selected_editor
Нажмите, чтобы развернуть и увидеть больше

Создать такой файл можно также и для рута, чтобы везде были одинаковые настройки:

BASH
echo 'SELECTED_EDITOR="/usr/bin/nvim"' | sudo tee ~/.selected_editor
Нажмите, чтобы развернуть и увидеть больше

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

Дело в том, что если выполнить: sudo echo 'SELECTED_EDITOR="/usr/bin/nvim"' > /root/.selected_editor — то мы получим ошибку. В случае второй команды — ошибки не будет:

Особенность в том, что хоть и команда echo выполняется через sudo, но перенаправление вывода, перехватываемое оператором > выполняется все еще от обычного пользователя, поэтому мы получаем Permission denied.

В случае второй команды, наоборот: сперва выводим желаемый текст, а затем с помощью команды tee, запускаемой через sudo мы перенаправляем вывод от имени суперпользователя. В реальной практике часто можно встретить такой нюанс в работе механизма привилегий в Linux.

Команда tee — читает стандартный ввод и записывает его в указанный файл и параллельно передает на стандартный вывод.

Подробнее про стандартные ввод/вывод можно почитать в отдельной моей статье: Командная строка Linux, вывод и чтение содержимого: команды echo, cat, less.

Отключение IPv6

Не буду вдаваться в подробности, зачем нужно отключать IPv6, если он не используется. Оставлю это на самостоятельное изучение. Покажу лишь, как это делается в Linux.

Открываем на редактирование системный конфиг:

BASH
sudo nvim /etc/sysctl.conf
Нажмите, чтобы развернуть и увидеть больше

И в конец файла добавляем следующие строки:

BASH
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Нажмите, чтобы развернуть и увидеть больше

Для перечитывания конфига выполняем:

BASH
sudo sysctl -p
Нажмите, чтобы развернуть и увидеть больше

Настройка фаервола UFW

На каждом сервере я обязательно активирую и настраиваю сетевой экран. В ОС на базе Linux в состав ядра входит модуль Netfilter, который отвечает за обработку сетевых пакетов. Управляет этим модулем утилита iptables или ее современная версия nftables. Данные утилиты являются низкоуровневыми и их настройка это отдельная тема. Для deb based дистрибутивов существует более простоя и интуитивно понятная утилита управления фаерволом — ufw. В rpm дистрибутивах есть аналогичная программа — firewallcmd. Но так как у нас Debian 12, я использую ufw (установили её на шаге установки пакетов). Выполним базовую настройку защиты сети.

Отключаем IPv6 в UFW. Открываем на редактирование файл конфигурации ufw:

BASH
sudo nvim /etc/default/ufw
Нажмите, чтобы развернуть и увидеть больше

Меняем строку IPV6=yes на no:

BASH
IPV6=no
Нажмите, чтобы развернуть и увидеть больше

Далее открываем доступп извне к портам SSH:

BASH
sudo ufw allow 22/tcp

sudo ufw allow 27244/tcp
Нажмите, чтобы развернуть и увидеть больше

27244 — нестандартный порт для подключения по SSH, который мы зададим ниже в настройках SSH сервера. Стандартные порты сервисов по возможности рекомендуется менять. Т.к. они обычно сканируются ботами.

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

Включаем и перезапускам ufw:

BASH
sudo ufw enable && sudo systemctl restart ufw
Нажмите, чтобы развернуть и увидеть больше

Нас предупредят, что активация фаервола может дропнуть текущее SSH соединения. Но если вы корректно добавили правило для открытия порта 22 TCP, то все должно быть в порядке.

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

Посмотреть существующие правила в UFW можно так:

BASH
sudo ufw status verbose
Нажмите, чтобы развернуть и увидеть больше

Тут мы видим, что у нас «открыты» два порта для доступа из вне. Обратите внимание на 3-ю строку — это политика обработки пакетов по умолчанию

Т.е.

Запрет ответов по ICMP

Запрет ICMP с помощью ufw

Если вы настраиваете сервер с внешним IP, возможно вы захотите отключить ответы ping и traceroute по протоколу ICMP.

Для этого откройте на редактирование файл /etc/ufw/before.rules:

BASH
sudo nvim /etc/ufw/before.rules
Нажмите, чтобы развернуть и увидеть больше

Найдите и закоментируйте блоки правил, касающиеся ICMP:

BASH
# ok icmp codes for INPUT
# -A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
# -A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
# -A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
# -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

# ok icmp code for FORWARD
# -A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
# -A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
# -A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
# -A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
Нажмите, чтобы развернуть и увидеть больше

После чего перезапустите фаервол:

BASH
sudo ufw reload
Нажмите, чтобы развернуть и увидеть больше

Попробуйте выполнить ping и traceroute -I до вашего сервера, ответов быть не должно.

Запрет ICMP с помощью параметров ядра

Запретить ICMP ответы в Linux на уровне ядра можно с помощью утилиты sysctl или изменяя файлы в /proc/sys.

💡 sysctl — это удобная обёртка для чтения и записи параметров ядра Linux в виртуальную файловую систему /proc/sys.

Для временного запрета выполните команды:

BASH
sysctl -w net.ipv4.icmp_echo_ignore_all=1

# или

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Нажмите, чтобы развернуть и увидеть больше

💡В случае ipv6 замените 4 на 6.

Чтобы вновь разрешить ICMP ответы:

BASH
sysctl -w net.ipv4.icmp_echo_ignore_all=0

# или

echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Нажмите, чтобы развернуть и увидеть больше

При необходимости сделать изменения постоянными — добавьте данные параметры в файл /etc/sysctl.conf:

BASH
sudo nvim /etc/sysctl.conf
Нажмите, чтобы развернуть и увидеть больше
BASH
net.ipv4.icmp_echo_ignore_all = 1
net.ipv6.icmp.echo_ignore_all = 1
Нажмите, чтобы развернуть и увидеть больше

После чего перечитайте конфиг:

BASH
sysctl -p
Нажмите, чтобы развернуть и увидеть больше

Стоит обратить внимание, что таким образом не отключается полное взаимодействие по ICMP. Например, стоит изучить следующие параметры:

Описание этих и других параметров ICMP смотрите тут 🧐.

Изменение hostname сервера и правка файла hosts

Чтобы изменить hostname нашей системы открываем на редактирование соответствующий файл:

BASH
sudo nvim /etc/hostname
Нажмите, чтобы развернуть и увидеть больше

Я задам такой:

BASH
r4ven-test
Нажмите, чтобы развернуть и увидеть больше

Также добавим наш новый hostname в файл hosts (в Linux данный файл выполняет ту же функцию, что и в Windows):

BASH
sudo nvim /etc/hosts
Нажмите, чтобы развернуть и увидеть больше

Добавляем:

BASH
127.0.0.1    r4ven-test
Нажмите, чтобы развернуть и увидеть больше

Создание swap в файле (опционально)

Если swap файл у вас отсутствует, его рекомендуется создать. swap файл может быть как отдельным разделом, так и простым файлом. Даёшь больше виртуальности!

Проверим наличие активного swap в системе:

BASH
free -m
Нажмите, чтобы развернуть и увидеть больше

Создание и запуск:

BASH
# создаём файл размеров 1GB
sudo fallocate -l 1G /swap

# выставляем права на чтение-запись только для владельца (root)
sudo chmod 600 /swap

# создаём swap из файла
sudo mkswap /swap

# активируем его
sudo swapon /swap
Нажмите, чтобы развернуть и увидеть больше

Вновь проверяем:

BASH
free -m
Нажмите, чтобы развернуть и увидеть больше

Мы создали swap файл и запустили его вручную. Но при перезапуске сервера он сам не запуститься. Для этого нужно добавить его в специальный файл, где перечислены файловые системы, которые монтируются при запуске системы — /etc/fstab:

BASH
echo "/swap    none    swap    sw    0    0" | sudo tee -a /etc/fstab
Нажмите, чтобы развернуть и увидеть больше

Ключ -a для команды tee обязателен! Он указывает tee выполнить добавление в конец файла, а не перезаписать его.

Проверим на всякий случай fstab:

BASH
cat /etc/fstab
Нажмите, чтобы развернуть и увидеть больше

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

Установка и настройка locales и timezone

В каждой системе есть такая сущность, как «локаль» — другими словами локализация. По умолчанию, если во время установки Debian 12, не выбрать иное, устанавливается локаль C.UTF-8 UTF-8. Давайте установим рекомендуемую английскую: en_US.UTF-8 UTF-8 и добавим русскую: ru_RU.UTF-8 UTF-8 локали. Делается это так:

BASH
# установка пакета локалей
sudo apt install -y locales

# интерактивная настройка локали
sudo dpkg-reconfigure locales
Нажмите, чтобы развернуть и увидеть больше

С помощью клавиши Space (пробел) ставим галочку на en_US.UTF-8 UTF-8 (обязательно) и вторую на нужную вам (в моём случае это ru_RU.UTF-8 UTF-8) локаль. Далее клавишей Tab переводим курсор на кнопку <Ok> нажимаем Enter.

Далее выбираем основную локаль, именно она будет использоваться для отображения системной информации. Английский текст меня не пугает (особенно с переводчиком), поэтому я оставлю en_US.UTF-8:

К слову у меня есть небольшая заметка на крутой переводчик: Crow Translate — Самый удобный переводчик текста.

Клавишей Tab переводим курсор на <Ok> и жмём Enter. Пара секунд и локали сгенерированы:

Теперь зададим часовой пояс для нашего сервера такой командой:

BASH
sudo timedatectl set-timezone Europe/Moscow
Нажмите, чтобы развернуть и увидеть больше

Список всех доступных таймзон можно посмотреть командой:

BASH
timedatectl list-timezones
Нажмите, чтобы развернуть и увидеть больше

Ротация системных журналов

По умолчанию в Debian GNU/Linux настроено журналирование системных событий без ограничений на количество хранимых файлов. Дабы в будущем не обнаружить полностью забитый диск журналами системы, рекомендуется задать ограничения.

В Debian 12 за инициализацию системы, в т.ч. и журналирование, отвечает программа systemd. Управление журналами выполняется определенной утилитой из пакета systemd — journald.

Ограничить количество логов с её помощью можно:

Для этого отредактируйте конфиг службы журналирования:

BASH
sudo nvim /etc/systemd/journald.conf
Нажмите, чтобы развернуть и увидеть больше

Где SystemMaxUse=800M — ограничение по размеру хранимых журналов, а MaxFileSec=2week — по времени.

Количество дней и размер выбирайте по вашим потребностям, ну или предпочтениям.

Не забываем сохраниться и перезапустить службу:

BASH
sudo systemctl restart systemd-journald
Нажмите, чтобы развернуть и увидеть больше

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

По времени:

BASH
sudo journalctl --vacuum-time=15d
Нажмите, чтобы развернуть и увидеть больше

По размеру:

BASH
sudo journalctl --vacuum-size=800M
Нажмите, чтобы развернуть и увидеть больше

Настройка SSH сервера

Открываем файл конфигурации SSH сервера:

BASH
sudo nvim /etc/ssh/sshd_config
Нажмите, чтобы развернуть и увидеть больше

И устанавливаем следующие параметры:

PLAINTEXT
# меняем стандартный порт подключения
Port 27244

# включаем использование только IPv4
AddressFamily inet

# отключаем возможность подключаться под пользователем root
PermitRootLogin no

# явно разрешаем подключения по ключу
PubkeyAuthentication yes

# отключаем подключения по паролю
PasswordAuthentication no

# отключаем авторизацию с помощью подсистемы PAM
UsePAM no

# опционально, разрешаем подключение только указанным пользователям
AllowUsers ivan
Нажмите, чтобы развернуть и увидеть больше

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

Если что-то настроить неверно, вы можете потерять доступ к своему серверу. Помните, что данная статья носит рекомендательный характер. Все действия вы выполняете на свой страх и риск.

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

Выполним проверку корректности конфигурационного файла специальной командой:

BASH
sudo sshd -t
Нажмите, чтобы развернуть и увидеть больше

Вот пример, если конфиг не прошел проверку:

Система говорит нам, что указан недопустимый параметр на строке 15. Исправим, затем вновь:

BASH
sudo sshd -t
Нажмите, чтобы развернуть и увидеть больше

И если вывод пустой, значит проверка прошла. Перезапускаем сервер SSH:

BASH
sudo systemctl restart sshd
Нажмите, чтобы развернуть и увидеть больше

Если вы везунчик и вас не дропнуло, то теперь, не отключаясь от текущей сессии SSH, откройте новое окно или вкладку терминала и попробуйте подключится к серверу. Не забывайте, что мы изменили порт подключения SSH со стандартного 22 на 27244. Чтобы команде ssh указать другой порт используется ключ -p:

BASH
ssh ivan@192.168.56.102 -p 27244
Нажмите, чтобы развернуть и увидеть больше

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

Закрытие 22-го порта в UFW

Теперь можно смело закрыть 22-й порт в ufw. Чтобы удалить правило, нужно перед командой добавления правила вставить слово delete:

BASH
sudo ufw delete allow 22/tcp

sudo ufw reload

sudo ufw status verbose
Нажмите, чтобы развернуть и увидеть больше

Настройка защиты от брутфорса — fail2ban

Fail2Ban — это инструмент сетевой безопасности для Linux, который автоматически блокирует IP-адреса, совершающие подозрительную активность (например, многократные неудачные попытки входа по SSH). Он анализирует логи (текстовые файлы или journald) и применяет временные или постоянные баны через iptables или nftables.

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

❗Пожалуйста, перед внесением следующих изменений убедитесь, что у вас есть физический доступ к серверу или к его консоли с гипервизора.

Ниже покажу базовую настройку fail2ban для защиты сервера от брутфорс-атак на примере SSH.

Устанавливаем пакет из стандартных репозиториев:

BASH
sudo apt install -y fail2ban
Нажмите, чтобы развернуть и увидеть больше

💡 Основные файлы/директории конфигурации fail2ban:

  • /etc/fail2ban/fail2ban.conf — сновной конфиг демона;
  • /etc/fail2ban/jail.conf — шаблон настроек jail-ов (его мы НЕ ТРОГАЕМ);
  • /etc/fail2ban/jail.local — локальная конфигурация jail-ов (редактировать будем ЕГО);
  • /etc/fail2ban/filter.d/ — шаблоны фильтров (регулярные выражения для логов);
  • /etc/fail2ban/action.d/ — шаблоны действий (что делать при нарушении);

В пакете уже идет набор готовых фильтров для популярных сервисов, таких как sshd, nginx, apache и т.д. (загляните в /etc/fail2ban/filter.d/) и и действий: iptables, nftables, firewall-cmd и т.д. Также никто не запрещает писать собственные фильтры, если вы разбираетесь в регулярках😉.

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

BASH
sudo nvim /etc/fail2ban/jail.local
Нажмите, чтобы развернуть и увидеть больше

⚠️ Не перепутайте с основным конфигом /etc/fail2ban/jail.conf, редактировать который не рекомендуется.

И наполняем:

PLAINTEXT
[DEFAULT]
# исключения для локальных сетей
ignoreip = 127.0.0.0/8 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8
# время блокировки IP (s|m|h)
bantime = 1h
# период за который считаются неудачные попытки
findtime = 10m
# кол-во неудачных попыток до блокировки
maxretry = 5
# используем nftables для бана
banaction = nftables-multiport
# действие по умолчанию
action = %(action_)s

[sshd]
# активируем защиту для ssh
enabled = true
# порт SSH сервера, используется для правил фаервола
port = 27244
# какие читать журанылы (тут может быть путь до текстового файла)
logpath = %(sshd_log)s
# бэкенд для чтения логов - journald
backend = systemd
Нажмите, чтобы развернуть и увидеть больше

☝️Бан-действие фаервола по умолчанию — reject, что подразумевает отправку сообщения об отказе соединения заблокированным адресам. Чтобы не отправлять это уведомление измените действие в параметре banaction на nftables-multiport[blocktype=drop].

Активируем автозапуск сервиса, перезапускаем его и смотрим статус:

BASH
sudo systemctl enable fail2ban

sudo systemctl restart fail2ban

sudo systemctl status fail2ban
Нажмите, чтобы развернуть и увидеть больше

Для просмотра статуса блокировок используйте команды:

BASH
sudo fail2ban-client status

sudo fail2ban-client status sshd
Нажмите, чтобы развернуть и увидеть больше

Теперь на другом устройстве (не на том, на котором настраиваете сервер!), а если на сервере белый IP то и из другой посети, попытайтесь произвести 5 неуадчных попыток подключения по SSH. Пример:

BASH
ssh test@192.168.56.102 -p 27244
Нажмите, чтобы развернуть и увидеть больше

💡Стоит отметить, что банятся также те IP, из под которых пытались неудачно подключиться по приватному ключу. Но по умолчанию при таком подключении не банятся адреса, использующие логины существующих пользователей. Чтобы банить и такие подключения добавьте в секцию [DEFAULT] параметр mode = aggressive. Но будьте осторожны, не заблокируйте сами себя☝️.

Командой ниже можно смотреть статус блокировок sshd в реальном времени:

BASH
sudo watch -n2 fail2ban-client status sshd
Нажмите, чтобы развернуть и увидеть больше

☝️ Команда watch в Linux выполняет запуск переданной в аргументе команды с заданным интервалом, в моем примере 2 сек.

К составе пакета fail2ban также идет утилита проверки регулярных выражений и совпадений по ним записей в журналах. В случае SSH можно посмотреть совпадения так:

BASH
sudo fail2ban-regex systemd-journald /etc/fail2ban/filter.d/sshd.conf
Нажмите, чтобы развернуть и увидеть больше

В Debian 12 в качестве фаервола используется nftables. Посмотрим правила, созданные демоном fail2ban:

BASH
sudo nft list table inet f2b-table
Нажмите, чтобы развернуть и увидеть больше

Чтобы разбанить нужный адрес используйте команду:

BASH
sudo fail2ban-client set sshd unbanip 1.2.3.4
Нажмите, чтобы развернуть и увидеть больше

Список доступных команд ктилиты-клиента с описаниями смотрите на man странице.

Итоговая перезагрузка

После проведения всех проверок, выполняем профилактический перезапуск сервера Debian 12, чтобы убедиться, что мы все настроили корректно:

BASH
sudo reboot
Нажмите, чтобы развернуть и увидеть больше

Через некоторое время пробуем вновь подключится к серверу:

BASH
ssh ivan@192.168.56.102 -p 27244
Нажмите, чтобы развернуть и увидеть больше

Ура, это маленькая победа) Как видим и hostname обновился.

Теперь можно, например, настроить Zshell по моей статье или еще что-нибудь.

Установка и настройка ZSH (опционально)

Если лень читать всю статью целиком, приложу TLDR:

BASH
# установливаем Z-Shell и вспомогательных утилит
sudo apt update && sudo apt install -y zsh fzf git curl

# проверяем все ли установилось в нашу систему
whereis {zsh,fzf,git,curl}

# установливаем Oh-My-Zsh - отвечаем yes
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# устанавливаем плагин zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

# устанавливаем плагин fast-syntax-highlighting
git clone https://github.com/zdharma-continuum/fast-syntax-highlighting ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/fast-syntax-highlighting

# устанавливаем плагин cmdtime
git clone https://github.com/tom-auger/cmdtime ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/cmdtime

# меняем тему на agnoster
sed -i 's/^ZSH_THEME=.*/ZSH_THEME="agnoster"/' ~/.zshrc

# отключаем автообновления Oh-My-Zsh
sed -i "s/^#.*omz:update.*disabled/zstyle ':omz:update' mode disabled/" ~/.zshrc

# активируем установленные плагины
sed -i 's/^plugins=\(.*\)/plugins=\(git zsh-autosuggestions fast-syntax-highlighting fzf cmdtime\)/' ~/.zshrc

# задаем цвета для плагина fzf (это всё одна команда)
echo "export FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS'
        --color=fg:#e5e9f0,bg:#3b4252,hl:#81a1c1
        --color=fg+:#e5e9f0,bg+:#3b4252,hl+:#81a1c1
        --color=info:#eacb8a,prompt:#bf6069,pointer:#b48dac
        --color=marker:#a3be8b,spinner:#b48dac,header:#a3be8b'\n\n\
        $(cat ~/.zshrc)" > ~/.zshrc

# применяем внесенные изменения
source ~/.zshrc

# для минималистичного prompt
echo "prompt_context() [ ]" >> ~/.zshrc && source ~/.zshrc

## настройка Oh-My-Zsh для root пользователя

# копируем файлы нашего пользователя в директорию пользователя root
sudo cp -r {~/.oh-my-zsh,~/.zshrc} /root/

# меняем оболочку по умолчанию у root
sudo chsh -s /usr/bin/zsh

# переключаемся в root для проверки
sudo -s
Нажмите, чтобы развернуть и увидеть больше

Послесловие

Ну вот, мы выполнили начальную базовую настройку Linux сервера Debian 12. В дальнейшем на основе такой конфигурации я буду выполнять установку и настройку различного серверного ПО и, конечно, писать статьи об этом.

Так что подписывайтесь на нашу телегу, чтобы не пропустить новые материалы. Спасибо, что читаете, пингвины (:

Материалы по теме

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/linux/nachalnaya-nastrojka-linux-servera-na-primere-debian/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша