Урок 7. SSH и брандмауэр: nftables и ufw
SSH — способ управлять компьютером через сеть: команды набираются у вас, а выполняются на сервере. Соединение зашифровано. Брандмауэр (фаервол) решает, какие подключения к компьютеру пропускать. Вместе они — основа любого сервера: SSH для работы, брандмауэр — чтобы снаружи было доступно только нужное.
Сервер SSH
Если при установке отметили «SSH server», сервер уже работает. Если нет — поставьте его:
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 на сервере):
ssh ivan@192.168.1.20При первом подключении SSH покажет отпечаток ключа сервера и спросит, доверять ли ему, — ответьте yes. Дальше — пароль пользователя на сервере. Выход — exit.
Почему root не пускают по паролю
Если при установке задали пароль root, первое желание — войти ssh root@…. Сервер ответит Permission denied даже на верный пароль. Так задумано: настройка по умолчанию PermitRootLogin prohibit-password пускает root только по ключу, а пароли root первыми подбирают боты.
Правильный путь — войти своим пользователем и уже на сервере стать root:
ssh ivan@192.168.1.20
su -Или sudo, если он настроен (урок Первые шаги: root, su и sudo). Как всё же открыть вход root — в справке Как включить SSH в Debian.
Вход по ключу
Ключ надёжнее пароля: подобрать его практически невозможно. Это пара файлов — закрытый остаётся на вашем компьютере, открытый кладётся на сервер. Создайте пару у себя (не на сервере) и отправьте открытую часть:
ssh-keygen -t ed25519
ssh-copy-id ivan@192.168.1.20ssh-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 создаст его при сохранении:
sudo nano /etc/ssh/sshd_config.d/10-no-password.confС одной строкой:
PasswordAuthentication noПроверка настроек и перезапуск:
sudo sshd -t
sudo systemctl restart sshНе закрывайте текущее соединение, пока не проверили вход по ключу из второго окна терминала. Если ключ не подошёл, а пароль уже выключен, на сервер можно будет попасть только с его клавиатуры или через консоль хостинга.
Брандмауэр: что есть в Debian
После установки в Debian нет ни одного правила брандмауэра: всё, что слушает какая-нибудь программа, доступно из сети. Закрыть лишнее можно двумя способами — выберите один.
Не включайте nftables и ufw одновременно. Файл /etc/nftables.conf начинается с flush ruleset — при запуске службы nftables он стирает все правила, в том числе правила ufw.
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 уберите, если сайта нет.
Проверьте файл (команда ничего не меняет) и включите службу:
sudo nft -c -f /etc/nftables.conf
sudo systemctl enable --now nftables
sudo nft list rulesetnft -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
Простая надстройка над брандмауэром ядра. Ставится отдельным пакетом:
sudo apt install ufw
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status verboseufw allow OpenSSH открывает порт SSH по имени (такой профиль ставит пакет openssh-server), ufw enable включает брандмауэр — входящее закрыто, кроме разрешённого. Другие порты: sudo ufw allow 80/tcp, удалить правило — sudo ufw delete allow 80/tcp. Подробнее о командах ufw — в курсе Ubuntu: там они те же.
Коротко
- Сервер SSH — пакет
openssh-server, службаssh; подключение —ssh пользователь@адрес. - Root по паролю через SSH не пускается (
PermitRootLogin prohibit-password) — входите своим пользователем. - Ключ:
ssh-keygen -t ed25519у себя,ssh-copy-idна сервер; пароль выключают после проверки ключа. - В Debian правил брандмауэра по умолчанию нет; выбор — nftables (файл
/etc/nftables.conf) или ufw. - Перед включением брандмауэра — правило для SSH и проверка из второго окна.