2016-08-12 4 views
1

내 Nginx 서버가 Gitlab 서버용 프록시 역할을하고 있는데, "**git clone [email protected]:username/project.git**"을 시도 할 때 문제가 발생합니다. [복제가 불가능합니다.] 터널링이 아닙니다. Gitlab 서버에 Nginx 서버]Gitlab 서버에 대한 Nginx 프록시를 통한 복제본이 작동하지 않습니다.

로컬 시스템의/etc/hosts 파일을 Gitlab 서버의 IP 주소로 업데이트하면 암호없이 잘 복제됩니다. [내 프로파일을 Gitlab의 SSH 공개 키로 업데이트했습니다].

그래서 나는 Nginx Server를 통해 클라이언트 시스템에서 Gitlab Server로 SSH 통신을 터널링 할 수있는 규칙으로 Nginx Configuration을 업데이트해야한다는 결론에 도달했습니다.

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; 
} 
} 

을하지만이 작동하지 않습니다 :

는 다음과 같이 변경 작업하여이 Link의 코드를 시도했다. 누군가가 규칙을 조정하여 효과를 발휘하도록 도와 준다면 좋을 것입니다.

참고 : 위의 코드 192.168.61.102에서 내 gitlab 서버의 IP 주소입니다, 내 Nginx에 서버가 192.168.61.101

답변

1

먼저 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을 변경해야 할 수 있습니다.

sudo sysctl -p 

:

net.ipv4.ip_forward=1 

그런 다음 당신은 그냥이 명령으로 변경 구성을 다시로드 :


그런 다음 당신은 /etc/sysctl.conf 파일을 편집하고이 줄을 주석 처리 패킷 포워딩을 활성화해야

마지막으로 iptables 규칙은 기본적으로 영구적이지 않으므로 지울 것입니다. 서버를 재부팅 할 때. 패키지를 영구 보존하는 가장 쉬운 방법은 iptables-persistent 패키지를 사용하는 것입니다. 이 같은 해당 패키지를 설치

sudo apt-get install iptables-persistent 

을 그리고 그것이 설치 후 저장 /이 명령과 함께 언제든지의 iptables 규칙을 복원 할 수 있습니다

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

을 우분투 16 일 경우.04 이상이면 명령은

sudo netfilter-persistent save 
sudo netfilter-persistent reload 

입니다. 규칙을 작동시키고 테스트 한 후에 저장 명령을 실행하려고합니다. 그런 다음 서버가 재부팅되면 저장 한 규칙이 자동으로로드됩니다.

+0

매우 자세한 정보와 함께 유익한 정보를 보내 주시면 감사하겠습니다. 한번 해보신 후 Nginx 코드의 목적/용도는 무엇입니까? (출처 : [link] (https://gist.github.com/fnando/) 1101211)) 나는 그 질문에서 언급했는데, 그것은 나의 시나리오에서 도움이되지 않습니까? –

+0

Nginx 코드는 HTTP 요청을 Gitlab 호스트로 전달하는 데 사용되지만 SSH 포트 인 포트 22에서 수신하도록 설정되어 있습니다. 그것은 포트 80에서 듣고 있어야합니다. – BrokenBinary

+0

다음 코드는 "SSH 터널을위한 Nginx 구성"이라는 제목으로이 링크에서 언급 한 코드가 잘못된 생각을 내고 있습니까? –

1

Nginx의 프록시는 HTTP 요청을위한이다.

SSH를 통해 복제 할 때 http를 사용하지 않습니다.

라우터에서 포트 포워딩이나 서버의 iptable과 같은 것을 사용해야합니다.

+0

그렇다면 Nginx 코드의 목적/용도는 무엇인가요? (출처 : [link] (https://gist.github.com/fnando/1101211)) 제가 질문에서 언급했듯이, 제 도움이되지 않습니다. 대본? –

+1

해당 코드의 목적은 포트 80에서 수신 된 http 요청을 포트 3000의 localhost로 리디렉션하는 것입니다. 그러나 항상 리디렉션되는 http 트래픽입니다. 그래서 코드로 외부 세계 등에서 gitlab 웹 인터페이스에 액세스 할 수 있지만 ssh 요청을 nginx 프록시를 사용하여 http로 변환 할 수는 없습니다. BrokenBinary의 iptables에 대한 대답은 갈 길입니다. – Jawad

+0

다음은이 [link] (https://gist.github.com/fnando/1101211)에서 "SSH 터널을위한 Nginx 구성"이라는 제목의 코드가 잘못된 생각을 내고 있습니까? –