如何配置Nginx Ingress:无规则匹配/直连IP时不返回任何响应?
可行,以下是满足PCI合规要求的Nginx Ingress配置方案
核心思路
通过Nginx Ingress Controller的配置,实现三个核心目标:
- 移除默认后端,无匹配规则时直接关闭连接(返回444状态码,无响应内容)
- 启用严格SNI验证,拒绝域名不匹配的证书请求
- 强制HTTPS,仅返回带有效证书的TLS响应
1. 配置Nginx Ingress Controller的ConfigMap
修改Controller的ConfigMap,禁用默认后端并开启严格SNI验证:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-ingress-controller namespace: kube-system # 根据你的Controller实际命名空间调整 data: ssl-strict-sni: "on" default-backend-service: "" # 清空默认后端,无匹配规则时返回444 force-ssl-redirect: "true" # 全局强制HTTPS重定向
ssl-strict-sni: "on":当客户端SNI与Ingress配置的域名不匹配时,Nginx直接关闭连接,不会返回不匹配的证书default-backend-service: "":移除默认后端服务,无匹配规则的请求直接返回444状态码(连接断开,无响应内容)
2. 配置合法域名的Ingress资源
为每个需要支持的合法域名配置Ingress,确保绑定有效证书:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: production-domain-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/secure-backends: "true" spec: tls: - hosts: - your-valid-domain.com secretName: your-valid-tls-secret # 存储对应域名有效证书的Secret rules: - host: your-valid-domain.com http: paths: - path: / pathType: Prefix backend: service: name: your-backend-service port: number: 80
- 每个Ingress仅绑定一组合法域名和对应的有效证书
ssl-redirect确保HTTP请求强制跳转至HTTPSsecure-backends确保Ingress与后端服务之间的通信也使用HTTPS(可选,根据后端安全需求调整)
3. 验证效果
- IP直接访问测试:执行
curl -v https://<ingress-controller-ip>,会看到连接被直接关闭,无任何响应内容 - 域名不匹配测试:执行
curl -v https://invalid-domain.com --resolve invalid-domain.com:443:<ingress-controller-ip>,同样会直接断开连接,不会返回证书 - 合法域名测试:访问
https://your-valid-domain.com,会正常返回带有效证书的TLS响应,并路由到后端服务
注意事项
- 确保使用的Nginx Ingress Controller版本支持
ssl-strict-sni配置(一般v0.29.0及以上版本支持) - 所有TLS证书必须为对应域名的有效证书,避免证书过期或不匹配
- 定期检查Ingress配置,确保没有遗留的默认后端或未授权的域名规则
内容的提问来源于stack exchange,提问作者James Hancock
相关产品推荐
相关产品推荐

