繁体   English   中英

Cloud Run 服务未获取客户端正确的 IP 地址

[英]Cloud Run Service not picking up client correct IP address

我在 Google Cloud Run 上托管了一项服务。 只要服务启动并运行,该服务就会使用 socket.io。

当套接字客户端连接到服务时,我有以下 function 从套接字获取已连接客户端的 ip 地址,如下所示,然后我用检索到的 IP 点击此GeoPlugin 链接

    async getSocketIP(socket) {
        let { headers, address } = socket.handshake;
        let { origin } = headers;
        let ip = headers['x-forwarded-for'];
        let userAgent = headers['user-agent'];
        try {
            let locationPointUrl = `http://www.geoplugin.net/json.gp?ip=${ip}`;
            let { data: location } = await axios.get(locationPointUrl);
        } catch (e) {
            console.log(`Error get client online IP on Socket IO`);
        }
    }

不幸的是,无论用户的位置如何,IP 总是解析为美国。

我有一个自定义域通过域映射映射到云运行服务。

Client 的 IP 始终是 US IP 的原因可能是什么?

请注意,当托管在 Heroku 上时,相同的服务会获得已连接客户端的正确 IP 地址。

所以,我非常肯定它与Cloud Run有关。

我在 Cloud Run 上的所有服务都在 US-CENTRAL1 上

对于将来可能会遇到类似情况的任何人。

我们让 Cloudflare 坐在 Cloud Run 前面。

因此,要获得正确的客户端 IP 地址,我们所要做的就是从cf-connecting-ip header 而不是x-forwarded-for检索它。

因此,修改后的工作代码现在变为:

   async getSocketIP(socket) {
        let { headers, address } = socket.handshake;
        let { origin } = headers;
        let ip = headers['cf-connecting-ip'] ?? headers['x-forwarded-for']; //Notice the difference
        let userAgent = headers['user-agent'];
        try {
            let locationPointUrl = `http://www.geoplugin.net/json.gp?ip=${ip}`;
            let { data: location } = await axios.get(locationPointUrl);
        } catch (e) {
           console.log(`Error get client online IP on Socket IO`);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM