Глиф Учебники

Урок 7. SSH и брандмауэр: nftables и ufw

Курс «Debian» · урок 7 из 8 · 5 минут чтения

SSH — способ управлять компьютером через сеть: команды набираются у вас, а выполняются на сервере. Соединение зашифровано. Брандмауэр (фаервол) решает, какие подключения к компьютеру пропускать. Вместе они — основа любого сервера: SSH для работы, брандмауэр — чтобы снаружи было доступно только нужное.

Сервер SSH

Если при установке отметили «SSH server», сервер уже работает. Если нет — поставьте его:

Bash
sudo apt update
sudo apt install openssh-server
systemctl status ssh

Служба называется ssh, в Debian она запускается сразу после установки и включена в автозагрузку. В ответе status должно быть active (running). Порт SSH — 22; что он ждёт подключений, видно в выводе sudo ss -tln (строка с :22).

Подключение

Клиент SSH есть в Linux, macOS и Windows 10/11 (в PowerShell). Нужны имя пользователя на сервере и его адрес (ip -br a на сервере):

Bash
ssh ivan@192.168.1.20

При первом подключении SSH покажет отпечаток ключа сервера и спросит, доверять ли ему, — ответьте yes. Дальше — пароль пользователя на сервере. Выход — exit.

Почему root не пускают по паролю

Если при установке задали пароль root, первое желание — войти ssh root@…. Сервер ответит Permission denied даже на верный пароль. Так задумано: настройка по умолчанию PermitRootLogin prohibit-password пускает root только по ключу, а пароли root первыми подбирают боты.

Правильный путь — войти своим пользователем и уже на сервере стать root:

Bash
ssh ivan@192.168.1.20
su -

Или sudo, если он настроен (урок Первые шаги: root, su и sudo). Как всё же открыть вход root — в справке Как включить SSH в Debian.

Ваш компьютер ssh root@192.168.1.20 и верный пароль root ssh ivan@192.168.1.20 и пароль ivan Сервер Debian служба ssh, порт 22 PermitRootLogin prohibit-password root — по ключу ivan — и по паролю Permission denied хотя пароль верный ivan@debian:~$ su - и пароль root root@debian:~#
Сервер с настройкой PermitRootLogin prohibit-password отвечает Permission denied на вход root по паролю, а ivan входит по паролю и уже на сервере становится root через su -.

Вход по ключу

Ключ надёжнее пароля: подобрать его практически невозможно. Это пара файлов — закрытый остаётся на вашем компьютере, открытый кладётся на сервер. Создайте пару у себя (не на сервере) и отправьте открытую часть:

Bash
ssh-keygen -t ed25519
ssh-copy-id ivan@192.168.1.20

ssh-keygen предложит место для файла (Enter — по умолчанию) и фразу-пароль для защиты ключа. ssh-copy-id допишет открытый ключ в ~/.ssh/authorized_keys на сервере. В Windows этой команды нет: откройте файл C:\Users\<имя>\.ssh\id_ed25519.pub (вместо <имя> — ваше имя пользователя Windows) и допишите его единственную строку в ~/.ssh/authorized_keys на сервере (права: chmod 700 ~/.ssh и chmod 600 ~/.ssh/authorized_keys).

Когда вход по ключу работает, вход по паролю можно выключить. Свои настройки сервера SSH кладут отдельным файлом в /etc/ssh/sshd_config.d/ — эту папку подключает строка Include в начале /etc/ssh/sshd_config (в Debian 11 и новее она есть; как проверить и что делать без неё — в справке Как включить SSH в Debian). Файла ещё нет — nano создаст его при сохранении:

Bash
sudo nano /etc/ssh/sshd_config.d/10-no-password.conf

С одной строкой:

Настройки
PasswordAuthentication no

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

Bash
sudo sshd -t
sudo systemctl restart ssh

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

Брандмауэр: что есть в Debian

