Docker容器与主机同CURL命令返回不同HTTPS响应问题排查
问题
在主机执行curl https://widgets.sir.sportradar.com/translations/en.json可正常获取JSON响应;但在无代理配置的Docker容器内执行相同命令,返回403 Access Denied错误。若在主机请求中添加X-Forwarded-Proto: https头,也会出现相同拒绝错误。将容器网络模式设为host后,curl命令可正常执行。
对应的docker-compose配置如下:
testprogram: build: context: ./testprogram/ dockerfile: Dockerfile environment: - HTTP_PROXY= - HTTPS_PROXY= - NO_PROXY=localhost,127.0.0.1,testprogram,nginx volumes: - /etc/ssl/certs:/etc/ssl/certs ports: - "8989:8989" restart: always networks: - backend - frontend deploy: resources: limits: cpus: "4" memory: 2048M
请问该异常的原因可能是什么?
可能的原因分析
- 目标站点拦截规则触发:容器使用默认桥接网络时,Docker会自动给出站请求添加
X-Forwarded-Proto这类代理相关请求头——哪怕你没有手动配置代理。而目标站点的WAF或CDN存在拦截规则,会拒绝带有这类头的请求。主机直接请求时没有这些头所以正常,手动添加X-Forwarded-Proto: https后就触发了拦截,和容器内的情况完全匹配。 - 容器IP段被限制:默认桥接网络下,容器使用的是Docker内部子网的IP地址,目标站点可能对这类非公网直连的IP段设置了访问限制。切换为
host网络后,容器直接复用主机的公网IP和路由,自然就能通过站点的验证。 - DNS解析差异:这个概率相对较低,但容器内的DNS解析结果可能和主机不一致,导致请求被导向了存在访问限制的节点。不过从切换host网络就恢复正常的表现来看,这个原因的可能性不大。
内容的提问来源于stack exchange,提问作者Ahsan
相关产品推荐
相关产品推荐

