↓Перейти к содержанию
  1. Git: руководства и команды/

Порты Git: SSH 22, HTTPS 443, git:// 9418

·8 минут·

Git использует разные порты в зависимости от выбранного протокола. SSH использует порт 22, HTTPS — порт 443, собственный git:// протокол — порт 9418. Понимание портов помогает решать проблемы подключения в корпоративных сетях.

Порты по протоколам #

Протокол   Порт   URL формат
SSH        22     [email protected]:user/repo.git
HTTPS      443    https://github.com/user/repo.git
git://     9418   git://github.com/user/repo.git
Локальный  -      /path/to/repo.git или file:///path/to/repo

SSH: порт 22 #

SSH — стандартный протокол для разработчиков:

# Стандартное подключение через порт 22
git clone [email protected]:user/project.git

# Проверить доступность порта 22
ssh -T [email protected]
# Hi username! You've successfully authenticated...

# Если порт 22 заблокирован, проверить:
nc -zv github.com 22
# Connection to github.com 22 port [tcp/ssh] succeeded!

# Тест с подробным выводом
ssh -vT [email protected] 2>&1 | head -20

SSH на нестандартном порту #

GitHub и GitLab поддерживают SSH через порт 443 как обходной путь:

# GitHub: SSH через порт 443
ssh -T -p 443 ssh.github.com
# Hi username! You've successfully authenticated...

# Настроить в ~/.ssh/config для постоянного использования
cat >> ~/.ssh/config << 'EOF'
Host github.com
    Hostname ssh.github.com
    Port 443
    User git
EOF

# Теперь стандартные команды работают через порт 443
git clone [email protected]:user/project.git

# GitLab: SSH через порт 443
cat >> ~/.ssh/config << 'EOF'
Host gitlab.com
    Hostname altssh.gitlab.com
    Port 443
    User git
EOF

Собственный SSH сервер на другом порту #

# Если ваш Git сервер использует нестандартный порт SSH
# Например, сервер на порту 2222

# ~/.ssh/config
Host myserver
    HostName server.example.com
    Port 2222
    User git

# Клонирование
git clone git@myserver:repos/project.git

# Или напрямую в URL
git clone ssh://[email protected]:2222/repos/project.git

HTTPS: порт 443 #

HTTPS — универсальный протокол, работающий через любой firewall:

# Стандартное подключение через порт 443
git clone https://github.com/user/project.git

# Проверить доступность
curl -I https://github.com
# HTTP/2 200

# Если корпоративный прокси — настроить git
git config --global http.proxy http://proxy.corp.com:8080
git config --global https.proxy http://proxy.corp.com:8080

# Проверить прокси настройки
git config --global --get http.proxy

git://: порт 9418 #

Специальный протокол Git для публичных репозиториев:

# Клонирование через git://
git clone git://github.com/user/project.git  # устарело на GitHub

# git daemon слушает на порту 9418
git daemon --reuseaddr --base-path=/srv/git --export-all /srv/git

# Проверить доступность
nc -zv server.example.com 9418
telnet server.example.com 9418

# Открыть порт в firewall (ufw)
sudo ufw allow 9418/tcp

Порт 9418 редко открыт в корпоративных сетях. GitHub прекратил поддержку git:// протокола.

Диагностика проблем с портами #

# Проверить открыт ли порт
nc -zv github.com 22   # SSH
nc -zv github.com 443  # HTTPS
nc -zv server.com 9418 # git://

# Трассировка соединения
traceroute github.com

# Проверить через curl (HTTPS)
curl -v https://github.com/user/project.git/info/refs?service=git-upload-pack 2>&1 | head -20

# SSH тест с подробным выводом
ssh -vvv [email protected] 2>&1 | grep -E "debug|Connecting|Connected|refused"

# Проверить текущие сетевые соединения git
GIT_TRACE=1 git fetch 2>&1 | head -20

Работа в ограниченных сетях #

# Корпоративная сеть с прокси: HTTPS + токен
git config --global http.proxy http://username:password@proxy:8080

# Если нужен токен для аутентификации через прокси
git config --global http.proxy http://proxy:8080
# Далее система паролей запросит учётные данные

# Только HTTPS через прокси — обойти SSH
# Настроить remote на HTTPS
git remote set-url origin https://github.com/user/project.git

