在Docker容器中运行的Node应用程序如何获取IP地址?

4

我有一个在Docker容器中运行的node express应用程序,通过该应用程序我尝试记录传入请求的IP地址。由于我在防火墙后面运行所有内容,因此我使用了类似于这样的内容"req.headers['x-forwarded-for'] || req.connection.remoteAddress",但它每次记录相同的IP地址,无论请求来源如何。即使从不同的IP发起请求,我始终看到相同的IP。

有没有一种优雅的方法来记录在docker容器中运行的node应用程序的IP地址?使用这个软件包能帮助吗?https://www.npmjs.com/package/ip

如果不能,请建议一种捕获IP地址的方法。


你有没有一个可以为你设置 x-forwarded-for 的反向代理?在这种情况下,防火墙无关紧要。而网络地址转换(NAT)或者配置错误的反向代理是重要因素。 - user4466350
不确定...有没有一个地方可以检查一下呢? - Sai
是的,当我使用它时,我看到同一个IP地址一遍又一遍地被记录。即使请求来自不同的IP地址,我在所有请求中都看到相同的IP地址。 - Sai
有人能帮我解决这个问题吗?我还卡在这里。 - Sai
所以我尝试了“request-ip”、“forwarded-for”包,但仍然没有运气,我在日志中得到了一个IP,但那不是我的真实IP。 - Sai
显示剩余4条评论
2个回答

0

我知道这个很老了,但这可能仍然有所帮助。

对我有效的是我的Express容器和在主机上运行作为反向代理的NGINX的组合。

对于NGINX,我添加了以下设置:

    proxy_pass http://localhost:9461;               # <-- put the exposed port of the Docker Express container
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

有了上述内容,一旦我通过指定的NGINX server_name 访问我的Express容器,请求的IP将存储在req.headers['x-forwarded-for']中:

    console.log("IP of this request is:", req.headers['x-forwarded-for']);

0
const {exec} = require('child_process');

let hostname = 'localhost';
exec("ip route | awk '/default/ {print $3}'", (error, stdout) => {
    if (error) {
        console.error('cannot get outer ip address for wrapper service', error);
    } else {
        hostname = stdout.replace(/\n/, '');
    }
});

在那之后,hostname变量中包含了主机的IP地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接