核心思路
SFTP(SSH File Transfer Protocol)是SSH服务的一部分,因此我们通常通过配置SSH服务(OpenSSH)来提供SFTP功能,而不是搭建独立的FTP服务器。这种方式更安全、更简单。
本教程以最常用的 Linux系统(如Ubuntu/CentOS) 为例。如果您使用Windows,可以考虑使用FreeSSHd或Bitvise SSH Server等软件,但Linux是更主流和推荐的选择。
方案一:使用系统自带OpenSSH(推荐)
这是最安全、最直接的方法,利用了操作系统已有的SSH服务。
步骤1:安装SSH服务器(如果尚未安装)
# Ubuntu/Debian
sudo apt update
sudo apt install openssh-server
# CentOS/RHEL/Fedora
sudo yum install openssh-server
# 或使用 dnf (新版本Fedora/CentOS)
sudo dnf install openssh-server
安装后,SSH服务通常会自动启动。您可以使用 sudo systemctl status ssh (Ubuntu)或 sudo systemctl status sshd (CentOS)来检查状态。
步骤2:创建专用的SFTP用户和目录(为了安全和权限隔离)
我们不建议直接使用root用户进行SFTP。
创建用户组(可选,用于管理多个SFTP用户):
sudo groupadd sftpusers
创建用户并设置密码,同时将其主目录设置为指定目录(例如 /data/sftp/user1):
# 创建用户,并加入到sftpusers组,禁止其SSH登录shell(仅能SFTP)
sudo useradd -m -G sftpusers -s /usr/sbin/nologin user1
# 设置用户密码
sudo passwd user1
-m:创建用户主目录(在 /home/user1)。
-G sftpusers:将用户添加到 sftpusers 组。
-s /usr/sbin/nologin:禁止该用户使用SSH登录获得Shell终端,只能进行文件传输,更安全。
创建并设置SFTP根目录(如果需要将所有用户文件集中管理):
# 创建一个总的SFTP根目录,例如 /data/sftp
sudo mkdir -p /data/sftp
# 将根目录的所有者设为root,并确保其他用户无写权限
sudo chown root:root /data/sftp
sudo chmod 755 /data/sftp
# 为用户创建其专属子目录
sudo mkdir -p /data/sftp/user1
# 将用户目录的所有者赋予该用户
sudo chown user1:sftpusers /data/sftp/user1
sudo chmod 755 /data/sftp/user1
# 注意:用户对其主目录需要有写权限,通常会在其目录下创建upload等子目录
sudo mkdir -p /data/sftp/user1/upload
sudo chown user1:sftpusers /data/sftp/user1/upload
步骤3:配置SSH以启用SFTP并限制用户访问
编辑SSH服务的主配置文件 /etc/ssh/sshd_config。
sudo nano /etc/ssh/sshd_config
找到或添加以下配置行:
# 确保Subsystem sftp这行是启用的(通常默认已存在)
Subsystem sftp internal-sftp
# 在文件末尾添加以下配置块,用于限制sftpusers组的用户
Match Group sftpusers
# 强制使用SFTP协议,并指定其根目录为 /data/sftp
ChrootDirectory /data/sftp
# 允许以下功能
ForceCommand internal-sftp
# 禁用端口转发等TCP功能,增强安全性
PermitTunnel no
AllowTcpForwarding no
X11Forwarding no
ChrootDirectory /data/sftp: 这是最关键的安全设置。它将用户的活动范围“禁锢”在/data/sftp目录下,用户无法访问该目录以外的任何系统文件。该目录及其所有上级目录的所有者必须是root,且权限不能有群组写入(例如755)。
步骤4:重启SSH服务使配置生效
# Ubuntu/Debian
sudo systemctl restart ssh
# CentOS/RHEL
sudo systemctl restart sshd
步骤5:测试连接
使用任意SFTP客户端(如FileZilla, WinSCP, 或命令行sftp)进行连接。
- 主机: 您的内网服务器IP地址(如
192.168.1.100)
- 端口: 22(默认SSH端口)
- 用户名:
user1
- 密码: 您设置的密码
- 协议: SFTP
在FileZilla中,连接设置如下:
协议: SFTP - SSH File Transfer Protocol
主机: 192.168.1.100
端口: 22
登录类型: 正常
用户: user1
密码: *******
方案二:使用更易管理的第三方软件(如vsftpd + SSL)
如果您需要更复杂的FTP功能(如匿名访问、纯FTP协议),并为其加上SSL层来模拟SFTP的安全性,可以考虑此方案。但OpenSSH方案通常更简单安全。
这里简要介绍使用 vsftpd 配置支持SSL加密的FTPS(注意:不是SFTP,但同样安全)。
安装vsftpd:
sudo apt install vsftpd # Ubuntu
sudo yum install vsftpd # CentOS
生成SSL证书:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
配置vsftpd (/etc/vsftpd.conf):
# 禁用匿名登录
anonymous_enable=NO
# 允许本地用户登录
local_enable=YES
# 启用写操作
write_enable=YES
# 启用SSL
ssl_enable=YES
# 强制所有连接使用SSL
force_local_data_ssl=YES
force_local_logins_ssl=YES
# 指定证书路径
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
重启服务:
sudo systemctl restart vsftpd
连接: 客户端需要使用FTPS (Explicit)协议连接。
内网访问与防火墙设置
-
内网IP: 确保您使用服务器的内网IP地址(如192.168.x.x, 10.x.x.x, 172.16.x.x)进行连接。
-
防火墙: 如果服务器启用了防火墙(如ufw或firewalld),需要放行SSH端口(默认为22)。
# Ubuntu ufw
sudo ufw allow 22/tcp
# CentOS firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
安全建议
使用密钥认证: 比密码更安全。将客户端的公钥(
id_rsa.pub)添加到服务器的
~/.ssh/authorized_keys 文件中。
修改默认端口: 在
/etc/ssh/sshd_config 中修改
Port 项,可以减少自动化攻击。
禁用root登录: 在
/etc/ssh/sshd_config 中设置
PermitRootLogin no。
定期更新: 保持系统和OpenSSH软件包更新。
监控日志: 查看
/var/log/auth.log(Ubuntu)或
/var/log/secure(CentOS)来监控登录尝试。
总结
对于绝大多数内网SFTP需求,直接使用OpenSSH(方案一)并进行适当的用户和Chroot配置是最佳选择。它无需安装额外软件,安全性高,配置也相对简单。完成上述步骤后,您就拥有了一个安全可靠的内网SFTP服务器。