K8s Pod内运行hubCheck访问FTP连接超时问题咨询
问题描述
在Kubernetes(K8s)Pod内部运行hubCheck工具访问FTP协议的track hub地址时出现网络超时,报错如下:
# Pod内执行命令 $ ./hubCheck -noTracks -verbose=2 ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/hub.txt ### kent source version 431 ### Found 2 problems: Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/hub.txt TCP non-blocking connect() to ftp.ebi.ac.uk IP 193.62.193.138 timed-out in select() after 10000 milliseconds - Cancelling!
本地环境执行相同命令可正常返回结果:
$ ./hubCheck -noTracks -verbose=2 ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/hub.txt ### kent source version 430 ### 1 tracks in sacCer3 1 tracks in mm10 1 tracks in ce10 1 tracks in galGal4 1 tracks in ci2 1 tracks in danRer7 1 tracks in dm6 1 tracks in hg38
初步排查结果
- Pod公网连通性正常,可通过curl正常下载hubCheck二进制文件:
# curl -o tools/hubCheck http://hgdownload.soe.ucsc.edu/admin/exe/linux.x86_64/hubCheck % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 33.2M 100 33.2M 0 0 10.0M 0 0:00:03 0:00:03 --:--:-- 10.0M
- HTTP协议的track hub地址在集群内外均可正常访问:
$ ./hubCheck -noTracks -verbose=2 http://younglab.wi.mit.edu/mESC_ChIAPET_hub/hub.txt ### kent source version 431 ### 4 tracks in mm9
补充验证
- 将地址前缀的
ftp替换为http测试,入口hub.txt可加载,但配置内硬编码的FTP子资源路径仍访问超时:
$ ./hubCheck -noTracks -verbose=2 http://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/hub.txt ### kent source version 431 ### 0 tracks in hg38 0 tracks in mm10 0 tracks in ce10 0 tracks in galGal4 0 tracks in ci2 0 tracks in danRer7 0 tracks in dm6 0 tracks in sacCer3 Found 10 problems: Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/C_elegans/trackDb.txt Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/C_intestinalis/trackDb.txt Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/D_melanogaster/trackDb.txt Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/D_rerio/trackDb.txt Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/G_gallus/trackDb.txt Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/H_sapiens_hg38/trackDb.txt Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/M_musculus_mm10/trackDb.txt Couldn't open ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/S_cerevisiae/trackDb.txt TCP non-blocking connect() to ftp.ebi.ac.uk IP 193.62.193.138 timed-out in select() after 10000 milliseconds - Cancelling! warning: ftp://ftp.ebi.ac.uk/pub/databases/Rfam/12.0/genome_browser_hub/hub_description.html descriptionUrl setting does not exist
- 确认问题与FTP协议直接相关:Pod内访问任意外部FTP地址均超时,同地址换成HTTP协议可正常访问:
# 访问FTP协议地址超时 $ ./hubCheck -noTracks -verbose=2 ftp://ftp.ensemblgenomes.org/pub/misc_data/Track_Hubs/SRP039045/hub.txt ### kent source version 432 ### Found 2 problems: Couldn't open ftp://ftp.ensemblgenomes.org/pub/misc_data/Track_Hubs/SRP039045/hub.txt TCP non-blocking connect() to ftp.ensemblgenomes.org IP 193.62.193.141 timed-out in select() after 10000 milliseconds - Cancelling!
# 同地址换成HTTP协议可正常访问 $ ./hubCheck -noTracks -verbose=2 http://ftp.ensemblgenomes.org/pub/misc_data/Track_Hubs/SRP039045/hub.txt ### kent source version 432 ### 1 tracks in IRGSP-1.0 Found 8 problems: warning: https://www.ebi.ac.uk/fg/rnaseq/api/json/70/getRunsByStudy/SRP039045 descriptionUrl setting does not exist warning: missing description page for track: 'SAMN02649582' warning: missing description page for track: 'SAMN02649583' warning: missing description page for track: 'SAMN02649584' warning: missing description page for track: 'SRP039045_composite' warning: missing description page for track: 'SRR1178905' warning: missing description page for track: 'SRR1178906' warning: missing description page for track: 'SRR1179192'
核心疑问
- 创建FTP Ingress控制器是否可以解决Pod访问外部FTP资源超时的问题?
- 部署FTP Ingress控制器是否存在安全风险?
解答
关于FTP Ingress能不能解决问题
完全不能,方向完全错了。
Ingress的作用是处理集群入站流量,也就是把集群外部的用户请求转发到集群内部的服务上。你现在遇到的是Pod主动向外访问公网FTP服务的出站流量连通性问题,和负责入站转发的Ingress没有任何关系,部署FTP Ingress只会给集群额外增加一个对外的FTP服务入口,根本不会影响Pod访问外部FTP的流量路径。
问题根因
FTP协议本身设计特殊,分为控制连接和数据连接两个通道:
- 控制连接默认走TCP 21端口,用来传命令
- 数据连接分主动、被动两种模式,要么是服务端主动回连客户端的高位随机端口,要么是客户端连服务端开放的高位随机端口,需要开放大量非固定端口
你现在的集群网络环境明显只默认放通了HTTP(80)、HTTPS(443)这类固定常用端口的出站流量,要么拦截了TCP 21端口的出站访问,要么没有放通FTP数据通道需要的高位端口段,也没有加载FTP连接追踪模块识别关联流量,导致FTP连接超时。
可行解决方案
- 优先选成本最低的方案:你测试过访问的EBI、Ensembl公共FTP站都同时支持HTTP协议访问,只要把hub配置里所有硬编码的
ftp://前缀批量替换成http://,就能直接走已经通的80端口完成访问,不需要改任何集群网络配置。 - 如果必须使用原生FTP协议访问资源:
- 先在Pod内执行
nc -zv ftp.ebi.ac.uk 21确认21端口连通性,如果超时,先放通节点安全组、防火墙、NetworkPolicy对Pod网段出站访问TCP 21端口的限制 - 给集群节点加载
nf_conntrack_ftp内核模块,让系统能自动识别FTP的关联数据连接,放通对应端口 - 如果访问的FTP服务用被动模式,额外放通对应FTP服务端公示的被动模式高位端口段的出站访问权限
- 先在Pod内执行
- 如果不想改全局网络规则,可以在集群内部署一个专用的FTP代理网关,所有需要访问外部FTP的Pod统一走这个代理出站,收敛访问权限。
部署FTP Ingress的安全风险
就算你需要对外提供FTP服务,部署FTP Ingress也有明确的安全风险:
- FTP协议默认是明文传输,认证信息、文件内容全链路不加密,容易被窃听、篡改
- FTP数据通道需要开放大量高位端口,会显著扩大集群的对外攻击面,提升端口扫描、漏洞利用的风险
- 目前开源的FTP Ingress实现普遍成熟度低,配置逻辑复杂,很容易出现未授权访问、权限绕过的配置漏洞
- 公共文件服务已经基本淘汰FTP协议,全面转向HTTP/HTTPS,维护FTP Ingress的投入产出比极低。
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

