通过Gitlab服务器的Nginx代理进行的Git克隆不工作

通过Gitlab服务器的Nginx代理进行的Git克隆不工作,nginx,gitlab,reverse-proxy,ssh-tunnel,Nginx,Gitlab,Reverse Proxy,Ssh Tunnel,我的Nginx服务器充当Gitlab服务器的代理,问题是当我尝试“**git clone”时git@gitlab.example.com:username/project.git**“我无法克隆该项目[它不是从Nginx服务器到Gitlab服务器的隧道] 当我用Gitlab服务器的IP地址更新本地系统的/etc/hosts文件时,它可以在没有密码的情况下进行克隆[我在Gitlab上用SSH公钥更新了我的配置文件] 因此,我得出的结论是,我必须使用可以通过Nginx服务器将SSH通信从任何客户端系

我的Nginx服务器充当Gitlab服务器的代理,问题是当我尝试“
**git clone”时git@gitlab.example.com:username/project.git**
“我无法克隆该项目[它不是从Nginx服务器到Gitlab服务器的隧道]

当我用Gitlab服务器的IP地址更新本地系统的/etc/hosts文件时,它可以在没有密码的情况下进行克隆[我在Gitlab上用SSH公钥更新了我的配置文件]

因此,我得出的结论是,我必须使用可以通过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是我的gitlab服务器的IP地址,我的Nginx服务器位于192.168.61.101

Nginx代理用于http请求

通过SSH进行克隆时,您没有使用http


您需要做的是在路由器上使用端口转发或在服务器上使用iptables之类的功能。

首先,您需要停止让Nginx监听端口22。Nginx不处理SSH转发,防火墙处理

如果您使用的是iptables,那么这些规则将通过Nginx主机将所有请求转发到Gitlab主机

sudo iptables-t nat-A预路由-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调用rc.d iptables持久保存
sudo调用rc.d iptables持久重新加载
如果您使用的是Ubuntu 16.04或更高版本,那么这些命令是

sudo netfilter持久保存
sudo netfilter持续重新加载

在规则正常工作并进行了测试之后,您需要运行save命令。然后,当您的服务器重新启动时,您保存的规则将自动加载。

非常详细,信息非常丰富,谢谢您,一旦完成,您将尝试发布结果,但是我在问题中提到的Nginx代码(源代码:)的用途/用例是什么,在我的场景中,Nginx代码用于将HTTP请求转发到Gitlab主机,但您将其设置为侦听端口22,即SSH端口。它应该在端口80上监听。那么这个链接中提到的标题为“Nginx配置SSH隧道”的代码是不是给出了错误的想法?是的,写这篇文章的人似乎认为Nginx正在处理他们的SSH隧道,但事实并非如此。他们不知道自己在说什么。在我的Nginx服务器上,我将SSH端口从22更改为2201,并编写了您上面提到的规则,如:
sudo iptables-t nat-A PREROUTING-I eth0-p tcp-dport 22-j DNAT-到目标192.168.60.101:22
sudo iptables-t nat-APOSTROUTING-o eth0-p tcp--dport 22-j SNAT--source 192.168.60.100
,但是我在问题中提到的Nginx代码(source:)的用途/用例是什么,在我的场景中没有帮助吗?该代码的目的是将端口80上接收到的http请求重定向到端口3000上的本地主机。但重定向的总是http流量。因此,通过您的代码,您可以从外部世界访问gitlab web界面等,但是您不能使用nginx代理将ssh请求转换为http。BrokenBinary对iptables的回答是正确的。那么,本文中提到的标题为“SSH隧道的Nginx配置”的代码是否给出了错误的想法?