Istio严格mTLS模式下TCP Socket通信遇filter_chain_not_found错误
问题分析与排查解决方案
核心问题本质
当mTLS设为STRICT模式时,服务端Envoy仅接受经过mTLS加密的流量,但客户端侧的流量未被正确加密(或客户端Envoy未发起mTLS握手),导致服务端Envoy找不到匹配的FilterChain,触发filter_chain_not_found错误。
排查方向与解决方案
1. 校验客户端DestinationRule配置有效性
确保DestinationRule正确关联服务端服务,且配置了ISTIO_MUTUAL模式:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: server-c-socket-server namespace: server-c-socket-server # 需与服务端namespace一致 spec: host: server-c-socket-server-service.server-c-socket-server.svc.cluster.local subsets: - name: v1 labels: app: server-c-socket-server # 需与服务端Pod的label完全匹配 trafficPolicy: tls: mode: ISTIO_MUTUAL
- 验证客户端Sidecar是否加载该配置:
istioctl pc destination-rules <客户端Pod名称> -n <客户端namespace>
2. 确认PeerAuthentication作用范围与优先级
确保服务端namespace的PeerAuthentication为STRICT模式,且无全局配置冲突:
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: default namespace: server-c-socket-server spec: mtls: mode: STRICT
- 验证服务端Sidecar的生效配置:
istioctl pc peer-authz <服务端Pod名称> -n <服务端namespace>
3. 修正VirtualService的TCP路由配置
由于是TCP服务,需配置tcp.route而非HTTP路由:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: server-c-socket-server namespace: server-c-socket-server spec: hosts: - server-c-socket-server-service.server-c-socket-server.svc.cluster.local tcp: - match: - port: 50000 # 与服务端Service的端口一致 route: - destination: host: server-c-socket-server-service.server-c-socket-server.svc.cluster.local port: number: 50000 subset: v1 # 与DestinationRule中定义的subset一致
4. 检查Envoy Sidecar监听配置
服务端Sidecar:确认50000端口监听已启用TLS校验
istioctl pc listeners <服务端Pod名称> -n <服务端namespace>输出需包含
TLS Inspector过滤器,且FilterChain的transport_socket为tls模式。客户端Sidecar:确认 outbound 到服务端50000端口的流量已配置
ISTIO_MUTUAL加密istioctl pc listeners <客户端Pod名称> -n <客户端namespace>
5. 排查EnvoyFilter冲突
若之前自定义了EnvoyFilter,可能破坏了默认的FilterChain规则。暂时移除所有自定义EnvoyFilter,测试是否恢复正常,再逐步排查冲突点。
内容的提问来源于stack exchange,提问作者gerrit
相关产品推荐
相关产品推荐

