启用Istio后SFTP通信异常连接被服务端关闭问题咨询
问题根因
报错日志中的\026\003\001是TLS Client Hello握手报文的前3个字节特征:八进制\026对应十进制22,标识报文类型为TLS握手,后续的\003\001对应TLS 1.0的版本号。
该问题的核心原因是Istio默认对网格内服务间流量启用了mTLS双向认证:客户端的Envoy Sidecar会自动为发往SFTP服务22端口的TCP流量封装TLS层,但SFTP服务仅识别原生SSH/SFTP协议报文,无法解析TLS握手内容,因此抛出协议版本错误并主动断开连接。
你此前配置的VirtualService仅实现了TCP路由转发,未修改TLS认证策略,因此无法解决问题。
无需关闭Sidecar的长期解决方案
通过针对性配置Istio的TLS策略即可解决,无需关闭Sidecar注入,操作如下:
- 首先配置DestinationRule,明确指定访问SFTP服务22端口时禁用TLS封装:
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: foo-sftp-disable-mtls namespace: bar spec: host: foo.bar.svc.cluster.local trafficPolicy: portLevelSettings: - port: number: 22 tls: mode: DISABLE
- 若你集群的全局PeerAuthentication策略为STRICT模式,还需要为SFTP服务单独配置端口级别的PeerAuthentication,允许22端口接收明文流量:
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: foo-sftp-peer-auth namespace: bar spec: selector: matchLabels: app.kubernetes.io/instance: foo-bar portLevelMtls: 22: mode: DISABLE
配置完成后等待1-2分钟规则生效,即可正常建立SFTP连接。
你当前Service端口命名为tcp-sftp符合Istio端口命名规范,无需调整。
内容的提问来源于stack exchange,提问作者Guillaume Alouege
相关产品推荐
相关产品推荐

