Nginx/Apache 访问规则
一、Nginx 访问规则
Nginx的访问规则基于模块原生支持 (无需额外安装插件),配置语法为指令式 ,核心通过allow/deny、if判断、location匹配实现精细化控制,所有规则可组合嵌套使用。
规则1:IP/IP段访问控制
控制指定IP/IP段能否访问全站/指定目录/指定资源,是防挖矿、防暴力破解的基础,直接封禁矿池IP(如31.56.209.53)、攻击源IP。
(1)控制全站IP访问
nginx
server {
listen 80;
server_name your-domain.com;
root /usr/share/nginx/html;
# 先封禁恶意IP(矿池IP/攻击源IP,优先匹配)
deny 31.56.209.53; # 单个矿池IP
deny 192.168.1.226; # 单个攻击源IP
deny 10.0.0.0/8; # 整个IP段(按需封禁)
# 再允许合法IP(内网段/可信IP)
allow 192.168.2.0/24; # 内网段
allow 127.0.0.1; # 本机
# 兜底规则:禁止所有未匹配的IP(如需允许所有,改为allow all;)
deny all;
}
(2)控制指定目录IP访问(如/admin后台/敏感目录)
仅允许内网访问后台,封禁所有外网IP,精准防护:
nginx
server {
listen 80;
server_name your-domain.com;
# 仅允许内网访问/admin目录,其他IP全部封禁
location /admin/ {
allow 192.168.2.0/24;
deny all;
root /usr/share/nginx/html;
}
}
规则2:用户代理(UA)封禁
精准拦截挖矿程序/恶意爬虫
挖矿程序(如xmrig、dbus-sys-mon)、恶意爬虫的UA会包含特征关键词,直接封禁这类UA,阻止其发起请求(核心防挖矿规则)。
nginx
server {
listen 80;
server_name your-domain.com;
# 封禁包含挖矿/恶意爬虫关键词的UA,返回403
if ($http_user_agent ~* (xmrig|miner|sys-mon|dbus-|curl/7|wget|Python-urllib|Scrapy|Bot/9.0|PostmanRuntime)) {
return 403; # 也可返回404,伪装资源不存在,更隐蔽
}
# 可选:仅允许合法浏览器UA访问(兜底,避免非浏览器程序访问)
if ($http_user_agent !~* (Chrome|Firefox|Safari|Edge|Opera|Mobile)) {
return 403;
}
}
~*:表示忽略大小写匹配,覆盖所有大小写变种的UA;- 可根据实际攻击情况添加关键词(如挖矿程序的进程名、恶意爬虫标识)。
规则3:请求方法限制
禁止危险方法,防止攻击
Web服务器正常业务仅需GET(获取资源)、POST(提交数据)、HEAD(探测头),PUT/DELETE/OPTIONS/TRACE等方法多被用于漏洞利用、端口扫描,直接禁止。
nginx
server {
listen 80;
server_name your-domain.com;
# 仅允许GET/POST/HEAD,其他方法返回403
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 403;
}
}
规则4:目录/文件精细化访问控制
防止敏感信息泄露
禁止访问隐藏文件 (如.git、.env、.conf)、敏感后缀文件 (如sql、log、sh、py)、空目录,防止攻击者获取服务器配置、日志、源码(挖矿攻击者常扫描这类文件找漏洞)。
nginx
server {
listen 80;
server_name your-domain.com;
# 1. 禁止访问所有隐藏文件(以.开头,如.git/.env)
location ~ /\. {
deny all;
return 403;
}
# 2. 禁止访问敏感后缀文件(日志/配置/脚本/数据库文件)
location ~ \.(sql|log|sh|py|conf|bak|tmp|rar|zip)$ {
deny all;
return 403;
}
# 3. 禁止访问空目录(防止目录遍历)
location ~ /$ {
autoindex off; # 关闭目录索引
try_files $uri $uri/index.html =404;
}
# 4. 禁止访问指定敏感目录(如config/Logs/backup)
location ~ /(config|Logs|backup|tmp)/ {
deny all;
return 403;
}
}
规则5:单IP访问频率限流
防CC攻击,秒级精细化控制
通过Nginx的ngx_http_limit_req_module模块实现秒级限流(比iptables的分钟级限流更精准),限制单IP单位时间内的请求数,防止挖矿程序/攻击者发起海量请求耗尽服务器资源。
步骤1:在http{}块定义限流区域(全局生效)
编辑Nginx全局配置/etc/nginx/nginx.conf,在http{}中添加:
nginx
http {
# 定义限流区域:zone=cc_limit:10m(区域名cc_limit,内存10M,可存约1万IP)
# rate=10r/s(单IP每秒最多10个请求),也可设rate=60r/m(每分钟60个)
limit_req_zone $binary_remote_addr zone=cc_limit:10m rate=10r/s;
# 可选:限制单IP同时最大连接数
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_conn conn_limit 5; # 单IP同时最多5个连接
}
步骤2:在server{}块启用限流规则(站点生效)
nginx
server {
listen 80;
server_name your-domain.com;
# 启用请求限流
limit_req zone=cc_limit burst=20 nodelay;
# burst=20:允许瞬间突发20个请求(应对正常用户的峰值操作,如点击按钮)
# nodelay:突发请求不排队,直接处理,超过则返回503,避免用户等待
}
规则6:防盗链访问控制
禁止他人盗用静态资源
防止其他网站盗用你的图片、视频、CSS/JS、下载文件 等静态资源,仅允许自己的域名、内网IP、直接访问的请求引用资源,节省带宽并防止资源被滥用。
nginx
server {
listen 80;
server_name your-domain.com;
# 对所有静态资源做防盗链控制(jpg/png/gif/mp4/css/js等)
location ~* \.(jpg|png|gif|mp4|avi|css|js|zip|rar)$ {
# 合法的referer来源:none(直接访问,无referer)、server_names(自己的域名)、内网IP
valid_referers none server_names your-domain.com www.your-domain.com 192.168.2.0/24;
# 非合法referer,返回403(也可重定向到自己的403图片,如rewrite ^/ https://your-domain.com/403.jpg permanent;)
if ($invalid_referer) {
return 403;
}
expires 7d; # 可选:静态资源缓存7天,提升访问速度
}
}
valid_referers:定义合法的来源地址,Referer是请求头中的字段,标识请求的来源;- 适合图片、视频类站点,或对带宽敏感的服务器。
规则7:基于Referer的访问控制
与防盗链类似,可限制全站/指定接口仅允许从自己的域名发起请求,防止跨站伪造请求(CSRF),适合有接口提交的站点:
nginx
server {
listen 80;
server_name your-domain.com;
# 仅允许从自己的域名访问/api接口(提交数据的接口)
location /api/ {
valid_referers your-domain.com www.your-domain.com;
if ($invalid_referer) {
return 403;
}
proxy_pass http://127.0.0.1:8080; # 对接后端接口
}
}
二、Apache 核心访问规则
Apache的访问规则基于模块实现 (核心模块mod_authz_host/mod_rewrite/mod_setenvif默认开启),配置语法为标签式 (<Directory>/<FilesMatch>/<Limit>),规则逻辑与Nginx一一对应,保证功能一致,适合传统项目/老服务器。
规则1:IP/IP段访问控制
对应Nginx,封禁矿池IP/允许内网
通过Allow/Deny指令实现,核心注意**Order deny,allow**(执行顺序:先执行deny,再执行allow,兜底为allow),反之Order allow,deny兜底为deny。
(1)控制全站IP访问
apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/html
# 封禁恶意IP(矿池/攻击源)
Deny from 31.56.209.53
Deny from 192.168.1.226
# 允许合法IP
Allow from 192.168.2.0/24
Allow from 127.0.0.1
# 执行顺序:先deny,后allow,未匹配的IP默认allow(如需默认deny,改为Order allow,deny)
Order deny,allow
</VirtualHost>
(2)控制指定目录IP访问
如/admin后台
通过<Directory>标签匹配目录,精准控制:
apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/html
# 仅允许内网访问/admin目录
<Directory /var/www/html/admin>
Allow from 192.168.2.0/24
Deny from all
Order allow,deny # 先allow,后deny,兜底deny
</Directory>
</VirtualHost>
规则2:用户代理(UA)封禁
拦截挖矿程序/恶意爬虫,核心防挖矿
通过mod_setenvif模块匹配UA关键词,结合Deny from env=实现封禁,与Nginx的UA封禁功能完全一致。
apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/html
# 匹配挖矿/恶意爬虫UA关键词,设置环境变量BAD_UA
SetEnvIf User-Agent "xmrig|miner|sys-mon|dbus-|curl/7|wget|Python-urllib" BAD_UA
# 封禁包含BAD_UA环境变量的请求
Deny from env=BAD_UA
</VirtualHost>
- 多个UA关键词用
|分隔,忽略大小写(Apache默认UA匹配不区分大小写)。
规则3:请求方法限制
禁止危险方法
通过<LimitExcept>标签仅允许指定请求方法,其他方法全部禁止,比Nginx的if判断更直观。
apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/html
# 仅允许GET/POST/HEAD,其他方法全部Denied
<LimitExcept GET POST HEAD>
Deny from all
</LimitExcept>
</VirtualHost>
规则4:目录/文件精细化访问控制
防止敏感信息泄露
通过<FilesMatch>/<Directory>标签匹配文件/目录,禁止访问隐藏文件、敏感后缀文件,与Nginx功能一致。
apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/html
# 1. 禁止访问所有隐藏文件(以.开头)
<FilesMatch "^\.">
Deny from all
</FilesMatch>
# 2. 禁止访问敏感后缀文件
<FilesMatch "\.(sql|log|sh|py|conf|bak|tmp)$">
Deny from all
</FilesMatch>
# 3. 禁止访问指定敏感目录
<Directory /var/www/html/(config|Logs|backup)>
Deny from all
</Directory>
# 4. 关闭目录索引,防止目录遍历
Options -Indexes
</VirtualHost>
Options -Indexes:关闭Apache的目录索引功能,访问空目录时不会显示文件列表。
规则5:单IP访问频率限流
防CC攻击
通过Apache的mod_ratelimit模块实现限流,限制单IP的请求频率和带宽,默认模块已开启,直接配置即可。
apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/html
# 开启基于IP的限流
RateLimitByIP on
# 单IP每秒最多10个请求
RLimitReqPerSec 10
# 单IP同时最多5个连接
RLimitConnPerIP 5
# 可选:限制单IP带宽为100K/s,防止大文件盗用
RLimitBandwidth 102400
</VirtualHost>
规则6:防盗链访问控制
禁止静态资源盗用
通过mod_rewrite模块(URL重写)实现,匹配Referer来源,非合法来源直接返回403,是Apache实现防盗链的标准方式。
apache
<VirtualHost *:80>
ServerName your-domain.com
DocumentRoot /var/www/html
# 开启rewrite引擎(必须)
RewriteEngine On
# 匹配静态资源后缀
RewriteCond %{REQUEST_URI} \.(jpg|png|gif|mp4|css|js)$ [NC]
# 排除合法的referer:无referer(直接访问)、自己的域名、内网IP
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !your-domain.com [NC]
RewriteCond %{HTTP_REFERER} !192.168.2.0/24 [NC]
# 非合法来源,返回403(F=Forbidden,L=Last,停止后续规则)
RewriteRule .* - [F,L]
</VirtualHost>
[NC]:忽略大小写匹配,[F]:返回403,[L]:停止执行后续rewrite规则。
三、Nginx/Apache 配置通用注意事项
- Nginx语法 :所有指令必须以分号;结尾 ,
{}包裹块配置,注释用#;配置错误会导致服务无法启动,务必执行nginx -t检查语法。 - Apache模块 :部分高级规则依赖模块(如
mod_rewrite/mod_ratelimit),默认已开启,如需确认执行:apache2ctl -M(Ubuntu)/httpd -M(CentOS)。 - 生效方式 :修改配置后不要直接重启服务 ,执行重新加载 (不中断业务):
- Nginx:
systemctl reload nginx - Apache:
systemctl reload apache2(Ubuntu)/systemctl reload httpd(CentOS)
- Nginx:
- 规则执行顺序 :精准规则 > 通用规则 ,目录规则 > 全站规则,配置时将精准封禁/允许规则放在前面。
- 联动防火墙 :Web服务器的访问规则是应用层精细化防护 ,需与Linux网络层防火墙(iptables/ufw) 配合,形成双层防护 :
- 防火墙:封禁恶意IP段、限制端口访问、分钟级限流;
- Web服务器:封禁单个恶意IP、拦截挖矿UA、秒级限流、精细化目录控制。
四、配置验证方法
配置后通过curl命令模拟各种请求,验证规则是否生效(服务器本地执行,或外网机器执行):
1. 模拟恶意IP访问
bash
# 模拟IP 31.56.209.53访问,应返回403
curl -x 31.56.209.53:80 https://your-domain.com
# 或用--header模拟IP(部分场景)
curl --header "X-Real-IP: 31.56.209.53" https://your-domain.com
2. 模拟挖矿UA访问
bash
# 模拟xmrig挖矿UA,应返回403
curl --user-agent "xmrig/6.20.0" https://your-domain.com
3. 模拟危险请求方法
bash
# 模拟PUT方法,应返回403
curl -X PUT https://your-domain.com
4. 模拟盗链访问
bash
# 模拟从其他域名(baidu.com)引用资源,应返回403
curl --referer "https://www.baidu.com" https://your-domain.com/1.jpg
如果上述请求均返回403 Forbidden,说明访问规则已成功生效!