Что вызывает сообщение «Соединение отказано»?

110

Это канонический вопрос об отказе в соединении

Мы видим много вопросов об этом

Когда я пытаюсь подключиться к системе, я получаю сообщение

В соединении отказано

Почему это ?

user9517
источник
2
Мы часто получаем это в Apache Hadoop, где это часто вызывается ошибками конфигурации в клиенте: с каким хостом разговаривать, для чего настроены их таблицы DNS или / etc / host, или с несовпадением портов, используемых сервис и что клиенты думают, что он должен использовать. Соответственно, у нас есть отдельная вики-запись на эту тему. Многие из проблем, вероятно, в другом месте, хотя (надеюсь, в меньших масштабах). Отладка проблем с подключением в кластере из 1000 узлов - это не весело.
Стив
Ваша выделенная ссылка на вики указывает на этот вопрос;)
user9517
1
хороший улов. Вот официальная ссылка: wiki.apache.org/hadoop/ConnectionRefused . Я добавлю перекрестную ссылку оттуда сюда для этого полного цикла.
Стив
@SteveLoughran Классная статья - один комментарий - обратная ссылка говорит о переполнении стека, и мы неисправны на сервере;)
user9517
сделанный. FWIW, эта вики-ссылка добавляется к исключениям ConnectionRefused, передаваемым в стеке Hadoop, вместе с дополнительной информацией (хосты, порты), необходимой для выяснения того, что происходит не так. Мы по-прежнему получаем множество сообщений об ошибках от людей, которые видят трассировку стека и не
Стив

Ответы:

118

Примечание . Это сообщение является признаком проблемы, которую вы пытаетесь решить. Понимание причины сообщения в конечном итоге приведет вас к решению вашей проблемы.

Сообщение «Соединение отклонено» имеет две основные причины:

  1. Ничего не прослушивает IP: порт, к которому вы пытаетесь подключиться.
  2. Порт заблокирован брандмауэром.

Никакой процесс не слушает.

Это, безусловно, самая распространенная причина сообщения. Сначала убедитесь, что вы пытаетесь подключиться к правильной системе. Если вы хотите определить, является ли это проблемой, на удаленной системе запустите netstat или ss 1, например, ожидаете ли вы, что процесс будет прослушивать порт 22222

sudo netstat -tnlp | grep :22222

или же

ss -tnlp | grep :22222

Для OSX подходящая команда

sudo netstat -tnlp tcp | grep '\.80 '

Если ничего не слышно, то вышеприведенное не даст никакого выхода. Если вы видите какой-то вывод, убедитесь, что это то, что вы ожидаете, а затем посмотрите раздел брандмауэра ниже.

Если у вас нет доступа к удаленной системе и вы хотите подтвердить проблему, прежде чем сообщать об этом соответствующим администраторам, вы можете использовать tcpdump (wireshark или аналогичный).

При попытке подключения к порту IP:, где ничего не прослушивается, ответ удаленной системы на начальный пакет SYN представляет собой пакет с установленными флагами RST, ACK. Это закрывает соединение и вызывает сообщение «Отказано в соединении», например

$ sudo tcpdump -n хост 192.0.2.1 и порт 22222
tcpdump: подробный вывод подавлен, используйте -v или -vv для
прослушивания полного декодирования протокола на enp14s0, тип канала EN10MB (Ethernet), размер захвата 262144 байта

12: 31: 27.013976 IP 192.0.2.2.34390> 192.0.2.1.22222: Флаги [S] , seq 1207858804, победа 29200, опции [mss 1460, sackOK, TS val 15306344 ecr 0, nop, wscale 7], длина 0

12: 31: 27.020162 IP 192.0.2.1.22222> 192.0.2.2.34390: Flags [R.] , seq 0, ack 1207858805, победа 0, длина 0

Обратите внимание, что tcpdump использует . чтобы представлять ACK флаг.

Порт заблокирован брандмауэром

Если порт заблокирован брандмауэром и брандмауэр настроен на ответ, icmp-port-unreachableэто также приведет к сообщению об отказе в соединении. Опять же, вы можете увидеть это с помощью tcpdump (или аналогичного)

$ sudo tcpdump -n icmp
tcpdump: подробный вывод подавлен, используйте -v или -vv для

прослушивания полного декодирования протокола на enp14s0, тип канала EN10MB (Ethernet), размер захвата 262144 байта 13: 03: 24.149897 IP 192.0.2.1> 192.0. 2.2: ICMP 192.0.2.1 TCP-порт 22222 недоступен, длина 68

Обратите внимание, что это также говорит нам, где находится блокирующий брандмауэр.


Теперь, когда вы знаете, что является причиной сообщения «Отказано в соединении», вы должны предпринять соответствующие действия, например, обратиться к администратору брандмауэра или выяснить причину, по которой процесс не прослушивает.

1 Другие инструменты, вероятно, доступны.

user9517
источник
2
Версия ELI5: это означает, что запрос на соединение поступил на другой компьютер, а другой компьютер не имел ни малейшего понятия, о чем вы говорили.
user253751
«Никакой процесс не слушает». Основная причина ..!
Самита Чатуранга
В моем случае что-то слушало ... но на другом узле, к которому я пытался подключиться. К сожалению.
Иосиф
1
@ijoseph Так что ничего не слушал тогда.
user9517
5

Для меня в Debian 6 squeeze это было так же просто, как проверка службы SSH :

sudo service ssh status

И ничего не нашел (с сообщением ssh: unrecognized service) просто установив сервис :

sudo apt-get install openssh-server

Это также работает, если вы не получаете соединение SFTP, поскольку SFTP является подмножеством SSH (тогда как FTPS является подмножеством FTP).

SharpC
источник