2016-01-30 41 views
1

我們正在使用MUP將流星部署到AWS。幾周前我們很興奮,現在我們可以切換到免費的證書,這要歸功於LetsencryptKadira。一切工作都非常好,直到我在日誌中意識到客戶端IP不再通過代理傳遞了......無論我做什麼,我都將127.0.0.1視爲我的客戶端IP。我試圖在使用this.connection.clientIPheaders包的方法中找到它。通過MUP和SSL獲取真實IP

那麼,在深入研究和深入研究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" 

所以,當天的問題。通過SSL使用MUP,有沒有辦法獲得傳遞客戶端IP地址?

回答

0

好的,所以經過一個不眠之夜並且學習了我可以瞭解的一切方法以及STUD和HAProxy協議的工作方式後,我得出了一個簡單的結論,它根本不被支持。

我知道我可以很容易地回到Nginx的SSL終端,但我想確保我的部署具有自動化作爲MUP。

解決方案? MUPX。 MUP的下一個版本,但仍在開發中。它使用Docker並直接在Nginx上進行SSL終止。

所以你有它。課? Stable並不總是一個解決方案。 :)

0

我知道你說你已經嘗試使用headers,但你可以再試一次,看看你是否可以這樣做。我在x轉發時遇到了很多問題,因爲計數不一致,但如果從頭部鏈中拉出,[0]始終是客戶端IP。

將這個代碼在你的/服務器文件夾:

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對象中訪問它。

+0

問題是,我無法在配置中的任何地方得到IP ...它甚至不會被髮送到nginx,因爲SSL正在終止在stud –

0

順便說一句,在你列入nginx的配置,我認爲你需要使用real_ip_header X-Forwarded-For;使real_ip將使用該頭定位客戶機IP,你也應該設置real_ip_recursive on;,這樣它會忽略你的信任set_real_ip_from

+0

這並沒有幫助仍然得到'127.0.0.1'全線 –