# GitHub: если заблокированы все порты кроме 443
# Использовать SSH через HTTPS порт (как описано выше)
cat ~/.ssh/config
# Host github.com
#     Hostname ssh.github.com
#     Port 443
#     User git

Какой порт использует конкретная команда #

# Посмотреть фактически используемые соединения во время git операции
GIT_TRACE=1 GIT_TRACE_PACKET=1 git fetch 2>&1 | grep -i "connect\|port"

# strace для детального анализа (Linux)
strace -e connect git fetch 2>&1 | grep -E "connect|sin_port"

# Через ss: посмотреть активные соединения
ss -tnp | grep git

Полная таблица протоколов и портов Git #

Полный обзор всех способов подключения:

Протокол    Порт(ы)     URL формат                        Использование
─────────────────────────────────────────────────────────────────────────
SSH         22, 443     [email protected]:user/repo.git      Разработчики
HTTPS       443         https://github.com/user/repo.git  Всюду работает
git://      9418        git://github.com/user/repo.git    Редко (read-only)
HTTP        80          http://github.com/user/repo.git   Устарело
Файловая    -           /path/to/repo.git                 Локальные clone
            -           file:///path/to/repo.git          Через URL

Git Daemon  9418        Запускается с --base-path
SSH tunne   22+forwarding Проксирование через firewall
ProxyCommand Любой      Через jump host

─────────────────────────────────────────────────────────────────────────

SSH config для удобного подключения #

Настройка ~/.ssh/config упрощает работу с несколькими портами и серверами:

# GitHub через обычный порт 22
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa

# GitHub через порт 443 (если 22 заблокирован)
Host github-443
    HostName ssh.github.com
    Port 443
    User git
    IdentityFile ~/.ssh/id_rsa

# GitLab
Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_gitlab

# Собственный Git сервер
Host my-git-server
    HostName git.company.internal
    Port 2222
    User git
    IdentityFile ~/.ssh/company-key

# Использование:
# git clone [email protected]:user/repo.git           # через обычный порт
# git clone git@github-443:user/repo.git           # через порт 443
# git clone git@my-git-server:repos/project.git    # через 2222

ProxyCommand для обхода firewall #

Если корпоративный firewall блокирует большинство портов, можно использовать ProxyCommand:

# ~/.ssh/config
Host github.com
    HostName github.com
    User git
    ProxyCommand nc -X connect -x proxy.corp.com:8080 %h %p

# Для более сложных ситуаций с SSH сервером-прокси
Host github.com
    HostName github.com
    User git
    ProxyCommand ssh jumphost.corp.com -W github.com:22

Использование:

# Тестировать подключение
ssh -v [email protected]

# Clone работает через proxy
git clone [email protected]:user/repo.git

Git Daemon: порт 9418 и безопасность #

git daemon — встроенный сервер Git для анонимного доступа на чтение:

# Запустить git daemon
git daemon --reuseaddr --base-path=/srv/git --export-all --verbose

# С опциями безопасности (рекомендуется)
git daemon --reuseaddr \
  --base-path=/srv/git \
  --export-all \
  --user=git \
  --group=git \
  --detach

# Слушает на порту 9418
netstat -tlnp | grep 9418
# tcp  0  0 0.0.0.0:9418  0.0.0.0:*  LISTEN  1234/git-daemon

Клиенты подключаются как:

git clone git://server.example.com/project.git

Проблемы с git daemon:

⚠️ Нет аутентификации (кто угодно может клонировать)
⚠️ Нет шифрования (пароли видны в логах)
⚠️ Только чтение по умолчанию (нельзя делать push)
⚠️ Редко открыт в корпоративных сетях
⚠️ GitHub прекратил поддержку git:// в 2023 году

Когда использовать git daemon:

✓ Open source проект с публичным доступом (git read-only)
✓ Внутренний репозиторий в приватной сети
✓ Высокая нагрузка на читаемые операции
  (git daemon быстрее чем HTTP)
✓ Когда SSH/HTTPS недоступны

HTTPS vs SSH: какой выбрать #

Сравнение для разных сценариев:

Сценарий                    SSH             HTTPS
─────────────────────────────────────────────────────
Разработчик на ноутбуке     ✓ Лучше        ✓ Работает
                            (ключи)         (пароль)

CI/CD пайплайн              ✗ Сложнее      ✓ Проще
                            (ключи)         (токены)

