- Вопрос или проблема
- Ответ или решение
- Почему возникает ошибка SSH "Connection refused": подробный анализ и решение проблемы
- 1. Причины возникновения ошибки
- 2. Диагностика
- Проверка работы SSH-демона
- Проверка конфигурации
- Проверка сетевых подключений
- Проверка настроек брандмауэра
- 3. Устранение проблемы
- 4. Возможные дополнительные причины
- Заключение
Вопрос или проблема
Привет, у меня проблема с ssh, который волшебным образом перестал работать, и я не могу понять, почему. Сообщение, которое он выдает:
ssh: connect to host <host> port 22: Connection refused
Я не вижу никаких сообщений об ошибках, когда пишу dmesg
, но от telnet localhost 22
я получаю следующее:
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Я попробовал решения, которые видел в некоторых аналогичных случаях [1] и [2], но это все еще не решило мою проблему. Входные данные и выводы следующие:
>> sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
>> sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Обратите внимание, что это уже было ACCEPT, у меня не было никаких проблем даже до ввода команды sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
. Я также пытался перезапустить ssh, но это ничего не изменило.
>>netstat -a | egrep 'Proto|LISTEN'
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:20128 *:* LISTEN
tcp 0 0 localhost:17600 *:* LISTEN
tcp 0 0 localhost:20129 *:* LISTEN
tcp 0 0 localhost:17603 *:* LISTEN
tcp 0 0 localhost:21128 *:* LISTEN
tcp 0 0 deathstar:domain *:* LISTEN
tcp 0 0 localhost:ipp *:* LISTEN
tcp 0 0 *:db-lsp *:* LISTEN
tcp6 0 0 ip6-localhost:ipp [::]:* LISTEN
tcp6 0 0 [::]:db-lsp [::]:* LISTEN
Я не знаю, что еще попробовать, надеюсь, что этого достаточно для решения проблемы.
Остальное добавлено после комментария @Ashu
sudo lsof -i | grep ssh
ничего не произошло
>>netstat -l --numeric-ports | grep 22
unix 2 [ ACC ] STREAM LISTENING 1618183 @jack-com.canonical.Unity.Master.Scope.files.T1731348652205882
>>sudo iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Изменено после комментария @TheSchwa
>>ps aux | grep sshd
jack 3711 0.0 0.0 15944 2220 pts/26 S+ 14:08 0:00 grep --color=auto sshd
Сначала я попробовал удалить и переустановить ssh, но это не сработало, затем я попробовал очистить его:
sudo apt-get purge openssh-server
sudo apt-get install openssh-server
Теперь он работает.
Ошибка TCP “Connection refused” означает, что на этом IP-адресе есть активный хост, но порт, к которому вы пытались подключиться (22 для ssh), не открыт.
Во-первых, дважды проверьте имя вашего хоста и/или IP-адрес.
Наиболее вероятная причина либо в том, что кто-то остановил демон ssh, либо кто-то настроил его на использование альтернативного порта вместо порта по умолчанию (22).
Если у вас есть физический доступ к вашему серверу, войдите на этот сервер и введите команду sudo netstat -tupan
. В идеале вы должны увидеть строку, похожую на:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1053/sshd
Если вы этого не видите, попробуйте запустить sshd и/или проверьте, настроен ли он на прослушивание порта 22.
ИЗМЕНЕНИЕ
Обратите внимание на:
:22
– порт 22
LISTEN
– есть процесс, который работает и ожидает входящих соединений на порту 22
sshd
– имя процесса.
Если вы не видите подобной строки, это может означать, что ваш сервер ssh плохо настроен и не может запуститься. Попробуйте эту страницу для получения инструкций о том, как запустить его в фоновом режиме и выявить проблему.
SSH Connection refused по следующим причинам:
-
порт по умолчанию (22) был изменен на что-то другое. Проверьте файл /etc/ssh/sshd_config на наличие изменений порта.
-
IP-конфликт в локальной сети. Используйте команду arping, чтобы определить наличие конфликта. Посмотрите ваш dhcp пул.
-
порт ssh не разрешен в ip-tables/файрволе. Проверьте ваши iptables/файрвол и разрешите.
*Удаление/переустановка пакета ssh – не лучшая идея, так как это изменит многие ключи и пароли.
Одна из самых распространенных проблем – это сам сервис sshd. Вы проверяли, действительно ли он запущен? Также я заметил, что вы напрямую редактируете свои iptables, так что если у вас запущен ufw/firewalld, стоит также это проверить.
Также убедитесь, что сервер ssh работает на правильном IP и полное доменное имя (FQDN) направляет на правильный IP-адрес.
Ваш файрвол сервера настроен так, чтобы порт был открыт, но никто не слушает, чтобы ответить на ваше соединение.
Вам нужно, чтобы sshd (демон ssh) был установлен и работал…
Вам необходимо создать отсутствующий каталог следующим образом:
mkdir /var/run/sshd
chmod 0755 /var/run/sshd
Затем запустите неисправный сервер shh с помощью:
service ssh start
И все!
У меня была эта проблема, потому что я не выполнил sudo ufw allow ssh
. Я всего лишь выполнил sudo ufw allow 22
, что было недостаточно.
[root@fakeser ~]# ufw status
Status: active
To Action From
-- ------ ----
22 on eth1 ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
Nginx HTTPS ALLOW Anywhere
22 (v6) on eth1 ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Nginx HTTPS (v6) ALLOW Anywhere (v6)
ВЫШЕУКАЗАННОЕ НЕ СРАБОТАЛО
НИЖЕУКАЗАННОЕ СРАБОТАЛО
[root@fakeser ~]# ufw allow ssh
Rule added
Rule added (v6)
[root@fakeser ~]# ufw status
Status: active
To Action From
-- ------ ----
22 on eth1 ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
Nginx HTTPS ALLOW Anywhere
22/tcp ALLOW Anywhere
22 (v6) on eth1 ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Nginx HTTPS (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
Еще одна возможная проблема: маршрутизатор вашей клиентской сети блокирует SSH-соединения. Мой компьютер автоматически подключался к нашей гостевой Wi-Fi, переключение обратно на обычный Wi-Fi решило проблему. Это также может быть проблемой, если вы используете общественный Wi-Fi.
В некоторых случаях я заметил, что процесс ssh необходимо вручную перезапустить с помощью
sudo apt install openssh
sudo service ssh start
У меня была эта проблема, потому что fail2ban достиг максимального порога паролей. Я исправил это, выполнив fail2ban unban --all
на хосте, к которому я пытался подключиться по ssh.
Сегодня возникла такая же проблема, я дома и подключен через VPN к корпоративной сети. Оказалось, что мой локальный IP-адрес совпадает с IP-адресом сервера в компании. Таким образом, при выполнении ssh [email protected]
SSH пытается подключиться к моему локальному компьютеру вместо желаемого сервера.
Проблему можно решить, назначив домашнему маршрутизатору подсеть, которая отличается от корпоративной, чтобы не было пересечения в IP-адресах.
Ответ или решение
Почему возникает ошибка SSH "Connection refused": подробный анализ и решение проблемы
Ошибка "ssh: connect to host
1. Причины возникновения ошибки
Ошибка "Connection refused" обычно указывает на то, что на сервере не запущен SSH-демон (sshd) или он не слушает на стандартном порту (22). Рассмотрим подробнее возможные причины:
-
SSH-демон не запущен: Возможно, служба SSH не была запущена или аварийно завершила свою работу.
-
Проблемы с конфигурацией: Файл конфигурации
/etc/ssh/sshd_config
мог быть изменён, что привело к перенастройке порта, а также к изменению параметров доступа. -
Блокировка фаерволом: Правила брандмауэра (iptables или UFW) могут блокировать входящие подключения на порт 22.
-
Конфликт IP-адресов: Если вы используете VPN или находитесь в сети с динамическим IP, возможно, возник конфликт адресов.
2. Диагностика
Проверка работы SSH-демона
Используйте команду для проверки работы SSH-демона:
sudo systemctl status ssh
Выход должен показывать, что служба активна и работает. Если служба не запущена, выполните:
sudo systemctl start ssh
Проверка конфигурации
Откройте файл конфигурации SSH:
sudo nano /etc/ssh/sshd_config
Проверьте параметры, убедитесь, что используется порт 22:
Port 22
Проверка сетевых подключений
Используйте команду для проверки открытых портов:
sudo netstat -tulnp | grep :22
Вы должны увидеть строку, которая подтверждает, что процесс sshd
слушает на порту 22.
Проверка настроек брандмауэра
Проверьте настройки iptables:
sudo iptables -L -n
Убедитесь, что правила разрешают трафик на порт 22.
Если вы используете UFW, проверьте его статус:
sudo ufw status
Разрешите SSH, если он ещё не разрешён:
sudo ufw allow ssh
3. Устранение проблемы
Если демон SSH не запущен, запустите его. Если изменения в конфигурации были внесены, а вы не уверены в их корректности, можно восстановить стандартные настройки SSH, удалив конфигурационный файл и переустановив SSH:
sudo apt-get purge openssh-server
sudo apt-get install openssh-server
Однако перед этим сохраните ваш текущий конфигурационный файл.
4. Возможные дополнительные причины
-
Блокировка с использованием fail2ban: Если парольные попытки SSH были превышены, служба мога заблокировать доступ. В этом случае используйте:
sudo fail2ban-client unban --all
-
Конфликт сетевых адресов: Убедитесь, что IP-адреса вашей локальной сети не конфликтуют с адресами, которые используются на сервере.
Заключение
Проблема с SSH "Connection refused" может быть решена путем проверки статуса SSH-демона, конфигурации, правил брандмауэра и сетевых конфликтов. Если следовать приведенным шагам, вы сможете установить соединение, улучшив безопасность и доступность вашего серверного окружения.