[英]Can Google Cloud Dataflow be run without an external IP address in Go?
[英]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.