使用MUP和SSL获取真正的IP

时间:2016-01-30 08:45:54

标签: ssl meteor nginx https proxy

我们正在使用MUP进行AWS的Meteor部署。几周以前,我们很高兴我们现在可以切换到免费证书,感谢LetsencryptKadira。一切都运行得非常好,直到我在日志中意识到客户端IP不再通过代理传递...无论我做什么,我都会看到127.0.0.1作为我的客户端IP。我试图使用this.connection.clientIPheaders包来获取方法。

嗯,在深入研究和深入了解stub和nginx的工作原理之后,我得出的结论是,这种做法从未奏效。

我提出的最佳解决方案是使用proxy_protocol作为described by Chris,但我无法让它发挥作用。

我使用了/opt/stud/stud.conf的设置并尝试启用write-proxyproxy-proxy设置。

这就是我的nginx配置:

server {
  listen                80 proxy_protocol;
  server_name           www.example.com example.com;

  set_real_ip_from      127.0.0.1;
  real_ip_header        proxy_protocol;
  access_log            /var/log/nginx/example.access.log;
  error_log             /var/log/nginx/example.error.log;

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto http;
  }
}

以下是我在生产EC2服务器上的标题:

  accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
  accept-encoding:"gzip, deflate, sdch"
  accept-language:"en-US,en;q=0.8"
  cache-control:"no-cache"
  connection:"upgrade"
  host:"127.0.0.1:3000"
  pragma:"no-cache"
  upgrade-insecure-requests:"1"
  x-forwarded-for:"127.0.0.1"
  x-forwarded-proto:"http"
  x-ip-chain:"127.0.0.1,127.0.0.1"
  x-real-ip:"127.0.0.1"

那么,当天的问题。使用MUP和SSL,有没有办法获得传递客户端IP地址?

3 个答案:

答案 0 :(得分:0)

我知道你说你曾尝试使用headers,但是你可以再试一次,看看你是否可以这样做。我有很多问题x-forwarded-for计数不保持一致,但如果我从标题链中拉出来,[0]总是客户端IP。

将此代码放在/ server文件夹中:

Meteor.methods({
  getIP: function() {
    var header = this.connection.httpHeaders;
    var ipAddress = header['x-forwarded-for'].split(',')[0];
    return ipAddress;
  }
});

在浏览器控制台中:

Meteor.call('getIP', function(err, result){
  if(!err){
    console.log(result);
  } else {
    console.log(err);
  }
};

了解您从该回复中获得的内容。如果可行,您可以在Template.rendered上或在需要IP时调用该方法。

否则,我非常确定您应该能够将IP设置为nginx conf中的任意标头,然后直接在req对象中访问它。

答案 1 :(得分:0)

顺便说一句,在你包含的nginx配置中,我认为你需要使用real_ip_header X-Forwarded-For;以便real_ip将使用该标头来定位客户端IP,你还应该设置real_ip_recursive on;以便它会忽略您信任的set_real_ip_from

答案 2 :(得分:0)

好吧,所以在经历了一个不眠之夜并学习了关于STUD和HAProxy协议工作方式的一切之后,我得出了一个简单的结论,它根本就不受支持。

我知道我可以很容易地回到Nginx处终止SSL,但我想确保我的部署具有自动化作为MUP。

解决方案? MUPX。 MUP的下一个版本,但仍处于开发阶段。它使用Docker并直接在Nginx上进行SSL终止。

所以你有它。课? Stable并不总是一个解决方案。 :)