GCP K8s部署的Django后端遭谷歌等陌生主机访问的原因及屏蔽方案问询
问题描述
我在GCP的Kubernetes(Deployment/Service/Ingress)上部署了一套生产级Django后端服务器,配置如下:
ALLOWED_HOSTS = [BACKEND_URL,INGRESS_IP,THIS_POD_IP,HOST_IP]
一切运行正常,但后端服务器日志每天会出现约7条如下间歇性错误:
DisallowedHost: Invalid HTTP_HOST header: 'www.google.com'. You may need to add 'www.google.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'xxnet-f23.appspot.com'. You may need to add 'xxnet-f23.appspot.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'xxnet-301.appspot.com'. You may need to add 'xxnet-301.appspot.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'www.google.com'. You may need to add 'www.google.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'narutobm1234.appspot.com'. You may need to add 'narutobm1234.appspot.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'z-h-e-n-116.appspot.com'. You may need to add 'z-h-e-n-116.appspot.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'www.google.com'. You may need to add 'www.google.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'xxnet-131318.appspot.com'. You may need to add 'xxnet-131318.appspot.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'www.google.com'. You may need to add 'www.google.com' to ALLOWED_HOSTS. DisallowedHost: Invalid HTTP_HOST header: 'stoked-dominion-123514.appspot.com'. You may need to add 'stoked-dominion-123514.appspot.com' to ALLOWED_HOSTS.
核心问题
这些主机是什么,为何会访问我的后端?我不会在不了解其用途的情况下将它们加入ALLOWED_HOSTS。
额外问题
在当前技术栈中,屏蔽这类不受欢迎主机的最佳方式是什么?
解答
关于这些主机的来源和访问原因
- www.google.com:这类请求并非谷歌官方发起,属于攻击者或扫描工具伪造的HTTP_HOST头,目的是测试服务器是否存在主机头注入漏洞,或尝试绕过安全限制。
- xxnet-xxx.appspot.com、narutobm1234.appspot.com等App Engine域名:这些是GCP App Engine上的随机测试或个人项目域名,出现这类请求的原因主要有两种:
- 扫描工具遍历GCP公网IP,随机附带各种App Engine域名作为主机头,探测目标服务的配置漏洞;
- 该公网IP曾被其他App Engine项目使用,残留了部分误发的流量。
这类请求都是无意义的扫描或恶意探测,完全不需要添加到ALLOWED_HOSTS中。
屏蔽不受欢迎主机的最佳方式
结合GCP Kubernetes技术栈,推荐分层防御方案:
1. 利用GCP Ingress配置主机白名单
在Ingress资源中明确指定允许访问的域名,Ingress会直接拒绝不匹配的主机头请求,这是最外层的防护:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: django-ingress spec: rules: - host: your-backend-domain.com # 仅允许你的后端域名 http: paths: - path: / pathType: Prefix backend: service: name: django-service port: number: 80
配置后,非指定主机的请求会被Ingress直接返回404,不会转发到Django服务。
2. 严格维护Django的ALLOWED_HOSTS
保持现有配置,只添加你实际使用的域名和IP,不要包含任何未知主机。Django的DisallowedHost错误本身就是有效的防护机制,无需修改。
3. 启用GCP Cloud Armor(高安全需求可选)
如果需要更严格的防护,可配置Cloud Armor安全策略,在GCP负载均衡层拦截恶意请求:
- 创建Cloud Armor策略,添加规则拒绝包含非法主机头的请求;
- 将策略关联到Kubernetes Ingress对应的负载均衡器。
4. Django中间层补充拦截
若Ingress层防护无法覆盖所有场景,可自定义中间件在请求到达视图前拦截非法主机头:
# myapp/middleware.py from django.http import HttpResponseForbidden class BlockInvalidHostMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): allowed_hosts = [BACKEND_URL, INGRESS_IP, THIS_POD_IP, HOST_IP] if request.META.get('HTTP_HOST') not in allowed_hosts: return HttpResponseForbidden() response = self.get_response(request) return response
然后在settings.py中注册中间件:
MIDDLEWARE = [ # 放在最前面优先拦截 'myapp.middleware.BlockInvalidHostMiddleware', # 其他中间件... 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', ]
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

