欢迎光临濮阳市分类吧
详情描述

核心思路

SFTP(SSH File Transfer Protocol)是SSH服务的一部分,因此我们通常通过配置SSH服务(OpenSSH)来提供SFTP功能,而不是搭建独立的FTP服务器。这种方式更安全、更简单。

本教程以最常用的 Linux系统(如Ubuntu/CentOS) 为例。如果您使用Windows,可以考虑使用FreeSSHdBitvise 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.x10.x.x.x172.16.x.x)进行连接。

  • 防火墙: 如果服务器启用了防火墙(如ufwfirewalld),需要放行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服务器。