Полное руководство по безопасной настройке SSH на Debian 13: миграция порта, аутентификация по ключа
В этом подробном руководстве мы рассмотрим комплексную настройку безопасности SSH-сервера на Debian-подобных системах (включая Debian 13). Особое внимание уделим безопасному внесению изменений без риска нарушения работоспособности существующих сервисов и точному определению текущей конфигурации фаервола.
? Шаг 0: Точное определение активного фаервола — основа безопасной настройки
Почему это критически важно?
В современных Debian-системах могут одновременно сосуществовать несколько систем фильтрации трафика (nftables, iptables, UFW), но активной управляет только одна. Неправильное определение может привести к:
- Добавлению правил в неработающую систему
- Конфликту правил между разными фаерволами
- Полной или частичной потере сетевой доступности
Методика точного определения
Выполните последовательно эти команды для определения реально активной системы управления фаерволом:
☯
Terminal:
⌕
≡
✕
# 1. Проверяем, запущена ли служба nftables (управляет /etc/nftables.conf) systemctl is-active nftables && echo "✅ nftables активен (управляет через /etc/nftables.conf)" # 2. Проверяем, работает ли UFW - проверяем СТАТУС, а не только активность службы sudo ufw status verbose # 3. Проверяем, используется ли iptables-persistent (сохранённые iptables-правила) systemctl is-active netfilter-persistent && echo "✅ iptables-persistent активен (управляет iptables-правилами)"
Анализ результатов на реальном примере
Допустим, вы получаете такой вывод:
☯
Terminal:
⌕
≡
✕
inactive Status: inactive ✅ iptables-persistent активен (управляет iptables-правилами)
Что это означает:
nftablesнеактивен — служба nftables не запущена, правила nftables (если они есть) созданы другими сервисами или вручную.UFW отключен (inactive)— Uncomplicated Firewall установлен, но не включен. Служба UFW может быть запущена (systemctl status ufwможет показыватьactive (exited)), но сам фаервол UFW выключен командойufw disable.iptables-persistent активен— эта служба сохраняет правила iptables между перезагрузками и в вашем случае является основной системой управления фаерволом.
Важный нюанс: Обратите внимание, что systemctl is-active ufw может показывать "active", даже если UFW выключен (Status: inactive). Это происходит потому, что служба systemd для UFW запускается при загрузке, но сам фаервол может быть отключен. Поэтому команда sudo ufw status verbose — единственный надежный способ проверить, включен ли UFW.
? Шаг 1: Отключаем ответы на ping (ICMP echo)
Отключение ICMP echo-ответов снижает заметность сервера при автоматических сетевых сканированиях, не влияя на функциональность.
Временное отключение (до перезагрузки):
☯
Terminal:
⌕
≡
✕
sudo sysctl -w net.ipv4.icmp_echo_ignore_all=1
Постоянное отключение:
☯
Terminal:
⌕
≡
✕
echo "net.ipv4.icmp_echo_ignore_all = 1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
Проверка: Выполните ping ваш_сервер с другого компьютера — должны получить "Request timed out".
? Шаг 2: Добавляем правило для порта 10022 в активный фаервол
На основании определенного активного фаервола выбираем соответствующую ветку действий:
Ветка A: Если активен iptables-persistent (ваш случай)
Поскольку в примере выше показано, что iptables-persistent активен, используем именно его:
☯
Terminal:
⌕
≡
✕
# Проверяем текущие правила iptables sudo iptables -L -n --line-numbers # Добавляем правило для порта 10022 sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT # Проверяем добавленное правило sudo iptables -L -n | grep 10022 # Сохраняем правила для автоматической загрузки после перезагрузки sudo netfilter-persistent save # Альтернативный способ сохранения (если netfilter-persistent не работает): # sudo iptables-save | sudo tee /etc/iptables/rules.v4
Важно: iptables-persistent автоматически загружает сохраненные правила при загрузке системы из файлов /etc/iptables/rules.v4 и /etc/iptables/rules.v6.
Ветка B: Если активен UFW (Status: active)
Если бы sudo ufw status verbose показал "Status: active":
☯
Terminal:
⌕
≡
✕
# Добавляем правило для порта 10022 sudo ufw allow 10022/tcp # Проверяем добавленное правило sudo ufw status numbered | grep 10022 # UFW автоматически сохраняет правила между перезагрузками
Ветка C: Если активен nftables
Если бы systemctl is-active nftables показал "active":
☯
Terminal:
⌕
≡
✕
# Временное правило sudo nft add rule ip filter input tcp dport 10022 accept # Постоянное правило (через конфигурационный файл) sudo nano /etc/nftables.conf
В файле найдите цепочку input и добавьте:
☯
Terminal:
⌕
≡
✕
chain INPUT {
type filter hook input priority filter; policy accept;
# ... существующие правила
tcp dport 10022 accept # Добавленная строка
}Примените: sudo nft -f /etc/nftables.conf
Ветка D: Если все системы неактивны (ручное управление)
Если все три проверки показали неактивное состояние:
☯
Terminal:
⌕
≡
✕
# Проверяем существующие правила через оба интерфейса sudo nft list ruleset 2>/dev/null sudo iptables -L -n # Определяем, какая система используется (обычно nftables в Debian 12+) # Добавляем временное правило sudo nft add rule ip filter input tcp dport 10022 accept # Для сохранения после перезагрузки создаем скрипт: sudo nano /etc/network/if-pre-up.d/firewall-custom
Содержимое файла:
☯
Terminal:
⌕
≡
✕
#!/bin/bash nft add rule ip filter input tcp dport 10022 accept
Даем права: sudo chmod +x /etc/network/if-pre-up.d/firewall-custom
? Шаг 3: Меняем порт SSH на 10022 с резервированием
Безопасный подход: Добавляем новый порт параллельно со старым, тестируем, и только потом убираем старый.
- Редактируем конфигурацию SSH:
☯
Terminal:
⌕
≡
✕
sudo nano /etc/ssh/sshd_config
- Добавляем новый порт (можно указать несколько портов на отдельных строках):
☯
Terminal:
⌕
≡
✕
# Старый порт (оставляем для подстраховки) Port 22 # Новый порт Port 10022
Важно: Формат Port 22,10022 (через запятую) не поддерживается и вызовет ошибку.
- Проверяем синтаксис и применяем:
☯
Terminal:
⌕
≡
✕
sudo sshd -t && sudo systemctl reload ssh
- Проверяем, что sshd слушает оба порта:
☯
Terminal:
⌕
≡
✕
sudo ss -tlnp | grep sshd
Ожидаемый вывод:
☯
Terminal:
⌕
≡
✕
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 0.0.0.0:10022 0.0.0.0:* users:(("sshd",pid=1234,fd=4))? Шаг 4: Настраиваем вход только по SSH-ключу
Часть A: Подготовка на клиенте
- Генерация ключа (на вашем локальном компьютере):
☯
Terminal:
⌕
≡
✕
ssh-keygen -t ed25519 -a 100 -C "ваш_комментарий"
Для совместимости со старыми системами:
☯
Terminal:
⌕
≡
✕
ssh-keygen -t rsa -b 4096 -a 100 -C "ваш_комментарий"
- Копирование ключа на сервер (пока через порт 22):
☯
Terminal:
⌕
≡
✕
ssh-copy-id -p 22 ваш_пользователь@ваш_сервер
Часть B: Настройка прав на сервере
Неправильные права — частая причина проблем с аутентификацией по ключам:
☯
Terminal:
⌕
≡
✕
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chown ваш_пользователь:ваша_группа ~/.ssh/authorized_keys
Часть C: Конфигурация sshd
- Редактируем конфигурацию:
☯
Terminal:
⌕
≡
✕
sudo nano /etc/ssh/sshd_config
- Устанавливаем параметры безопасности:
☯
Terminal:
⌕
≡
✕
# Основные настройки аутентификации PubkeyAuthentication yes PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no # Если не используете PAM-модули # Настройки root-доступа (по вашему требованию) PermitRootLogin prohibit-password # Разрешает root по ключу # Дополнительные ограничения MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2 LoginGraceTime 60 AllowUsers ваш_пользователь # Ограничение по пользователям (опционально)
- Проверяем и применяем:
☯
Terminal:
⌕
≡
✕
sudo sshd -t && sudo systemctl reload ssh
Часть D: Тестирование
- Подключение по новому порту с ключом:
☯
Terminal:
⌕
≡
✕
ssh -p 10022 ваш_пользователь@ваш_сервер
Должно подключиться без запроса пароля.
- Проверка отключения паролей:
☯
Terminal:
⌕
≡
✕
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no \
-p 10022 ваш_пользователь@ваш_серверДолжен получить немедленный отказ с сообщением "Permission denied".
?️ Шаг 5: Установка и настройка fail2ban
Что такое fail2ban и как он работает?
Fail2ban — это система интеллектуальной защиты от брутфорс-атак, которая:
- Мониторит логи сервисов (SSH, веб-серверы, FTP и др.)
- Анализирует шаблоны неудачных попыток аутентификации
- Добавляет временные блокировки в фаервол для IP-адресов нарушителей
- Автоматически разблокирует IP после истечения заданного времени
Важно: В вашем случае fail2ban будет работать с iptables, так как именно он активен.
Установка и настройка для порта 10022:
- Установка:
☯
Terminal:
⌕
≡
✕
sudo apt update sudo apt install fail2ban -y
- Создание конфигурации:
☯
Terminal:
⌕
≡
✕
sudo nano /etc/fail2ban/jail.local
- Конфигурация для SSH на порту 10022:
☯
Terminal:
⌕
≡
✕
[DEFAULT] # Глобальные настройки bantime = 1h findtime = 10m maxretry = 3 backend = systemd # Используем systemd как бэкенд для логов [sshd] enabled = true port = 10022 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 24h [sshd-ddos] enabled = true port = 10022 filter = sshd-ddos logpath = /var/log/auth.log maxretry = 5 bantime = 10m findtime = 10m
Пояснение параметров:
port = 10022— мониторим именно новый портmaxretry = 3— 3 неудачные попытки до блокировкиbantime = 24h— блокировка на 24 часа для стандартных атакfindtime = 10m— окно времени для подсчета попыток
- Запуск и проверка:
☯
Terminal:
⌕
≡
✕
sudo systemctl enable --now fail2ban sudo fail2ban-client status sshd
- Проверка логов fail2ban:
☯
Terminal:
⌕
≡
✕
sudo tail -f /var/log/fail2ban.log
✅ Шаг 6: Финальная оптимизация и проверка
После успешного тестирования:
- Удаляем старый порт 22 из SSH-конфигурации:
☯
Terminal:
⌕
≡
✕
sudo nano /etc/ssh/sshd_config
Удалите строку Port 22 и оставьте только Port 10022.
- Обновляем конфигурацию:
☯
Terminal:
⌕
≡
✕
sudo sshd -t && sudo systemctl reload ssh
- Проверяем итоговую конфигурацию:
☯
Terminal:
⌕
≡
✕
# Проверяем прослушиваемые порты sudo ss -tlnp | grep sshd # Проверяем правила iptables для порта 10022 sudo iptables -L -n | grep 10022 # Проверяем сохраненные правила sudo iptables-save | grep 10022 # Проверяем fail2ban sudo fail2ban-client status sshd # Проверяем подключение ssh -p 10022 -o ConnectTimeout=5 ваш_пользователь@ваш_сервер echo "Успех!"
- Опционально удаляем правило для порта 22 из iptables:
☯
Terminal:
⌕
≡
✕
# Находим номер правила для порта 22 sudo iptables -L INPUT -n --line-numbers | grep "dpt:22" # Удаляем правило (замените X на номер правила) sudo iptables -D INPUT X # Сохраняем изменения sudo netfilter-persistent save
? Сводная таблица действий
| Этап | Действие | Команда/Файл | Проверка |
| 0 | Определение фаервола | systemctl is-active + ufw status | Выбор iptables-persistent |
| 1 | Отключение ping | /etc/sysctl.conf | ping сервер |
| 2 | Открытие порта 10022 | iptables -A INPUT -p tcp --dport 10022 -j ACCEPT | iptables -L -n | grep 10022 |
| 3 | Смена порта SSH | /etc/ssh/sshd_config | ss -tlnp | grep sshd |
| 4 | Настройка ключей | ~/.ssh/authorized_keys | Подключение без пароля |
| 5 | Установка fail2ban | /etc/fail2ban/jail.local | fail2ban-client status |
| 6 | Финальная проверка | Все конфиги | Полный тест подключения |
? Критически важные предупреждения
- Всегда имейте резервный доступ — консоль через панель хостинга (VNC, IPMI, KVM) до завершения всех настроек.
- Не удаляйте порт 22 до полной проверки работы через порт 10022.
- Сохраняйте резервные копии перед изменениями:
☯
Terminal:
⌕
≡
✕
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup sudo iptables-save > ~/iptables-backup-$(date +%Y%m%d).rules
- Тестируйте в двух окнах терминала — одно для внесения изменений, второе для проверки подключения.
- Для iptables-persistent особо важно — после каждого изменения правил выполняйте
sudo netfilter-persistent save.
? Заключение
Вы выполнили комплексную настройку безопасности SSH-сервера, включающую:
- Точную диагностику текущей конфигурации фаервола с правильным определением активного iptables-persistent
- Безопасное добавление правил в iptables с сохранением через netfilter-persistent
- Миграцию на нестандартный порт для снижения внимания ботов
- Принудительную аутентификацию по ключам для исключения брутфорса
- Установку автоматической защиты через fail2ban, интегрированную с iptables
Ключевое преимущество данного подхода: все изменения внесены с учетом реальной конфигурации вашей системы, где iptables-persistent является основной системой управления фаерволом. Мы сохранили совместимость с существующими правилами и обеспечили сохранение настроек между перезагрузками.
Теперь ваш сервер защищен от большинства автоматизированных атак и готов к безопасной эксплуатации в production-среде.
-
Создано 20.01.2026 15:15:06
-
Roman Aleksandrovich Sakhno

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.