Если SSH перестал пускать и пишет “Connection refused”, это почти всегда значит, что на целевом хосте никто не слушает порт 22 или соединение сознательно отвергается firewall’ом.
Вместо того чтобы «тыкать вслепую», двигайтесь по коротким шагам:
Убедитесь, что OpenSSH‑server установлен и запущен.
Проверьте, что
sshdслушает именно 22/tcp.Убедитесь, что iptables не отдаёт REJECT/DROP для 22/tcp.
Если что‑то ломали в конфиге — сделайте быстрый откат к дефолту и повторите проверку.
OpenSSH‑server не установлен
Проверка
dpkg -l | grep -E '^ii\s+openssh-server' || echo 'openssh-server not installed'
Исправление
sudo apt update && sudo apt install -y openssh-server
sudo systemctl enable --now ssh
Служба SSH не запущена/упала при старте
Проверка
systemctl status ssh --no-pager

ss -tnlp | grep ':22' || echo 'no listener on :22'

Исправление
sudo systemctl restart ssh
# если снова падает — см. логи в разделе «Памятка по логам»
Демон слушает не тот порт
Проверка
ss -tnlp | grep sshd
grep -nE '^(Port|ListenAddress|AddressFamily)\b' /etc/ssh/sshd_config || echo 'defaults in use'

Исправление
# вернуть дефолтный порт и адреса
sudo sed -i 's/^Port .*/Port 22/' /etc/ssh/sshd_config
sudo sed -i '/^ListenAddress/d;/^AddressFamily/d' /etc/ssh/sshd_config
sudo systemctl restart ssh
iptables блокирует 22/tcp (REJECT/RESET даёт «refused»)
Проверка
sudo iptables -S | grep -iE '(REJECT|DROP).*dport 22' || echo 'no explicit block for 22 found'
Исправление
# Разрешить SSH выше по цепочке
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# Удалить явный REJECT для порта 22 (пример — адаптируйте под своё правило)
sudo iptables -D INPUT -p tcp --dport 22 -j REJECT --reject-with tcp-reset 2>/dev/null || true
Конфиг sshd задаёт «узкое» слушание
Проверка
grep -nE '^(ListenAddress|AddressFamily)\b' /etc/ssh/sshd_config || echo 'no constraints'
ss -tnlp | grep ':22' || echo 'no listener on :22'
Исправление (быстро вернуться к дефолту)
sudo sed -i '/^ListenAddress/d;/^AddressFamily/d' /etc/ssh/sshd_config
sudo systemctl restart ssh
Мини‑диагностика с клиента
Проверка (различить RST/timeout и увидеть детали рукопожатия)
ssh -vvv -p 22 user@host |& sed -n '1,60p'
# RST приходит мгновенно (refused), timeout тянется долго (обычно DROP/маршрут)
Памятка по логам (на сервере)
journalctl -u ssh -b --no-pager | tail -n 80
sudo tail -n 80 /var/log/auth.log 2>/dev/null || true
sudo dmesg -T | tail -n 50
Ищите: ошибки ключей, «Missing privilege separation directory: /run/sshd», конфликты порта.
Быстрый rollback к «заводским» настройкам sshd
Проверка
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
Действие
# убрать нестандартные адреса/семейство/порт
sudo sed -i '/^ListenAddress/d;/^AddressFamily/d' /etc/ssh/sshd_config
sudo sed -i 's/^Port .*/Port 22/' /etc/ssh/sshd_config
sudo systemctl restart ssh
Быстрые шаблоны изменений
Разрешить SSH (INPUT)
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
Удалить правило REJECT для 22
sudo iptables -D INPUT -p tcp --dport 22 -j REJECT --reject-with tcp-reset
Сохранить правила (если используется iptables‑persistent)
sudo netfilter-persistent save 2>/dev/null || sudo sh -c 'iptables-save > /etc/iptables/rules.v4'
Итог
Убедитесь, что sshd слушает 22/tcp. 2) Убедитесь, что iptables не шлёт REJECT/DROP для 22. 3) Возврат к дефолту в sshd_config решает большинство конфиг‑ошибок. Дальше — проверка журналов и повторный тест с клиента.