Клон Git через прокси-сервер Nginx для сервера Gitlab не работает

Мой сервер Nginx действует как прокси для сервера Gitlab, проблема в том, что когда я пытаюсь «**git clone [email protected]:username/project.git**», я не могу клонировать проект [он не туннелирует с сервера Nginx на сервер Gitlab]

Когда я обновляю файл /etc/hosts моей локальной системы с IP-адресом сервера Gitlab, он отлично клонируется без пароля [я обновил свой профиль с помощью открытого ключа SSH в Gitlab].

Итак, я пришел к выводу, что мне нужно обновить конфигурацию Nginx с помощью правил, которые могут туннелировать SSH-связь с любой клиентской системы на сервер Gitlab через сервер Nginx.

Попробовал код по этой ссылке, внеся следующие изменения:

upstream gitlab {
server 192.168.61.102:22;
}

server {
listen 22;
server_name gitlab.example.com;

location / {
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;

proxy_pass http://gitlab;
}
}

Но это не работает. Было бы здорово, если бы кто-нибудь помог мне настроить правила, чтобы они заработали.

Примечание. В приведенном выше коде 192.168.61.102 — это IP-адрес моего сервера gitlab, мой сервер Nginx — 192.168.61.101.


person karthik v    schedule 12.08.2016    source источник


Ответы (2)


Во-первых, вам нужно перестать прослушивать Nginx порт 22. Nginx не обрабатывает переадресацию SSH, это делает ваш брандмауэр.

Если вы используете iptables, эти правила будут перенаправлять все запросы через ваш хост Nginx на ваш хост Gitlab.

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-destination [GITLAB-IP]:22
sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 22 -j SNAT --to-source [NGINX-IP]

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


Затем вам нужно включить пересылку пакетов, отредактировав файл /etc/sysctl.conf и раскомментировав эту строку:

net.ipv4.ip_forward=1

Затем перезагрузите конфигурацию, которую вы только что изменили, с помощью этой команды:

sudo sysctl -p

Наконец, эти правила iptables не являются постоянными по умолчанию и будут удалены при перезагрузке сервера. Самый простой способ сделать их постоянными — использовать пакет iptables-persistent. Вы устанавливаете этот пакет следующим образом:

sudo apt-get install iptables-persistent

И после его установки вы можете сохранить/восстановить правила iptables в любое время с помощью этих команд:

sudo invoke-rc.d iptables-persistent save
sudo invoke-rc.d iptables-persistent reload

Если вы используете Ubuntu 16.04 или более позднюю версию, эти команды

sudo netfilter-persistent save
sudo netfilter-persistent reload

Вы захотите запустить команду сохранения после того, как правила заработают и вы их протестируете. Затем, когда ваш сервер перезагрузится, сохраненные вами правила будут загружены автоматически.

person BrokenBinary    schedule 12.08.2016
comment
Очень информативно с хорошими деталями, спасибо, вы попробуете и опубликуете результат после того, как сделаете, но тогда какова цель/использование кода Nginx (Источник: ссылка) Я упомянул в вопросе, разве это не помогает в моем случае? - person karthik v; 12.08.2016
comment
Код Nginx используется для пересылки HTTP-запросов на ваш хост Gitlab, но он настроен на прослушивание порта 22, который является портом SSH. Он должен прослушивать порт 80. - person BrokenBinary; 12.08.2016
comment
Тогда код, упомянутый в этой ссылке с заголовком Конфигурация Nginx для туннеля SSH, дает неверную идею? - person karthik v; 15.08.2016
comment
Да, тот, кто написал это, похоже, думает, что Nginx обрабатывает их SSH-туннель, но на самом деле это не так. Они не знают, о чем говорят. - person BrokenBinary; 15.08.2016
comment
На моем сервере Nginx я изменил свой порт SSH с 22 на 2201 и написал правила, как вы упомянули выше, например: sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-destination 192.168.60.101:22 sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 22 -j SNAT --to-source 192.168.60.100 - person karthik v; 16.08.2016
comment
также добавлен net.ipv4.ip_forward=1 /etc/sysctl.conf; И установил sudo apt-get install iptables-persistent sudo invoke-rc.d iptables-persistent save sudo invoke-rc.d iptables-persistent reload - person karthik v; 16.08.2016
comment
При выполнении следующей команды на сервере Nginx ssh [email protected] -L 22:192.168.60.100:22 она работает нормально, я могу подключиться к 192.168.60.101 Но когда я использую ssh [email protected] из других моих клиентских систем в сети Я не могу подключиться к 192.168.60.101. Не говоря уже о том, что на моем сервере Nginx я изменил порт SSH с 22 на 2201. - person karthik v; 16.08.2016
comment
Также пытался сохранить порт 22 ssh по умолчанию на сервере Nginx с вышеупомянутыми правилами IPTables, но не повезло. - person karthik v; 16.08.2016
comment
Это сработало после использования дополнительной команды sysctl -p - person karthik v; 17.08.2016

Прокси-сервер Nginx предназначен для http-запросов.

При клонировании через SSH вы не используете http.

Что вам нужно сделать, так это использовать что-то вроде переадресации портов на вашем маршрутизаторе или iptables на вашем сервере.

person Jawad    schedule 12.08.2016
comment
Но тогда какова цель/вариант использования кода Nginx (Источник: ссылка), о котором я упоминал в вопрос, не помогает ли это в моем сценарии? - person karthik v; 12.08.2016
comment
Цель этого кода — перенаправить HTTP-запросы, полученные через порт 80, на локальный хост через порт 3000. Но перенаправляется всегда HTTP-трафик. Таким образом, с помощью вашего кода вы можете сделать свой веб-интерфейс gitlab доступным из внешнего мира и т. д., но вы не можете конвертировать ssh-запросы в http с помощью прокси-сервера nginx. Ответ BrokenBinary с iptables — это путь. - person Jawad; 12.08.2016
comment
Тогда код, упомянутый в этой ссылке с заголовком Конфигурация Nginx для туннеля SSH выдает неверное представление ? - person karthik v; 12.08.2016