Nginx/Apache 访问规则

Nginx/Apache 访问规则

一、Nginx 访问规则

Nginx的访问规则基于模块原生支持 (无需额外安装插件),配置语法为指令式 ,核心通过allow/denyif判断、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 配置通用注意事项

  1. Nginx语法 :所有指令必须以分号;结尾{}包裹块配置,注释用#;配置错误会导致服务无法启动,务必执行nginx -t检查语法。
  2. Apache模块 :部分高级规则依赖模块(如mod_rewrite/mod_ratelimit),默认已开启,如需确认执行:apache2ctl -M(Ubuntu)/httpd -M(CentOS)。
  3. 生效方式 :修改配置后不要直接重启服务 ,执行重新加载 (不中断业务):
    • Nginx:systemctl reload nginx
    • Apache:systemctl reload apache2(Ubuntu)/systemctl reload httpd(CentOS)
  4. 规则执行顺序精准规则 > 通用规则目录规则 > 全站规则,配置时将精准封禁/允许规则放在前面。
  5. 联动防火墙 :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,说明访问规则已成功生效

相关推荐
荣--2 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森3 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜19 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
ping某5 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务