四层tcp访问控制是最有效轻量的数据库防护方式,通过nginx stream模块配置黑白名单、连接限制与超时策略,实现对mysql等端口的精准防护。

直接在四层(TCP 层)对数据库端口做访问控制,是最有效、最轻量的防护方式之一。它不依赖应用层协议解析,不增加业务延迟,还能提前拦截恶意连接——比如针对 MySQL 3306、Redis 6379 或 PostgreSQL 5432 的扫描和爆破。
用 stream 模块定义 TCP 代理并启用黑白名单
Nginx 的 stream 模块专为四层转发设计,必须单独启用(编译时需含 --with-stream)。所有 IP 控制逻辑都写在 stream{...} 块内,不能放在 http{...} 里。
- 确保 Nginx 配置中已开启 stream 模块(检查
nginx -V 2>&1 | grep -o with-stream) - 监听数据库端口(如 3306),用
proxy_pass转发到真实后端 -
allow和deny必须写在server块内,且按顺序逐条匹配 - 默认隐含
deny all,所以白名单只需写allow,无需显式加deny all
白名单模式:只放行可信运维与应用服务器
适用于核心数据库(如主库、敏感配置库),原则是“非授权即拒绝”。
- 只配置
allow规则,例如:allow 10.10.20.5;、allow 172.16.100.0/24; - 避免混用
deny,否则一旦顺序写错(比如deny在前),会导致整个白名单失效 - 若 IP 段较多,可抽离成独立文件(如
/etc/nginx/stream_whitelist.conf),再用include引入
黑名单模式:封禁已知攻击源,不影响正常流量
适合对外暴露的只读库或中间件代理,先放通大范围,再精准屏蔽。
- 先写宽泛的
allow(如内网段、云厂商 VPC 网段),再写具体的deny - 示例:
allow 10.0.0.0/8;→allow 192.168.0.0/16;→deny 203.0.113.105;→deny 203.0.113.106; - 可配合
geo变量动态加载黑名单(如从 Redis 或文件实时更新 $blocked 变量),实现热更新
增强防护:搭配超时与连接限制
单纯 IP 控制还不够,建议叠加基础连接防护,防止慢连接、SYN 泛洪等低阶攻击。
- 设置
proxy_timeout 3s;缩短空闲连接等待时间,加快异常连接释放 - 用
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;+limit_conn conn_limit 5;限制单 IP 并发连接数 - 添加
proxy_responses 1;防止客户端发大量无效包试探服务状态 - 重启前务必执行
nginx -t校验语法,stream 配置错误会导致整个 stream 服务不可用











