如何为OpenShift路由/服务配置IP白名单?及Host头绕过问题咨询
我来帮你搞定这两个OpenShift的问题,结合实际运维经验给你具体的解决方案:
你有两种主流方式来实现,分别对应路由层面和服务网络层面的控制:
路由注解直接配置白名单
OpenShift的HAProxy路由器支持通过注解直接给特定路由添加IP白名单,这是最直接的方式。针对private.example.com对应的路由,添加haproxy.router.openshift.io/ip_whitelist注解,值为允许的源IP/CIDR列表(逗号分隔)。示例YAML如下:apiVersion: route.openshift.io/v1 kind: Route metadata: name: private-service-route annotations: haproxy.router.openshift.io/ip_whitelist: "192.168.1.0/24,10.0.0.0/8" # 替换成你的白名单IP段 spec: host: private.example.com to: kind: Service name: private-service tls: termination: edge应用这个配置后,HAProxy会直接过滤掉不在白名单内的请求,不需要依赖外部防火墙。
NetworkPolicy实现服务级别的IP限制
如果需要更底层的网络控制(比如限制到Pod层面),可以用Kubernetes的NetworkPolicy对象,前提是你的OpenShift集群使用的网络插件支持(默认OVN-Kubernetes是支持的)。示例配置如下:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: private-service-allowlist namespace: your-private-namespace # 替换成私有服务所在的命名空间 spec: podSelector: matchLabels: app: private-service # 替换成私有服务Pod的标签 policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 192.168.1.0/24 # 白名单IP段 - ipBlock: cidr: 10.0.0.0/8 ports: - protocol: TCP port: 8080 # 私有服务的监听端口这个策略会只允许指定IP段的流量访问私有服务的Pod。
你遇到的问题本质是外部防火墙只校验了请求的目标IP,没检查Host头,而OpenShift路由器是根据Host头来转发请求的。可以从三个层面来堵这个漏洞:
在OpenShift路由层面强化Host绑定
首先确保每个Route的spec.host严格匹配对应的域名,没有使用通配符(除非必要)。另外,给公网路由添加注解,明确拒绝携带私有域名Host头的请求,或者给私有路由添加更严格的校验:比如私有路由只响应private.example.com的Host头(这其实是Route的默认行为,但可以通过HAProxy注解进一步强化),比如添加haproxy.router.openshift.io/request-headers-set注解来强制校验Host头。外部防火墙添加Host头校验规则
修改外部防火墙的规则,不仅检查源IP和目标IP,还要检查请求的Host头:- 对于目标IP
10.0.0.2(私有域名对应IP),只允许来自白名单IP且Host头为private.example.com的请求 - 对于目标IP
10.0.0.1(公网域名对应IP),直接拒绝Host头为private.example.com的请求
这样从入口就阻断了通过公网IP携带私有Host头的绕过方式。
- 对于目标IP
利用TLS SNI校验强化访问控制
如果你的私有路由使用了Edge或Passthrough类型的TLS终止,确保证书是仅针对private.example.com的。当请求访问公网IP但携带私有域名的Host头时,SNI会不匹配,HAProxy会返回证书错误或者直接拒绝请求,从而阻止非法访问。另外,也可以在Ingress Controller的全局配置中添加SNI校验规则,确保每个请求的SNI和Host头一致。
内容的提问来源于stack exchange,提问作者ptrk

