Смена SSH-порта и port knocking: прячем вход на сервер
22-й порт сканируют боты круглосуточно — тысячи попыток входа в день забивают логи и создают риск. Смена порта убирает 99% автоматического шума, а port knocking делает SSH невидимым: порт закрыт, пока вы не «постучите» правильной последовательностью. Настроим оба уровня.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Шаг 1: меняем порт SSH
Смена порта — не панацея, но она отсекает ботов, которые бьют только по 22. Редактируем конфиг демона:
nano /etc/ssh/sshd_config
Находим строку Port и ставим нестандартное значение выше 1024 (например, 2222 или что-то менее очевидное — 49222):
Port 49222
PermitRootLogin prohibit-password
PasswordAuthentication no
MaxAuthTries 3
Важно: перед перезапуском откройте новый порт в фаерволе, иначе заблокируете себя.
ufw allow 49222/tcp
systemctl restart sshd
# НЕ закрывайте текущую сессию, пока не проверите вход в новую:
ssh -p 49222 user@server_ip
PermitRootLogin prohibit-password запрещает вход root по паролю, но оставляет ключи — удобно для автоматизации. PasswordAuthentication no убивает саму возможность брутфорса: боту нечего перебирать, если пароли не принимаются в принципе. MaxAuthTries 3 обрывает соединение после трёх неудач, экономя ресурсы демона.
Проверьте, что конфиг синтаксически корректен, до перезапуска — так вы не уроните SSH в неработающее состояние:
sshd -t && echo 'config OK'
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS с защищённым SSHSELinux и systemd-socket нюансы
На системах с systemd (Ubuntu 22.10+, некоторые сборки) SSH может слушать через сокет-активацию, и Port в sshd_config игнорируется. Проверьте:
systemctl status ssh.socket
Если сокет активен — правьте порт в нём: systemctl edit ssh.socket и добавьте секцию с ListenStream=49222, затем systemctl daemon-reload && systemctl restart ssh.socket.
На CentOS/RHEL с SELinux нужно разрешить новый порт для типа ssh_port_t:
semanage port -a -t ssh_port_t -p tcp 49222
Шаг 2: port knocking через knockd
Port knocking полностью прячет SSH: порт закрыт фаерволом, но при получении «стука» — последовательности пакетов на заданные порты — сервер на время открывает SSH только вашему IP.
apt update && apt install -y knockd
Настраиваем /etc/knockd.conf:
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 49222 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 10
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 49222 -j ACCEPT
tcpflags = syn
Порт SSH по умолчанию держим закрытым в фаерволе. Включаем демон:
systemctl enable --now knockd
Стучимся с клиента
С вашей машины отправляем последовательность и подключаемся. Утилита knock идёт в пакете knockd:
knock -v server_ip 7000 8000 9000
ssh -p 49222 user@server_ip
# закрыть порт обратно:
knock -v server_ip 9000 8000 7000
Без knock можно и вручную через nc: for p in 7000 8000 9000; do nmap -Pn --max-retries 0 -p $p server_ip; done — но проще завернуть последовательность в alias или ~/.ssh/config через ProxyCommand.
Смысл в том, что при сканировании порт SSH выглядит закрытым (filtered) для всех, кроме того, кто знает секретную последовательность. Массовые сканеры вроде masscan просто не видят открытого 22 или 49222 и уходят дальше. Это не защита от целевой атаки, но обычный фоновый шум исчезает полностью — в логах становится тихо.
Частая ошибка: оставить основной порт SSH открытым в фаерволе параллельно с knockd. Тогда knocking бессмысленен — порт и так доступен. Правило по умолчанию должно быть DROP для порта SSH, а knockd временно добавляет ACCEPT для конкретного IP.Ключи вместо паролей — обязательно
Смена порта и knocking не заменяют ключевую аутентификацию. Генерируем ed25519 и заливаем на сервер:
ssh-keygen -t ed25519 -a 100
ssh-copy-id -p 49222 user@server_ip
После этого PasswordAuthentication no (мы уже поставили) закрывает брутфорс полностью. На VPS от MAATRIX с root-доступом всё это настраивается за 15 минут: AMD EPYC + NVMe в локациях UK, США и РФ, оплата картой РФ, СБП или криптой. Быстрый сервер под контролем — идеальная площадка, чтобы поднять защищённый плацдарм для остальных сервисов.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS с защищённым SSHОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Смена порта реально защищает?
От целевой атаки — слабо, но она убирает ~99% автоматического бот-трафика и разгружает логи. Работает как первый слой в связке с ключами и knocking.
Не заблокирую ли я себя port knocking'ом?
Риск есть. Всегда держите открытой вторую SSH-сессию при настройке и добавьте резервное правило доступа с вашего статического IP.
Knockd безопасен на проде?
Для критичных систем лучше single-packet authorization (fwknop) — он устойчив к перехвату последовательности. Knockd — простой и достаточный для личного VPS.