Вопрос или проблема
Это канонический вопрос о Отказе в соединении
Мы видим много вопросов на тему
Когда я пытаюсь подключиться к системе, я получаю сообщение
Отказано в соединении
Почему это происходит?
Примечание: Это сообщение является симптомом проблемы, которую вы пытаетесь решить. Понимание причины сообщения в конечном итоге приведет вас к решению вашей проблемы.
Сообщение “Отказано в соединении” имеет две основные причины:
- На IP:Port, к которому вы пытаетесь подключиться, никто не слушает.
- Порт заблокирован файрволом.
Процесс не слушает.
Это самая распространенная причина получения сообщения. Сначала убедитесь, что вы пытаетесь подключиться к правильной системе. Если это так, чтобы определить, является ли это проблемой, на удаленной системе выполните netstat или ss1, например, если вы ожидаете, что процесс будет слушать на порту 22222
sudo netstat -tnlp | grep :22222
или
ss -tnlp | grep :22222
Для OSX подходит команда
sudo netstat -tnlp tcp | grep '\.22222 '
Если ничего не слушает, то вышеуказанные команды не выведут результат. Если вы видите какой-то вывод, убедитесь, что это то, что вы ожидали, и см. раздел о файрволе ниже.
Если у вас нет доступа к удаленной системе и вы хотите подтвердить проблему перед тем, как сообщить об этом соответствующим администраторам, вы можете использовать tcpdump (wireshark или аналогичное).
Когда происходит попытка подключения к IP:port, где никто не слушает, отклик удаленной системы на начальный SYN пакет представляет собой пакет с установленными флагами RST,ACK. Это закрывает соединение и вызывает сообщение “Отказано в соединении”, напр.
$ sudo tcpdump -n host 192.0.2.1 and port 22222
tcpdump: verbose output suppressed, use -v или -vv for full protocol decode
listening on enp14s0, link-type EN10MB (Ethernet), capture size 262144 bytes12:31:27.013976 IP 192.0.2.2.34390 > 192.0.2.1.22222: Flags [S], seq 1207858804, win 29200, options [mss 1460,sackOK,TS val 15306344 ecr 0,nop,wscale 7], length 0
12:31:27.020162 IP 192.0.2.1.22222 > 192.0.2.2.34390: Flags [R.], seq 0, ack 1207858805, win 0, length 0
Обратите внимание, что tcpdump использует . для обозначения флага ACK.
Порт заблокирован файрволом
Если порт заблокирован файрволом и файрвол был настроен для ответа с icmp-port-unreachable
, это также приведет к сообщению об отказе в соединении. Опять же, вы можете увидеть это с помощью tcpdump (или аналогичного)
$ sudo tcpdump -n icmp
tcpdump: verbose output suppressed, use -v или -vv for full protocol decodelistening on enp14s0, link-type EN10MB (Ethernet), capture size 262144 bytes
13:03:24.149897 IP 192.0.2.1 > 192.0.2.2: ICMP 192.0.2.1 tcp port 22222 unreachable, length 68
Заметьте, что это также указывает, где находится блокирующий файрвол.
Теперь, когда вы знаете, что вызывает сообщение об отказе в соединении, вы должны предпринять соответствующие действия, например, обратиться к администратору файрвола или исследовать причину, по которой процесс не слушает.
1 Возможно, доступны другие инструменты.
Для меня в Debian 6 squeeze это было так просто, как проверка службы SSH:
sudo service ssh status
И обнаружение, что ничего не существует (с сообщением ssh: unrecognized service
) просто установка службы:
sudo apt-get install openssh-server
Это также работает, если вы не получаете соединение SFTP, так как SFTP является подмножеством SSH (тогда как FTPS является подмножеством FTP).
Что вызывает сообщение ‘Отказано в соединении’?
- Неправильный IP-адрес или номер порта указан.
- Серверное приложение не запущено, чтобы слушать на этом порту.
- Серверное приложение работает, но не слушает на указанном порту.
- Местный/удаленный файрвол блокирует соединение.
- Перегрузка сервера или исчерпание ресурсов.
Ответ или решение
Сообщение "Connection Refused" (отказано в подключении) является распространенной проблемой, с которой сталкиваются пользователи сети. Понимание причин этого сообщения—ключевой шаг к решению возникающей проблемы. В данной статье мы рассмотрим основные причины возникновения этого сообщения и предложим подходы к его устранению.
Теория (Theory)
Прежде всего, важно понять природу сообщения "Connection Refused". Оно сигнализирует о том, что попытка установить соединение между вашим приложением и удаленным сервером была неудачной по одной из нескольких причин. Основные факторы, способствующие возникновению этого сообщения, включают:
-
Неправильный IP-адрес или номер порта — Если указаны неверные данные для подключения, сервер не сможет обеспечить обрабатываемое соединение.
-
Приложение-сервер не запущено — Серверное приложение, которое должно обрабатывать запросы, может быть отключено или не работать по другой причине.
-
Приложение не слушает указанный порт — Даже с запущенным сервером, он может не слушать конкретный порт, к которому клиент пытается подключиться.
-
Защитный экран (firewall) блокирует соединение — Локальный или удаленный файрвол может препятствовать прохождению соединения.
-
Перегрузка сервера или исчерпание ресурсов — Сервер может быть перегружен запросами или иметь нехватку системных ресурсов, что делает невозможным обработку новых подключений.
Пример (Example)
Представим, что вы администратор системы и должны обеспечить успешное подключение пользователей к приложению через порт 22222. Однако пользователи регулярно получают сообщение "Connection Refused". Вы должны предпринять следующие шаги, чтобы диагностировать и устранить проблему:
-
Проверка правильности IP и порта — Убедитесь, что пользователи вводят правильный IP-адрес и номер порта.
-
Проверка активности сервера — Используйте команду
sudo service <имя_сервиса> status
, чтобы удостовериться, что серверное приложение работает. -
Проверка прослушиваемых портов — Используйте команды
sudo netstat -tnlp | grep :22222
илиss -tnlp | grep :22222
, чтобы убедиться, что сервер действительно слушает ожидаемый порт. -
Анализ правил файрвола — Проверьте конфигурации файрвола с помощью таких утилит, как
iptables
, чтобы определить, не блокируется ли порт 22222. -
Мониторинг нагрузки на сервер — С помощью утилит мониторинга, таких как
htop
илиvmstat
, проверьте, не исчерпаны ли ресурсы сервера.
Применение (Application)
Совершим разбор шагов, применяя полученные знания для решения сообщения "Connection Refused":
-
Обратная связь с пользователями: Обеспечьте, чтобы конечные пользователи знали точные данные для подключения, которые следует использовать. Периодически обновляйте руководство по подключению, включая актуальные IP-адреса и порты.
-
Регулярное техническое обслуживание: Убедитесь, что серверные приложения запускаются при запуске системы. Имейте протокол аварийного восстановления для случаев, когда сервис вдруг прекращает работу.
-
Безопасность сети: Постоянно проверяйте правила файрвола и корректируйте их в зависимости от изменившихся требований безопасности, сохраняя баланс между защитой и доступностью сервера.
-
Оптимизация производительности: Проводите регулярные тесты нагрузки, чтобы определить возможные узкие места. Рассмотрите возможность горизонтального или вертикального масштабирования систем по мере возрастания нагрузки.
Понимание и умелое применение вышеописанных методологий позволит эффективно решать проблему "Connection Refused", обеспечивая бесперебойную работу сетевых систем и удовлетворенность пользователей.