需要防护一下 nginx 被人爬么?有哪些工具推荐?

17 天前
 ethusdt

nginx 反代了很多服务,域名在 cf 上托管这,可以用 cf 的 WAF 规则来屏蔽机器人或者限制国家地区的访问,以及可以限制 10 秒内访问次数( ratelimit )。

但是你的服务器还会开放 80/443 端口,看 nginx 的 access.log 日志发现仍然有一些爬虫去扫目录,基本上是扫你 .env 或者一些敏感数据,99% 的访问都是 404 ,因为没有这些文件。虽然不怕被扫,但还是有点担心万一哪天忽略了什么东西放进里面,很容易被扫到。

对于 ssh 可以用 fail2ban-client 这种工具防止登录,会拉黑(使用 iptables)失败登录的 ip 。

但 nginx 呢?判断 UA 么?但伪造浏览器 UA 太容易了,甚至发现有人扫 nginx 时候竟然使用 UA 打广告(类似于在你日志里留下 xxx 到此一游)。

5373 次点击
所在节点    程序员
39 条回复
dzdh
17 天前
https://www.cloudflare.com/zh-cn/ips/
https://api.cloudflare.com/client/v4/ips
https://github.com/cevin/cloudflare-ip-sync

nginx 只允许这些 ip 访问就行了。

还有一种类似 cf 的 5 秒盾 https://anubis.techaro.lol/docs/
git.kernel.org 都在用
pckillers
17 天前
改 80 443 默认端口为其他非常规端口+ ip 直接访问返回空页面 能挡掉大量机器人扫描。
如果还是不行就只能订阅 waf 的 ip 列表然后只给 waf 开白名单了
ethusdt
17 天前
@pckillers 返回空白页没用呀,还是被扫。现在 80 端口返回的就是空白页。
evill
17 天前
fail2ban-client 可以根据 nginx 日志拉黑
这是我的一些配置
# nginx-sensitive.conf
[Definition]
failregex = <HOST> -.*"(GET|POST).*\.env(\?|$) HTTP/.*"
<HOST> -.*"(GET|POST).*/(_|\.)?env(\?|$) HTTP/.*"
<HOST> -.*"(GET|POST).*/\.git/(HEAD|config|index|objects|info)[^ ]*(\?|$)? HTTP/.*"
<HOST> -.*"(GET|POST).*/\.ht(access|passwd)(\?|$) HTTP/.*"
<HOST> -.*"(GET|POST).*(config\.ya?ml|config\.json)(\?|$) HTTP/.*"
<HOST> -.*"(GET|POST).*(composer\.(json|lock))(\?|$) HTTP/.*"
<HOST> -.*"(GET|POST).*wp-config\.php(\?|$) HTTP/.*"
<HOST> -.*"(GET|POST).*(database|dump)\.sql(\?|$) HTTP/.*"
<HOST> -.*"(GET|POST).*(backup|db)\.(zip|tar|gz)(\?|$) HTTP/.*"
<HOST> -.*"(GET|POST).*\.(bak|old|swp|~)(\?|$) HTTP/.*"
# nginx-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*" 404


# nginx-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*" 404
ignoreregex =root@tx-beijing:/etc/fail2ban/filter.d# cat nginx-bad-request.conf
# Fail2Ban filter to match bad requests to nginx

[Definition]
# The request often doesn't contain a method, only some encoded garbage
# This will also match requests that are entirely empty
failregex = ^<HOST> - \S+ \[\] "[^"]*" 400

datepattern = {^LN-BEG}%%ExY(?P<_sep>[-/.])%%m(?P=_sep)%%d[T ]%%H:%%M:%%S(?:[.,]%%f)?(?:\s*%%z)?
^[^\[]*\[({DATE})
{^LN-BEG}

journalmatch = _SYSTEMD_UNIT=nginx.service + _COMM=nginx


基本规则就是访问敏感文件直接永封,连续 404 或 400 关 7 天
killva4624
17 天前
fail2ban 也可以用来拦截扫描异常 HTTP 路径访问的 IP ,是一个通用工具,不限于 SSH
spritecn
17 天前
我也有 1 楼的想法,既然走了 cf 就直接点
importmeta
17 天前
# . files
location ~ /\.(?!well-known) {
deny all;
}
songco
17 天前
返回 zip 炸弹之内的可行吗?哈哈
Earthman
17 天前
WoneFrank
17 天前
不对外服务的可以加个 basic auth
julyclyde
17 天前
你已经用了 cdn 还用 iptables ?
benjaminliangcom
17 天前
有 CF WAF 也够了
ethusdt
17 天前
@benjaminliangcom 只能防域名爬虫,但防不了对 vps ip 直连的请求。
hero0earth
17 天前
过 2 周,我就把 WAF 开源了,相信能解决你的问题👍
studyingss
17 天前
1 楼的回复基本就是标准答案了,op 自动无视是有什么顾虑么
scegg
17 天前
既然用了 cf ,可以不要给 nginx 开 80/443 给公网了。用 cf tunnel 吧。
sslyxhz
17 天前
加一层 waf ,雷池, samwaf 之类的
anjing01
17 天前
梳理日志,用 ipset 过滤 ip 地址
ethusdt
17 天前
@studyingss 我找到方案了。用 1 楼给的 CF ip 列表(set_real_ip_from+X-Forwarded-For),然后搭配 fail2ban 规则(4 楼)。
lizhenda
17 天前
@scegg 好想法,大多数人都是只用 CF 的 DNS + 开启代理,cf tunnel 生产环境用靠谱么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1175567

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX