Nginx 通配符配置全解析:一不小心就把服务暴露了!
文章标签:
linux域名解析
在配置 Nginx 时,如果使用通配符(泛域名)(如 *.example.com 或 test.*.example.com),需要特别注意其匹配规则、优先级以及可能带来的安全和运维风险。下面是一些关键点和风险总结:
Nginx 配置时需要注意的点
1.server_name 的匹配优先级
Nginx 会根据以下规则确定哪个 server 匹配:
- 精确匹配优先(如 server_name www.example.com)
- 通配符前缀匹配(如 *.example.com)优先于后缀匹配
- 使用正则(~)的 server_name 最后匹配(但优先级可调)
注意:如果同时写了 test-aaa.example.com 和 test.*.example.com,会出现优先级不明晰的问题,容易导致访问跑到错误的虚拟主机。
2.通配符匹配风险
- *.example.com 会匹配任意一级子域名,包括攻击者伪造的域名,比如 malicious.example.com
- 如果使用 server_name _; 作为默认 catch-all,可能会让未授权域名也被处理,暴露服务内容
3.正则匹配配置误用
- 使用正则的 server_name ~^test\..*\.example\.com$ 容易出现性能问题,除非必要,避免使用正则。
- 正则配置还容易遗漏边界,比如 .* 会把意想不到的域名也匹配进来。
4.SSL 证书匹配问题
- 泛域名证书(如 *.example.com)不能匹配多级(如 a.b.example.com)
- 多个泛域名匹配可能共用一个证书,不适配时浏览器会报错
5.配置顺序影响行为
- nginx.conf 中多个 server 的书写顺序可能影响匹配顺序
- 通配符 server 写在默认 server 前面,避免误匹配
潜在风险汇总
风险类型 | 描述 |
域名劫持 | 如果通配过宽,被绑定的域名可能被恶意使用 |
证书错误 | 泛域名证书不覆盖所有子域名,HTTPS 报错 |
配置冲突 | 多个 server_name 匹配到同一个请求,排查困难 |
日志混乱 | 多个通配 server 共用日志路径时难以溯源 |
缓存污染 | 不同站点配置缓存但未隔离,易被污染 |
默认 server 泄漏 | 没有配置 default_server 会导致请求走到默认配置,暴露服务 |
安全建议
- 优先使用精确匹配,如 server_name app1.example.com;
- 控制通配粒度,比如 api-*.example.com 比 *.example.com 更安全
- 默认配置加 return 444; 拒绝不匹配的请求
- 给每个 server 设置唯一的访问日志,便于追踪
- 对 HTTPS 设置 ssl_certificate 和 ssl_certificate_key 时注意是否支持通配域名
- 使用 map 或 if ($host) 进行进一步控制访问逻辑(慎用)