如何查看在AWS ELB后面运行的SSH服务器的SSH客户端的真实IP

时间:2016-11-17 10:09:43

标签: amazon-web-services ssh gitlab amazon-elb

我们正在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

2 个答案:

答案 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-Fordiscussed in this GitLab threadthis 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”命令,每次在计算机启动时都必须执行。