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,说明访问规则已成功生效

相关推荐
牛奶咖啡132 小时前
DevOps自动化运维实践_搭建UEFI网络引导的自动安装Ubuntu20及其更高版本系统
运维·自动化·devops·cloud-init·cloud-init自动应答·ubuntu24系统自动化安装·uefi网络引导自动安装部署
wanhengidc2 小时前
云手机与模拟器的关系
大数据·运维·服务器·分布式·智能手机
fresh hacker3 小时前
【Linux系统】通用的“系统排障”
linux·运维·服务器·网络·php
STKingA13 小时前
Win11 WSL2+Ubuntu开发环境配置全攻略
linux·运维·ubuntu
艾莉丝努力练剑4 小时前
【Linux:文件】文件基础IO进阶
linux·运维·服务器·c语言·网络·c++·centos
Agent产品评测局4 小时前
企业自动化项目,如何做好内部推广与员工培训?——企业级智能体落地与人才赋能实测指南
运维·人工智能·ai·chatgpt·自动化
艾莉丝努力练剑4 小时前
【MYSQL】MYSQL学习的一大重点:表的约束
linux·运维·服务器·开发语言·数据库·学习·mysql
gududexiao4 小时前
linux 设置tomcat开机启动
linux·运维·tomcat
夫礼者4 小时前
【极简监控】不骗篇幅!7个零运维成本的排障“微操”,让线上问题彻底左移
java·运维·监控
开开心心就好4 小时前
进程启动瞬间暂停工具,适合调试多开
linux·运维·安全·pdf·智能音箱·智能手表·1024程序员节