opened image

SSH Connection Refused Ubuntu/Debian - Решение

Если SSH перестал пускать и пишет “Connection refused”, это почти всегда значит, что на целевом хосте никто не слушает порт 22 или соединение сознательно отвергается firewall’ом.

 

Вместо того чтобы «тыкать вслепую», двигайтесь по коротким шагам:

  1. Убедитесь, что OpenSSH‑server установлен и запущен.

  2. Проверьте, что sshd слушает именно 22/tcp.

  3. Убедитесь, что iptables не отдаёт REJECT/DROP для 22/tcp.

  4. Если что‑то ломали в конфиге — сделайте быстрый откат к дефолту и повторите проверку.

 

 

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 решает большинство конфиг‑ошибок. Дальше — проверка журналов и повторный тест с клиента.