【发布时间】:2015-12-09 03:05:37
【问题描述】:
我正在尝试在我的服务器中加入 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 函数没有布尔值,因为它是异步的。 这意味着,每个(!)请求都必须等到函数返回,然后才能处理(或者不处理,如果客户端被禁止)。 这会产生很多不必要的等待开销......我想? 我假设,如果我履行承诺,即使他们被禁止,请求也会得到满足。 顺便说一句:这些回报不起作用,正如我所注意到的:(
这是如何在“大”网站中完成的? 它是如何正确完成的?
我想尽量减少对 ip-blacklist 的访问时间,并尽量减少每个请求的一般访问开销,同时仍然能够检查 ip 是否被禁止。 我怎样才能做到这一点?
谢谢
【问题讨论】:
-
较大的网站会在网络服务器上使用fail2ban 之类的东西,并在请求到达您的应用程序之前对其进行过滤。我知道 nginx 你可以定义一个你想要阻止的 IP 地址文件并将其添加到配置中。您的节点应用程序使用什么 Web 框架(如果有)?
-
我只使用快递。我可以使用例如fail2ban 与节点服务器?我想这需要进一步阅读……最简单的方法是什么?谢谢:)
-
可能有办法,但我没有这样做的经验。如果您担心这是一个生产环境,您可能不会只是单独运行节点。 if 应该在某种网络服务器(如 apache 或 nginx)的后面
-
好吧,我打算只发布节点服务器。但你是对的,这实际上是我的第一个节点项目,所以我对整个系统相当陌生。所以你说我会运行一个 apache 来处理请求并将它们转发到我的节点?你有一些提示我可以用谷歌搜索以更好地理解整个过程吗?
-
我的经验是使用 nginx。谷歌 nginx 节点反向代理。不过同样适用于 Apache。它称为反向代理
标签: xml node.js filesystems ip blacklist