После установки в Debian нет ни одного правила брандмауэра: всё, что слушает какая-нибудь программа, доступно из сети. Закрыть лишнее можно двумя способами — выберите один.

Не включайте nftables и ufw одновременно. Файл /etc/nftables.conf начинается с flush ruleset — при запуске службы nftables он стирает все правила, в том числе правила ufw.

Правила в ядре до запуска nftables правила ufw правила Docker запуск службы nftables flush ruleset первая строка файла: стирает все правила Правила в ядре после запуска правила ufw правила Docker /etc/nftables.conf Включайте что-то одно: nftables или ufw на сервере с Docker после nftables: sudo systemctl restart docker
При запуске службы nftables строка flush ruleset стирает все правила в ядре, в том числе правила ufw и Docker, и остаются только правила из /etc/nftables.conf.

nftablesвстроенный брандмауэр ядра

Пакет уже стоит, но служба выключена. Правила — в файле /etc/nftables.conf. Откройте его (sudo nano /etc/nftables.conf) и замените содержимое таким набором: входящие подключения закрыты, кроме ответов на ваши собственные запросы, ping, SSH и сайта (порты 80 и 443):

Текст
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority filter; policy drop;

        iif lo accept
        ct state established,related accept
        ct state invalid drop

        meta l4proto icmp accept
        meta l4proto ipv6-icmp accept

        tcp dport 22 accept
        tcp dport { 80, 443 } accept
    }
}
  • policy drop — всё, что не разрешено строками ниже, отбрасывается;
  • iif lo accept — пропускать подключения компьютера к самому себе;
  • ct state established,related accept — пропускать ответы на соединения, которые начал сам компьютер;
  • tcp dport 22 accept — открыть SSH; строку с 80 и 443 уберите, если сайта нет.
chain input правила — сверху вниз ответ на свой запрос SSH порт 22 порт 3306 не разрешён iif lo accept ct state established,related accept ct state invalid drop meta l4proto icmp accept meta l4proto ipv6-icmp accept tcp dport 22 accept tcp dport { 80, 443 } accept policy drop — всё, что не разрешено правилами выше
Входящий пакет проверяется правилами цепочки input сверху вниз: ответ проходит по established, SSH — по tcp dport 22, а подключение к порту 3306 отбрасывает policy drop.

Проверьте файл (команда ничего не меняет) и включите службу:

Bash
sudo nft -c -f /etc/nftables.conf
sudo systemctl enable --now nftables
sudo nft list ruleset

nft -c ничего не выводит, если ошибок нет. Последняя команда показывает действующие правила. После правки файла правила применяет sudo systemctl reload nftables.

Строка tcp dport 22 accept обязательна, если вы работаете по SSH: без неё новые подключения перестанут проходить. После включения проверьте вход из второго окна терминала, не закрывая первое.

Docker добавляет в nftables свои правила, и flush ruleset их стирает. На сервере с Docker после перезапуска nftables перезапустите и Docker (sudo systemctl restart docker). Порты контейнеров, опубликованные через -p, цепочка input не закрывает.

Дальше: «Коротко»

ufwкороткие команды, как в Ubuntu

Простая надстройка над брандмауэром ядра. Ставится отдельным пакетом:

Bash
sudo apt install ufw
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status verbose

ufw allow OpenSSH открывает порт SSH по имени (такой профиль ставит пакет openssh-server), ufw enable включает брандмауэр — входящее закрыто, кроме разрешённого. Другие порты: sudo ufw allow 80/tcp, удалить правило — sudo ufw delete allow 80/tcp. Подробнее о командах ufw — в курсе Ubuntu: там они те же.

Коротко

Проверьте себя

1. При установке задан пароль root, но ssh root@сервер отвечает Permission denied. Почему?
2. Что делает policy drop в цепочке input?
3. Почему нельзя включать службу nftables вместе с ufw?
4. Какой командой проверить файл правил nftables, ничего не меняя?