- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
需要一些与为自定义应用程序创建自定义过滤器相关的帮助,该自定义应用程序是用 node.js 编写的 websocket 服务器。根据我从其他文章中的理解,自定义 node.js 应用程序需要编写一个日志,其中输入任何身份验证失败的尝试, Fail2ban 将进一步读取该日志以阻止有问题的 IP。现在我需要有关我的应用程序应该创建的日志示例的帮助,它可以被 fail2ban 读取或扫描,还需要示例来为 fail2ban 添加自定义过滤器以读取该日志以阻止 ip 进行暴力破解。
最佳答案
这是一个非常古老的问题,但我在谷歌中找到了它,所以我会写下答案。
最重要的是你记录的行需要有正确的时间戳,因为 fail2ban 使用它来禁止和取消禁止。如果日志文件中的时间与系统时间不同,fail2ban 将找不到它,因此在主机系统中设置正确的时区和时间。在给定的示例中,我使用了 UTC 时间和时区偏移量,一切正常。 Fail2Ban 识别不同类型的时间戳,但我没有找到描述。但是在fail2ban manual你可以找到两个例子。还有一个命令可以检查您的行是否被书面正则表达式识别。我真的推荐使用它。我还建议使用“正则表达式测试器”。例如this one .日志行的其余部分并不重要。您只需要传递用户 ip。
这是最重要的信息,但我也会写例子。我只是在学习所以我这样做是为了教育目的,我不确定给出的例子是否有意义但它有效。我在 Debian 10 上使用 nginx、fail2ban、pm2 和 node.js 进行快速处理,以禁止基于 google recaptcha 的空/错误发布请求。所以在你的系统中设置正确的时间:对于 debian 10 有效:
timedatectl list-timezones
sudo timedatectl set-timezone your_time_zone
timedatectl <-to check time
首先你需要在nginx中传递真实用户ip。 This helped me所以你需要在你的服务器 block 中添加一行。
sudo nano /etc/nginx/sites-available/example.com.
查找位置并添加此行:
location / {
...
proxy_set_header X-Forwarded-For $remote_addr;
...
}
更多关于 reverse proxy .现在在 node.js 应用程序中只需添加
app.set('trust proxy', true)
现在您可以使用以下方法获取用户 ip:
req.ip
让它与 recaptcha 一起工作:所有关于 recaptcha 的信息都在这里:Google Developers
当您获得用户响应 token 时,您需要向谷歌发送发布请求以验证它。我是用 axios 做的。这是发送post请求的方法。 secret 是你的 secret ,回应是用户的回应。
const axios = require('axios');
axios
.post(`https://www.google.com/recaptcha/api/siteverify?secret=${secret}&response=${response}`, {}, {
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
},
})
.then(async function (tokenres) {
const {
success, //gives true or false value
challenge_ts,
hostname
} = tokenres.data;
if (success) {
//Do something
} else {
//For fail2ban. You need to make correct timestamp.
//Maybe its easier way to get this but on my level of experience
//I did it like this:
const now = new Date();
const tZOffset = now.getTimezoneOffset()/60;
const month = now.toLocaleString('en-US', { month: 'short' });
const day = now.getUTCDate();
const hours = now.getUTCHours()-tZOffset;
const minutes = now.getUTCMinutes();
const seconds = now.getUTCSeconds();
console.log(`${month} ${day} ${hours}:${minutes}:${seconds} Captcha verification failed [${req.ip}]`);
res.send(//something)
}
设置正确时间的时区偏移。现在 pm2 将 console.log 指令保存在/home/youruserdir/.pm2/logs/yourappname-out.log 中的日志文件中
现在发出空的帖子请求。错误请求的示例行如下所示:
Oct 14 19:5:3 Captcha verification failed [IP ADRESS]
现在我注意到分钟和秒没有 0,但 fail2ban 仍然可以识别它们,所以没问题。但是请检查日期和时间是否与您的系统时间一致。
现在为 fail2ban 制作过滤器文件:
sudo nano /etc/fail2ban/filter.d/your-filter.conf
粘贴:
[Definition]
failregex = Captcha verification failed \[<HOST>\]
ignoreregex =
现在 ctrl+o,ctrl+x,你可以检查 fail2ban 是否会使用 fail2ban-regex 命令识别错误行:
fail2ban-regex /home/youruserdir/.pm2/logs/yourappname-out.log /etc/fail2ban/filter.d/your-filter.conf
结果将是:
Failregex: 38 total
|- #) [# of hits] regular expression
| 1) [38] Captcha verification failed \[<HOST>\]
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [38] {^LN-BEG}(?:DAY )?MON Day %k:Minute:Second(?:\.Microseconds)?(?: ExYear)?
`-
Lines: 42 lines, 0 ignored, 38 matched, 4 missed
[processed in 0.04 sec]
如您所见,有 38 个匹配。你会有一个。如果没有匹配项,请检查 pm2 日志文件。当我在本地主机上测试时,我的应用程序使用::127.0.0.1 提供了 IP 地址。可能是ipv6相关的。它可能会造成问题。
下一步:
sudo nano /etc/fail2ban/jail.local
添加以下 block :
[Your-Jail-Name]
enabled = true
filter = your-filter
logpath = /home/YOURUSERDIR/.pm2/logs/YOUR-APP-NAME-out.log
maxretry = 5
findtime = 10m
bantime = 10m
所以现在。请确保您编写的过滤器名称没有 .conf 扩展名。在 logpath 中一定要写正确的用户目录和日志名称。如果您在 10 分钟内 (finditme) 收到 5(maxrety) 个错误的帖子请求,则用户将被禁止 10 分钟。您可以更改此值。现在只需重新启动 nginx 和 fail2ban:
sudo systemctl restart nginx
sudo systemctl restart fail2ban
之后您可以使用命令检查您的 jail 是否正常工作:
sudo fail2ban-client status YOUR-JAIL-NAME
将记录找到了多少匹配项以及禁止了多少 ip。您可以在 fail2ban 日志文件中找到更多信息。
cat /var/log/fail2ban.log
Found IPADDR - 2021-10-13 13:12:57
NOTICE [YOUR-JAIL-NAME] Ban IPADDRES
我是一步一步写的,因为可能只有经验不足的人才会寻找它。如果您看到错误或者可以给我一些建议,请发表评论。
关于自定义 node.js 应用程序的 fail2ban 自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30866070/
我用运行 Node node --debug app OR node --debug-brk app 它有反应 debugger listening on port 5858 Express serv
这个问题在这里已经有了答案: What is the difference between (int *i) and (int* i) in context of both C and C++? [
我有一个应用程序,它通过消息队列将数据库写入命令分派(dispatch)给工作人员(数量非常大),因此无法保证它们的接收顺序。 我有两个 Node ,例如“Account”和“Media”。在此假设的
有没有办法在调用 ts-node 时将选项传递给 Node ?我正在尝试在 Node 中使用一个实验性功能,如果它能与 ts-node 一起使用,那就太好了。 这就是我目前正在做的事情: ts-nod
我有一个容器化的Node应用程序,它在DigitalOcean服务器上运行。当我更新服务器上的应用程序时,该应用程序必须关闭一小段时间。为了能够更新应用程序并避免停机,我目前正在阅读零停机时间部署/蓝
我正在编写一个 Node.js 应用程序。我正在使用 request 和 Cheerio 加载一组 URL 并获取该网站的大量信息,现在假设我想要获取的只是标题: var urls = {"url_1
如果不弹出以下错误,我无法安装任何 Node.js 模块。错误代码引用package.json文件。如果知道为什么会发生这种情况,我们将不胜感激。 最佳答案 这些不是错误,它们只是警告。一切都应该如此
如果我运行(从我的项目目录中): supervisor javascripts/index.js 我得到:/usr/bin/env: Node :没有这样的文件或目录 如果我运行: node java
我已遵循使用 Node-Inspector 的所有步骤 但是当我打开应用程序时,我在控制台上看不到任何脚本或日志。 我的应用程序在端口 4000 上运行。我认为唯一可能发生冲突的是端口 8080 上的
我在android中使用rxjava2,有时会遇到这样的问题: Observable.fromArray( // maybe a list about photo url in SD
我目前正在使用 Node 光纤来编写同步服务器端代码。我主要通过 try-catch block 进行错误处理,但外部库或其他小部分异步代码中总是有可能发生错误。我正在考虑使用新的域功能来尝试将这些错
看起来node-debug是node-inspector周围的一个shell?分别什么时候应该使用? 最佳答案 如果您安装node-debug,您只能访问node-debug命令。 如果您安装node
我目前正在代理后面工作,该代理不允许我执行此命令的 HTTP GET 请求阶段: Node node-sass/scripts/build.js 请求阶段: gyp http GET https://
听说node js可以用在服务端。我以前用过jsp。 jsp页面内部的java代码对客户端是不可见的。如果 Node js 只是 javascript,那么它如何对客户端不可见? 最佳答案 首先,No
我正在为 Node native 插件从 node-waf 构建迁移到 node-gyp 构建系统。 node-gyp 说它支持多个目标版本,但我在使用 node-gyp 时找不到如何指定目标 Nod
给定一个 $node ,我正在尝试在以下两种输出该 $node 的方式之间做出决定。 要么 $output = theme('node', $node); 或 node_build_content($
如果package.json中的窗口A打开一个新窗口B,node-main如何访问它?这是我的代码: package.json { "main": "index.html",
我试图在我的 xml 中的特定节点 ( ) 之前插入一个注释节点。这是它的方法: function test(xmlResponse) { var parser = new DOMParse
我正在尝试做npm install wrtc使用 Node 版本 16.14.0 但这还没有完成。它在给npm error code 1所以我试图将 Node 版本更改为以前的 lts 14.19.0
当我在 Visual Studio 中运行 Node.js 应用程序时,我收到以下消息:DeprecationWarning: 'node --debug' 和 'node --debug-brk'
我是一名优秀的程序员,十分优秀!