Корпоративная сеть с proxy  ✗ Блокировано  ✓ Работает
                            (порт 22)       (порт 443)

Анонимный pull              ✗ Нет           ✓ Да
                            (нужна auth)    (no auth)

Быстрота                    ✓ Быстрее      ✓ Медленнее
                                           (TLS overhead)

Безопасность                ✓ SSH ключи    ✓ HTTPS TLS
                            ✓ Хорошая      ✓ Хорошая

─────────────────────────────────────────────────────

Рекомендация для разных команд:

# Разработчики: используйте SSH
git remote set-url origin [email protected]:user/repo.git

# CI/CD: используйте HTTPS с токеном
git clone https://username:[email protected]/user/repo.git

# Fallback: если 22 закрыт, SSH через 443
# Настроить как описано выше в ~/.ssh/config

Тестирование доступности портов #

Полный набор команд для диагностики:

# 1. Проверить открыт ли конкретный порт (nc)
nc -zv github.com 22
nc -zv github.com 443
nc -zv github.com 9418

# 2. Альтернатива через telnet
telnet github.com 22
telnet github.com 443

# 3. Через SSH вербозно
ssh -v [email protected]
ssh -vvv [email protected]    # ещё более подробно

# 4. Проверить специфичный порт SSH с вербозом
ssh -v -p 443 [email protected]

# 5. Через curl (для HTTPS)
curl -v https://github.com/user/repo.git/info/refs?service=git-upload-pack 2>&1 | head -20

# 6. Трассировка маршрута до хоста
traceroute github.com

# 7. Проверить firewall правила (Linux)
sudo iptables -L -n
sudo ufw status

# 8. Посмотреть что Git реально делает
GIT_TRACE=1 git fetch
GIT_SSH_COMMAND="ssh -vvv" git fetch

SSH конфигурация для различных сценариев #

Несколько учётных записей GitHub:

# ~/.ssh/config
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/personal_key

Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/work_key

# Использование:
# git clone [email protected]:personal/project.git        # personal_key
# git clone git@github-work:company/project.git        # work_key

SSH через HTTP proxy:

Host github.com
    HostName github.com
    User git
    ProxyCommand corkscrew proxy.corp.com 8080 %h %p

Использование SSH с passphrase:

# Запустить ssh-agent чтобы не вводить passphrase каждый раз
eval $(ssh-agent)
ssh-add ~/.ssh/id_rsa
# Введёте passphrase один раз за сессию

# Или использовать key without passphrase для CI/CD
ssh-keygen -f ~/.ssh/ci_key -N ""  # без passphrase

Проверка текущей конфигурации #

# Посмотреть какой протокол использует текущий remote
git remote -v
# origin  https://github.com/user/repo.git (fetch)
# origin  https://github.com/user/repo.git (push)

# Или проверить конфиг
git config --get remote.origin.url

# Посмотреть SSH config
cat ~/.ssh/config

# Проверить какие ключи доступны
ssh-add -l

# Тестировать GitHub через оба портала
ssh -T [email protected]          # Порт 22
ssh -T -p 443 [email protected]  # Порт 443

Часто задаваемые вопросы #

Почему git push/pull работает по HTTP но не по SSH? Порт 22 заблокирован firewall или прокси. Решение: переключиться на HTTPS (git remote set-url origin https://...) или настроить SSH через порт 443.

Нужно ли открывать порт 9418 для работы с GitHub? Нет. GitHub использует HTTPS (443) и SSH (22/443). Порт 9418 (git://) GitHub не поддерживает с 2023 года.

Как проверить через какой порт идёт трафик Git? GIT_TRACE=1 git fetch покажет URL и метод подключения. URL определяет порт: git@ → SSH 22, https:// → HTTPS 443.

Можно ли запустить SSH сервер для Git на порту 443? Технически — да. Но это конфликтует с HTTPS веб-сервером на том же IP. Лучше использовать отдельный IP или SNI (HTTPS через nginx с stream proxying).

Почему компании блокируют порт 9418? Нестандартный порт, используется редко, нет шифрования и аутентификации. Firewall политики часто блокируют всё нестандартное по умолчанию.

Заключение #

Git использует три основных порта: 22 для SSH, 443 для HTTPS, 9418 для git://. В корпоративных сетях часто заблокирован SSH (22) — используйте SSH через порт 443 (ssh.github.com:443) или переключитесь на HTTPS. Подробнее о протоколах Git.