--- title: "Первичная настройка сервера Debian" date: 2026-10-08T19:29:38+04:00 draft: false tags: [server, linux] summary: "Что делать с сервером Debian после покупки. Статья для линуксоидов." --- Обычно, после покупки сервера на почту приходит письмо с IP-адресом и паролем пользователя root. Этого хватает чтобы подключиться к серверу по ssh и начать его настраивать. Всего 3 шага: 1. Обновление системы 2. Настройка ssh 3. Настройка nftables Нулевой шаг - подготовить ключи ssh и конфиг для сервера. Чтобы выпустить ключи выполнить: ``` s0k0l:~$ ssh-keygen Generating public/private ed25519 key pair. Enter file in which to save the key (/~/.ssh/id_ed25519): ``` Предлагается указать путь для ключа. Можно просто ввести желаемое имя ключа и пара будет создана в директории откуда запустили команду. Первый раз можно пропустить и нажать Enter. Второй вопрос про пароль на доступ к ключу. Для ssh ключей от продакшен инфраструктуры лучше поставить. Если нет желания, то щелкаем Enter. После того как хостер поднимет сервер, прокидываем ключ командой ``` s0k0l:~$ ssh-copy-id root@ /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 3 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@'s password: ``` Введите пароль и должно появиться сообщение об успехе с предложением выполнить подключение к серверу, что и нужно сделать. Но сначала добавьте в файл `~/.ssh/config` новую конфигурацию: ``` Host HostName Port 22 IdentityFile ~/.ssh/id_ed25519 ``` Теперь можно подключаться по имени ``` ssh ``` На сервере первым делом запускаем обновление: ``` apt update && apt dist-upgrade -y && reboot ``` Это выполнит обновление всей системы и отправит систему в перезагрузку. Ждите примерно 5 минут и можно пробовать подключиться назад. Теперь нужно настроить ssh, чтобы никто больше не мог подключиться к серверу по стандартному порту и использовать пароль для входа. Это самое важное. Открываем на редактирование файл `/etc/ssh/sshd_config` и ищем в нем параметры указывающие на адрес прослушивания и порт. ``` Port 5872 AddressFamily inet ListenAddress #ListenAddress :: ``` Ставим такие настройки, чтобы строго определить каким путем можно подключаться к серверу. У нас на руках ipv4 адрес, так что можно строго указать его в конфиге. А порт нужно поменять на рандомный в диапазоне от 1024 до 65535. Чтобы проверить какие порты не заняты выполните команду: ``` ss -tlnup ``` Если желаемого порта в выводе нет, то он свободен. Далее ищем в конфиге ssh следующее: ``` PermitRootLogin prohibit-password PubkeyAuthentication yes PasswordAuthentication no ``` Эти настройки отключат авторизацию по паролю на ssh для всех пользователей включая root (PermitRootLogin). После сохранения конфига нужно перезапустить сервис ssh. Оставайтесь в сессии пока не подключитесь параллельно. ``` systemctl restart ssh ``` Откройте соседний терминал, в конфиге поправьте порт `~/.ssh/config` и подключитесь к серверу. Если подключение прошло, то первый терминал можно закрыть. SSH готов. Последний шаг - настройка nftables. Это стандартный фаервол в Debian, iptables уже не нужен. Правила живут в одном файле `/etc/nftables.conf`. Принцип строгого конфига простой: все входящее запрещено, разрешаем только то, что реально нужно. Исходящее оставляем открытым, иначе сломаются обновления и DNS. Открываем `/etc/nftables.conf` и заменяем содержимое целиком: ``` #!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; policy drop; # уже установленные соединения пропускаем, мусор режем ct state established,related accept ct state invalid drop # локальный интерфейс iif lo accept # ping, но не больше 5 в секунду ip protocol icmp icmp type echo-request limit rate 5/second accept ip protocol icmp accept meta l4proto ipv6-icmp accept # ssh на нашем порту, не больше 10 новых подключений в минуту с одного ip tcp dport 5872 ct state new meter ssh_limit { ip saddr limit rate 10/minute } accept # раскомментировать, если на сервере будет сайт # tcp dport { 80, 443 } accept } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } } ``` Порт `5872` поменяйте на тот, что указали в `sshd_config`. Это самое важное место в конфиге, ошибка в нем закроет вам доступ к серверу. Сначала проверяем конфиг на ошибки, ничего не применяя: ``` nft -c -f /etc/nftables.conf ``` Если команда ничего не вывела, синтаксис в порядке. Теперь страховка на случай, если все таки закроем себе доступ. Запускаем таймер, который через 2 минуты сбросит все правила: ``` (sleep 120 && nft flush ruleset) & ``` И применяем конфиг: ``` nft -f /etc/nftables.conf ``` Дальше как с ssh, открываем соседний терминал и подключаемся. Если зашли, значит все хорошо, отменяем таймер: ``` kill %1 ``` Если не зашли, просто ждем 2 минуты, правила сбросятся сами и можно спокойно искать ошибку. Посмотреть что сейчас реально применено можно командой: ``` nft list ruleset ``` Осталось включить автозагрузку правил, иначе после перезагрузки сервер окажется без фаервола: ``` systemctl enable --now nftables ``` Если на сервере будет Docker, то учтите, что он пишет свои правила и может открыть порты контейнеров в обход вашего конфига. Это тема для отдельной статьи. На этом все. Сервер обновлен, ssh пускает только по ключу и на нестандартном порту, а фаервол закрывает все, что мы явно не разрешили. С этого уже можно начинать ставить свои сервисы. Дисклеймер: прикол с таймером нужен, потому что firewall может оборвать даже уже установленное соединение. В конфиге из пример есть строчка `ct state established,related accept`, что означает "разрешать подключения, которые уже установлены". Т.е. по идее разрыва не должно быть.