我们正在AWS经典ELB背后运行两个gitlab实例。为了通过git启用git SSH推送和负载均衡SSH请求,我们在AWS ELB中添加了SSH TCP端口侦听器。在SSH日志中,我们看到ELB的ips不是git用户的实际IP。我尝试在ELB上启用SSH侦听器的代理协议,但它破坏了SSH服务器。有没有办法看到客户真正的ips?
Nov 16 08:38:41 gitlab-1-1b sshd[14760]: Bad protocol version identification 'PROXY TCP4 x.y.z.a 0.0.0.0 61533 22' from x.y.z.a port 9407
Nov 16 08:39:08 gitlab-1-1b sshd[14825]: Bad protocol version identification 'PROXY TCP4 x.y.z.a 0.0.0.0 61554 22' from x.y.z.a port 9417
答案 0 :(得分:3)
作为mentioned here, ELB (Elastic Load Balancing,执行support multiple listener protocols):
充当转发代理(即不保留源IP)
所以你剩下的就是ELB Access Logs(作为mentioned there),因为X-Forwarded-For
是一个“应用程序级”协议,本身不适用于ssh。
ssh不容易实现。
通过https监听器启用相同的GitLab服务至少可以让您通过代理SSL支持将该用户IP置于X-Forwarded-For
,discussed in this GitLab thread或this one。
请注意recent GitLab (8.10 or more) would then require
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Port 443;
答案 1 :(得分:3)
实际上是可能。解决方案是mmproxy,由CloudFlare开发。它在每台后端计算机上本地部署,并在SSH服务器之前运行。当您在云负载平衡器中启用Proxy protocol
并建立连接时,“ mmproxy”会在将连接转发到本地SSH服务器时解析附加的标头并欺骗源IP。
我已经使用Google Cloud TCP proxy load balancer服务对其进行了测试,但是使用AWS ELB的工作方式应该相同。传入的连接由“ mmproxy”转发到“ localhost”,OpenSSH在该本地监听备用端口。
这是我经过测试的Google Cloud TCP proxy load balancer
服务和OpenSSH的配置:
# cat /etc/mmproxy-allowed-networks.txt
130.211.0.0/22
35.191.0.0/16
# grep Port /etc/ssh/sshd_config
Port 222
./mmproxy -v --allowed-networks /etc/mmproxy-allowed-networks.txt -l 0.0.0.0:22 -4 127.0.0.1:222 -6 [::1]:222
此外,您还必须部署自定义路由表,该表强制将返回流量路由到“环回”。对于“ localhost”,这是四个“ ip”命令,每次在计算机启动时都必须执行。