一、架构说明
目标
- 外网用户通过 SFTP 上传文件
- 文件自动同步到 内网 FTP 服务器
- 内网业务处理完后,结果自动回传给外网 SFTP
- 全程使用 账号密码,不使用 SSH Key
- 同步完成后 自动删除源文件,避免重复处理
拓扑结构
[ 外网用户 ]
↓ SFTP (22222)
[ A 机:外网 SFTP ]
/data/sftp/smdper/input
/data/sftp/smdper/output
↑ ↓ lftp (SFTP)
[ B 机:内网 FTP ]
/data/ftp/smdper/input ← vsftpd 读取
/data/ftp/smdper/output ← 业务写入
同步方向
| 方向 | 说明 |
|---|---|
| input | A 机 SFTP → B 机 FTP |
| output | B 机 FTP → A 机 SFTP |
二、环境信息
| 主机 | 角色 | IP | 用户 |
|---|---|---|---|
| A 机 | 外网 SFTP | 127.0.0.1 | smdper |
| B 机 | 内网 FTP | 内网 IP | smdper |
| 服务 | 端口 | ||
| ---- | ---- | ||
| SFTP | 22222 | ||
| FTP | 21 |
三、A 机(SFTP 服务器)配置
1. 创建用户与目录
useradd -m 账号
echo "账号:密码" | chpasswd
mkdir -p /data/sftp/smdper/input
mkdir -p /data/sftp/smdper/output
chown -R smdper:smdper /data/sftp/smdper
2. 配置 SFTP Chroot(sshd_config)
vim /etc/ssh/sshd_config
追加:
Match User smdper
ChrootDirectory /data/sftp/smdper
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
重启 SSH:
systemctl restart sshd
✅ 登录后根目录为
/data/sftp/smdper✅ lftp 远程路径必须使用相对路径
./input/
四、B 机(FTP 服务器)配置
1. 安装 vsftpd
yum install -y vsftpd
systemctl enable vsftpd
systemctl start vsftpd
2. 创建 FTP 目录
mkdir -p /data/ftp/smdper/input
mkdir -p /data/ftp/smdper/output
chown -R smdper:smdper /data/ftp/smdper
3. 配置 vsftpd(允许 smdper 登录)
vim /etc/vsftpd/vsftpd.conf
关键配置:
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
重启:
systemctl restart vsftpd
五、安装 lftp(B 机)
yum install -y lftp
六、同步脚本(核心)
B 机脚本:/data/sync/sync.sh
#!/bin/bash
USER="账号"
PASS="密码"
HOST="127.0.0.1"
PORT="22222"
echo "=== $(date) ==="
# 确保本地 FTP 目录存在
for dir in /data/ftp/smdper/input /data/ftp/smdper/output; do
mkdir -p "$dir"
chown smdper:smdper "$dir"
done
echo "--- 拉 input: A机SFTP → 本机FTP ---"
lftp -u "${USER},${PASS}" "sftp://${HOST}:${PORT}" <<'EOF'
set sftp:auto-confirm yes
mirror --Remove-source-files ./input/ /data/ftp/smdper/input/
bye
EOF
echo "--- 推 output: 本机FTP → A机SFTP ---"
lftp -u "${USER},${PASS}" "sftp://${HOST}:${PORT}" <<'EOF'
set sftp:auto-confirm yes
mirror -R --Remove-source-files /data/ftp/smdper/output/ ./output/
bye
EOF
echo "=== done ==="
赋权
chmod +x /data/sync/sync.sh
七、定时任务(cron)
crontab -e
每 2 分钟同步一次:
*/2 * * * * /data/sync/sync.sh >> /var/log/sync.log 2>&1
创建日志文件:
touch /var/log/sync.log
八、测试流程
1. 外网上传测试
在 A 机执行:
echo "hello blog" > /data/sftp/smdper/input/test.txt
2. 手动触发同步
在 B 机执行:
sh /data/sync/sync.sh
3. 验证结果
✅ B 机:
ls /data/ftp/smdper/input/
✅ A 机:
ls /data/sftp/smdper/input/
✅ A 机 output:
ls /data/sftp/smdper/output/
九、常见坑总结(博客必写)
1. lftp 删除源文件
- ❌
--remove-source-files(rsync 参数) - ✅
--Remove-source-files(lftp 参数)
2. SFTP Chroot 必须用相对路径
✅ ./input/
❌ /data/sftp/smdper/input/
3. lftp 不支持 rm *
- 通配符在 lftp 里无效
- 正确方式:
mirror --Remove-source-files
4. FTP 与 SFTP 目录不是同一个
/data/sftp/smdper≠/data/ftp/smdper- 必须明确区分
十、适用场景
- 内外网隔离
- 文件单向流转
- 不允许 SSH Key
- 自动清理源文件
- 业务系统只认 FTP
十一、博客总结一句话
使用 lftp + SFTP + FTP,实现外网文件安全进入内网,并在传输完成后自动清理源文件,是一种轻量、稳定、易维护的跨网同步方案。