Что вызывает сообщение "Соединение отказано"?
Это канонический вопрос об отказе в соединении
Мы видим много вопросов об этом
Когда я пытаюсь подключиться к системе, я получаю сообщение
В соединении отказано
Почему это?
2 ответа
Примечание. Это сообщение является признаком проблемы, которую вы пытаетесь решить. Понимание причины сообщения в конечном итоге приведет вас к решению вашей проблемы.
Сообщение "Соединение отклонено" имеет две основные причины:
- Ничего не прослушивает IP: порт, к которому вы пытаетесь подключиться.
- Порт заблокирован брандмауэром.
Никакой процесс не слушает.
Это, безусловно, самая распространенная причина сообщения. Сначала убедитесь, что вы пытаетесь подключиться к правильной системе. Если вы хотите определить, является ли это проблемой, на удаленной системе запустите 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 Другие инструменты, вероятно, доступны.
Для меня в Debian 6 squeeze это было так же просто, как проверка службы SSH:
sudo service ssh status
И найти ничего не существовало (с сообщением ssh: unrecognized service
) просто установка сервиса:
sudo apt-get install openssh-server
Это также работает, если вы не получаете соединение SFTP, поскольку SFTP - это подмножество SSH (тогда как FTPS - это подмножество FTP).