Вопрос или проблема
Описание проблемы:
Я использовал корпоративную сеть и пытался получить свой собственный репозиторий для некоторых заметок в моем репозитории на github.com, но это не удалось. Я попытался получить более подробный лог с помощью следующих команд и получил следующие детали:
GIT_TRACE=true \
GIT_CURL_VERBOSE=true \
GIT_SSH_COMMAND="ssh -vvv" \
GIT_TRACE_PACK_ACCESS=true \
GIT_TRACE_PACKET=true \
GIT_TRACE_PACKFILE=true \
GIT_TRACE_PERFORMANCE=true \
GIT_TRACE_SETUP=true \
GIT_TRACE_SHALLOW=true \
git clone [email protected]:albertjone/Boostnotes.git
11:00:34.976275 exec-cmd.c:139 trace: разрешен исполняемый файл из стека Darwin: /Library/Developer/CommandLineTools/usr/bin/git
11:00:34.976973 exec-cmd.c:238 trace: разрешена директория исполняемого файла: /Library/Developer/CommandLineTools/usr/bin
11:00:34.977509 git.c:439 trace: встроенная команда: git clone [email protected]:albertjone/Boostnotes.git
Клонирую в 'Boostnotes'...
11:00:34.999871 run-command.c:663 trace: run_command: unset GIT_DIR; 'ssh -vvv' [email protected] 'git-upload-pack '\''albertjone/Boostnotes.git'\'''
OpenSSH_8.1p1, LibreSSL 2.7.3
debug1: Чтение конфигурационных данных /Users/xiaojguan/.ssh/config
debug1: Чтение конфигурационных данных /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config строка 47: Применение параметров для *
debug1: Подключение к github.com порт 22.
debug1: Соединение установлено.
debug1: файл идентичности /Users/xiaojguan/.ssh/id_rsa тип 0
debug1: файл идентичности /Users/xiaojguan/.ssh/id_rsa-cert тип -1
debug1: файл идентичности /Users/xiaojguan/.ssh/id_dsa тип -1
debug1: файл идентичности /Users/xiaojguan/.ssh/id_dsa-cert тип -1
debug1: файл идентичности /Users/xiaojguan/.ssh/id_ecdsa тип -1
debug1: файл идентичности /Users/xiaojguan/.ssh/id_ecdsa-cert тип -1
debug1: файл идентичности /Users/xiaojguan/.ssh/id_ed25519 тип -1
debug1: файл идентичности /Users/xiaojguan/.ssh/id_ed25519-cert тип -1
debug1: файл идентичности /Users/xiaojguan/.ssh/id_xmss тип -1
debug1: файл идентичности /Users/xiaojguan/.ssh/id_xmss-cert тип -1
debug1: Локальная версия строки SSH-2.0-OpenSSH_8.1
kex_exchange_identification: read: время ожидания операции истекло
fatal: Не удалось прочитать из удаленного репозитория.
Пожалуйста, убедитесь, что у вас есть правильные права доступа
и что репозиторий существует.
11:01:58.045282 trace.c:475 производительность: 83.067792000 с: команда git: /Library/Developer/CommandLineTools/usr/bin/git clone [email protected]:albertjone/Boostnotes.git
Что я сделал
-
Я много гуглил, но не нашел полезных ответов.
-
Я проверил, что я могу выполнить telnet на 22 порт github.com
❯ telnet github.com 22
Попытка 140.82.114.4...
Подключено к github.com.
Символ выхода: '^]'.
Вопрос
Хотя команда git clone
работает с HTTP-протоколом, я немного упрям и хочу узнать, в чем причина и как это решить.
Первое, что делают обе стороны при установлении SSH-соединения, это обмениваться идентификаторами версий, чтобы знать, какую версию SSH и, возможно, какое программное обеспечение использует другая сторона. В вашем случае вы смогли установить соединение, но сервер никогда не отправлял свой идентификатор версии. Скорее всего, это происходит из-за того, что у вас есть устройство MITM в вашей сети, которое отслеживает все соединения и не пропустило это.
Вы заметите, что на моей системе, когда я подключаюсь к github.com на порту 22, я получаю баннер SSH с удаленной стороны:
$ nc github.com 22 </dev/null
SSH-2.0-babeld-cc5efb01
SSH и TLS (протокол безопасности, используемый в HTTPS) могут предотвратить чтение данных или вмешательство в данные незаметно, но они не могут предотвратить вмешательство в данные вообще. Нападающий все еще может предотвратить установление соединения или вмешаться в него так, что соединение будет прервано, поскольку вмешательство было обнаружено.
В данном случае устройство MITM вашей компании является нападающим и предотвращает работу соединения. Вы можете попытаться обойти это с помощью VPN, но если вы можете использовать HTTPS для достижения своей цели, вы лучше сделаете. Это менее вероятно заставит вас оказаться в неприятностях, по крайней мере.
Ответ или решение
Проблема с клонированием репозитория Git: kex_exchange_identification: read: Operation timed out
Клонирование репозитория Git с помощью SSH может подвергаться множеству проблем, особенно когда используется корпоративная сеть. Одной из распространённых ошибок является сообщение об ошибке kex_exchange_identification: read: Operation timed out
, что указывает на проблемы при установлении SSH-соединения с удалённым сервером, в данном случае — с GitHub. Давайте разберёмся в возможных причинах этой проблемы и в том, как её можно решить.
Важная информация о вашем случае
Вы пытались клонировать репозиторий с помощью команды:
git clone [email protected]:albertjone/Boostnotes.git
Во время выполнения команды вы получили следующие сообщения о состоянии SSH-соединения:
- Соединение установлено: строка
debug1: Connecting to github.com port 22.
показывает, что ваше устройство успешно установило соединение с GitHub на порту 22. - Таймаут: сообщение
kex_exchange_identification: read: Operation timed out
указывает на то, что сервер (GitHub) не смог отправить версии SSH после установления соединения, что приводило к таймауту.
Возможные причины
-
Проблемы с сетью:
- Ваша компания может использовать устройства для фильтрации или управления трафиком (например, прокси-серверы, межсетевые экраны или MITM-устройства), которые могут блокировать или искажать трафик на порту 22.
- Некоторые организации могут использовать блокировки для порта 22, чтобы предотвратить использование SSH, что ограничивает работоспособность соединений.
-
Настройки SSH:
- Проверьте файл конфигурации SSH (
/Users/xiaojguan/.ssh/config
) на наличие особых настроек, которые могут мешать правильному установлению соединения.
- Проверьте файл конфигурации SSH (
-
Проблемы с идентификацией:
- Убедитесь, что ваш ключ SSH находится в списках авторизованных ключей на GitHub (находится в настройках вашего аккаунта GitHub).
Возможные решения
-
Используйте HTTPS:
- Вы уже отметили, что прямое клонирование через HTTP работает. Это, возможно, самое простое решение, поскольку HTTP-трафик в большинстве корпоративных сетей не блокируется.
git clone https://github.com/albertjone/Boostnotes.git
-
Обход сетевого фильтра:
- Если вам необходимо использовать SSH, рассмотрите возможность использования VPN. Это может помочь вам обойти ограничения, установленные на вашей корпоративной сети.
-
Проверка альтернативных портов:
- Некоторые компании разрешают SSH-соединения через нестандартные порты, такие как 2222 или 443. Попробуйте выполнить клонирование через другой порт (при необходимости, проконсультируйтесь с вашим сетевым администратором).
Заключение
Сообщение об ошибке kex_exchange_identification: read: Operation timed out
связано, в первую очередь, с проблемами установления безопасного соединения SSH с удалённым сервером из-за ограничений сети. Хотя решение с использованием HTTP является наиболее простым и эффективным в условиях корпоративной сети, для более продвинутых пользователей, которым необходимо использовать SSH, возможны другие пути обхода ограничений, такие как использование VPN или изменение конфигурации сервера. Убедитесь, что соблюдаете все правила и политики вашей организации, чтобы избежать возможных рисков.