从节点服务器

时间:2015-09-12 18:36:01

标签: xml node.js filesystems ip blacklist

我试图在我的服务器中获取IP禁用功能。 因为我没有找到适合的模块,所以我试着写自己的模块。

现在我正在考虑实施以下内容的最佳方式:

能够在一定时间内禁止某个IP。

现在(我刚刚开始),我有:

带有

的XML
<root>
    <entry IP="123.123.123.123">
        <time>13.09.2015</time>
    </entry>
</root>

和相应的检查功能

module.exports.checkBan = function(ip) {

fs.readFile(__dirname + '/ban.xml', function(err, data) {
    var banned = false;
    if (err) {
        console.log(err);
    } else {
        parser.parseString(data, function(err, result) {
            var length = result['root']['entry'].length;

            for (i=0; i<length; i++) {
                if (ip == result['root']['entry'][i]['$']['IP']) {
                    return true;
                }
            }
            return false;
        });
    }
});
};
然而,问题出现了:

checkBan函数没有布尔值,因为它是异步的。 这意味着,每个(!)请求必须等到函数返回,然后才能处理(如果客户端被禁止)。 这将产生大量不必要的等待开销......我想? 如果我实施承诺,即使它们被禁止,也会提供请求,我认为。 顺便说一句:那些回报不起作用,我已经注意到了:(

这是怎么做的&#34;大&#34;网站? 它是如何完成的?

我希望最大限度地减少对ip-blacklist的访问时间,并最大限度地减少每个请求的访问开销,同时仍然能够检查是否禁止了ip。 我怎么能做到这一点?

感谢

1 个答案:

答案 0 :(得分:0)

这应该真正应该在机器级别或Web服务器上实现。我认为最简单的步骤是首先在您的服务器上使用iptables阻止特定的IP访问您的计算机。大型网站将使用fail2ban或类似网站阻止IP范围或监控恶意流量。

nginx和apache都内置了模块,允许您使用Web服务器中的配置允许和拒绝某些IP地址,以阻止流量。

如果你真的很自己实施这个,我不会经常从文件中读取。如果足够小,我会将IP加载到内存中,如果内存太大,甚至是数据库,就会加载redis。根据您的节点的Web框架,如果您使用的是,如果它支持中间件,那么我将实现逻辑以检查IP列表,作为在它到达任何应用程序路由之前执行的中间件的一部分。