背景
公司机房做整体搬迁,我负责运维的一套sftp-server文件服务系统,在迁移到新机房后,问题频发。
外部合作伙伴连接这套前置机上传文件,总是报sftp密钥信任错误,导致文件上传失败。
系统上线十几年,登录主机查看运行时长,10年没有关过机(操作系统Redhat4)。
当初接到迁移任务时,是一百个不情愿,有多少坑,谁也说不准,哪怕出个小问题,排查起来费尽周折,更别提来自业务上的压力。
但胳膊拧不过大腿,不想做也得做,怀着诚惶诚恐的心情,使用快照克隆的方式,把这套集群迁移走,不出意外,变更实施完,接下来的2周内,接连暴雷~
基础架构
sftp服务使用F5做负载均衡,外部合作伙伴访问22端口,向这套主机上传文件,基本结构如下(默认防火墙放通22端口)
SSH公钥检查
sftp底层使用ssh协议通信,在ssh加持下,当第一次连接外部server,客户端会提示服务端的指纹,并征询接下来的动作。
1 | sftp maxscale@*.*.*.* |
输入yes,服务端的公钥会被记录在客户端~/.ssh/known_hosts文件中,基本格式是”ip/hostname+空格+公钥字符串”。
当服务端有如下变更时,会导致客户端保存的密钥失效,如:
- 重装操作系统
- IP地址变化
- 虚拟机重建
- 中间人劫持
- DHCP
很多涉及sftp的应用,都会因为密钥信任,导致莫名其妙的问题。
解决方案
- 方案一,客户端关闭密钥检查(不推荐)
修改~/.ssh/config文件,加入1
2Host *
StrictHostKeyChecking no - 方案二,登录命令加入ssh选项,跳过公钥检查
1
2
3sftp -o StrictHostKeyChecking=no maxscale@*.*.*.*
Warning: Permanently added '*.*.*.*' (ED25519) to the list of known hosts.
maxscale@*.*.*.*'s password: - 方案三,删除之前保存的公钥,重新信任一次
1
2
3
4
5
6
7# 可以直接删除
sed -i '/192.168.1.102/d' ~/.ssh/known_hosts
# 可以使用命令删除
ssh-keygen -R <ip>
# 重新执行sftp登录命令...
sftp maxscale@ip
...
F5后端多个sftp实例,执行秘钥同步
F5后端有多个sftp实例,需要同步实例之间的sftp秘钥(同步文件后,重启sshd服务),否则客户端登录仍然面临秘钥信任问题。
当然,如果客户端跳过公钥检查,这个问题就不会存在。
执行秘钥同步方法,请看另外一篇文章: https://blog.wisepkg.com/2024/06/22/sftp%E6%9C%8D%E5%8A%A1%E9%9B%86%E7%BE%A4fingerprint%E5%B7%AE%E5%BC%82%E5%AF%BC%E8%87%B4%E7%9A%84%E7%99%BB%E5%BD%95%E9%97%AE%E9%A2%98/
后端sftp多实例,文件同步问题
银行客户端有两个连续动作,登录sftp成功后,先创建1个日期目录,然后向目录内上传文件。
明明都操作成功了,但内部系统就是获取不到文件,是为啥?
经过检查,F5后端有两个sftp实例,客户端两步操作,都打到后端不同实例,即创建目录在一个实例,上传文件却在不同的另外一个实例。
解决方案
方案一,F5根据source_addr, 设置会话保持。
设置以后,来自同一个客户端的请求,会被分发到后端固定实例。
方案二,使用NAS卷,主机挂载网络存储,两个实例的数据目录,指向同一个NAS目录即可。
双活方案
根据集团运营督导要求,每一套应用系统,都要搭建同城/异地双活,入口使用双活域名做负载。
搭建完双活系统的新架构如下图:
这里需要补充以下几点:
- 由于涉及双活切换,两套前置机系统必须挂载相同NAS卷(网络存储),共享文件存储系统。
- sftp账号是和系统账号绑定,由于共享NAS存储,两套双活环境,涉及sftp服务的实例,在创建sftp账号时,需使用相同的group-id和user-id。
- 两套双活环境,需统一sftp实例的密钥文件,前端F5设置好会话保持功能。