核心步骤概览
- 准备工作:在虚拟机中获取静态 IP 地址,确保虚拟机和宿主机(你的物理电脑)可以互相通信。
- 安装 FTP 服务器软件:在虚拟机中安装
vsftpd。 - 基本配置:修改
vsftpd的配置文件,使其能正常工作。 - 配置防火墙和 SELinux:开放 FTP 服务所需端口。
- 创建 FTP 用户:为文件传输创建专用的系统用户。
- 测试连接:使用宿主机的 FTP 客户端连接虚拟机进行测试。
- 进阶配置(可选):如启用 SSL/TLS 加密、限制用户访问目录等。
第一步:准备工作(获取虚拟机静态 IP)
这一步至关重要,因为如果虚拟机 IP 地址会变,你每次连接时都需要重新查找 IP。

在 Ubuntu/Debian 中配置静态 IP (使用 Netplan)
- 查看你的网络接口名称:
ip a,通常是ens33或eth0。 - 编辑 Netplan 配置文件,通常位于
/etc/netplan/目录下,01-netcfg.yaml。sudo nano /etc/netplan/01-netcfg.yaml
- 修改文件内容,设置一个与你的宿主机在同一网段的静态 IP,如果你的宿主机 IP 是
168.1.100,你可以给虚拟机设置168.1.101。network: version: 2 renderer: networkd ethernets: ens33: # 替换成你的网卡名 dhcp4: no addresses: [192.168.1.101/24] # 你的静态IP和子网掩码 gateway4: 192.168.1.1 # 你的网关地址,通常是路由器地址 nameservers: addresses: [8.8.8.8, 1.1.1.1] # DNS服务器地址 - 应用配置:
sudo netplan apply。 - 验证 IP:
ip a,你应该能看到你设置的静态 IP 已经生效。
在 CentOS/RHEL 中配置静态 IP (使用 NetworkManager)
- 查看网络接口:
ip a。 - 编辑网络配置文件,
ifcfg-ens33(根据你的网卡名修改)。sudo nano /etc/sysconfig/network-scripts/ifcfg-ens33
- 修改或添加以下配置:
TYPE=Ethernet BOOTPROTO=static # 设置为静态IP NAME=ens33 DEVICE=ens33 ONBOOT=yes # 开机自启 IPADDR=192.168.1.101 # 你的静态IP NETMASK=255.255.255.0 # 子网掩码 GATEWAY=192.168.1.1 # 网关 DNS1=8.8.8.8 DNS2=1.1.1.1
- 重启网络服务:
sudo systemctl restart network。 - 验证 IP:
ip a。
第二步:安装 FTP 服务器 (vsftpd)
在虚拟机的终端中执行以下命令。
对于 Ubuntu/Debian:

sudo apt update sudo apt install vsftpd -y
对于 CentOS/RHEL:
sudo dnf install vsftpd -y # 对于 CentOS 8/RHEL 8 及以上 # 或者 sudo yum install vsftpd -y # 对于 CentOS 7/RHEL 7 及以下
安装完成后,vsftpd 服务会自动启动。
第三步:基本配置 vsftpd
vsftpd 的主配置文件是 /etc/vsftpd.conf。
-
备份原始配置文件(好习惯):
(图片来源网络,侵删)sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
-
编辑配置文件:
sudo nano /etc/vsftpd.conf
-
修改或取消注释以下关键配置项(确保它们没有被 注释掉):
# 允许匿名用户登录(默认是允许的,为了安全,我们建议禁用) anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许本地用户有写权限(上传、创建目录等) write_enable=YES # 用户只能被限制在自己的家目录下,这是非常重要的安全设置! chroot_local_user=YES # 当用户被限制在家目录后,能否写入?默认为 NO,因为可能带来安全风险。 # 如果需要用户上传文件,可以设置为 YES,但需要配合下面的配置。 allow_writeable_chroot=YES # 设置欢迎信息 ftpd_banner=Welcome to my FTP service.
-
保存并退出文件 (在
nano中是Ctrl+X, 然后按Y, 再按Enter)。 -
重启
vsftpd服务使配置生效:sudo systemctl restart vsftpd
第四步:配置防火墙和 SELinux
防火墙配置
Ubuntu/Debian (使用 UFW):
# 开放 FTP 服务(UFW会自动处理21端口和被动模式的端口范围) sudo ufw allow ftp # 或者直接开放 21 端口 sudo ufw allow 21/tcp # 重新加载防火墙规则 sudo ufw reload
CentOS/RHEL (使用 Firewalld):
# 添加 FTP 服务到防火墙规则(Firewalld会自动处理被动端口) sudo firewall-cmd --permanent --add-service=ftp # 重新加载防火墙规则 sudo firewall-cmd --reload
SELinux 配置 (仅限 CentOS/RHEL)
如果你的系统开启了 SELinux (默认是开启的),它会阻止 vsftpd 写入文件,导致上传失败。
有两种方法处理:
方法 A:临时关闭(不推荐,仅用于测试)
sudo setenforce 0
重启后 SELinux 会重新开启。
方法 B:设置正确的 SELinux 策略(推荐)
# 安装 SELinux 管理工具 sudo dnf install selinux-policy-devel -y # CentOS 8+ # sudo yum install selinux-policy-devel -y # CentOS 7 # 安装 vsftpd 的 SELinux 策略包 sudo dnf install vsftpd-selinux -y # sudo yum install vsftpd-selinux -y # 这会自动设置正确的布尔值,允许 ftpd 在家目录中写入
第五步:创建 FTP 用户
为了安全,不要使用 root 用户登录,我们创建一个专门的 FTP 用户 ftpuser。
-
创建新用户:
sudo useradd -m -s /sbin/nologin ftpuser
-m: 自动创建用户的主目录/home/ftpuser。-s /sbin/nologin: 禁止此用户通过 SSH 或控制台登录系统,仅用于 FTP。
-
为该用户设置密码:
sudo passwd ftpuser
根据提示输入两次密码。
-
(可选)将一些文件放入
/home/ftpuser目录,用于测试下载。
第六步:测试连接
你可以从你的宿主机(物理电脑)上测试了。
-
获取虚拟机的 IP 地址: 在虚拟机终端运行
ip a,找到你设置的静态 IP,168.1.101。 -
使用 FTP 客户端连接:
- Windows: 打开“文件资源管理器”,在地址栏输入
ftp://192.168.1.101,然后输入用户名ftpuser和密码。 - macOS: 打开“访达”,在菜单栏选择“前往” -> “连接服务器”,输入
ftp://192.168.1.101,然后输入用户名和密码。 - 命令行: 在宿主机的终端或命令提示符中输入:
ftp 192.168.1.101
然后输入用户名
ftpuser和密码。
- Windows: 打开“文件资源管理器”,在地址栏输入
如果连接成功,你就可以看到 /home/ftpuser 目录下的文件了,并且可以上传、下载、删除文件。
第七步:进阶配置(可选)
A. 启用 SSL/TLS 加密(推荐)
不加密的 FTP 是不安全的,密码和文件内容都以明文传输。
-
生成 SSL 证书:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
这会一路回车生成一个自签名证书,在生产环境中,你应该使用由受信任的 CA 签发的证书。
-
修改 vsftpd 配置文件:
sudo nano /etc/vsftpd.conf
添加或修改以下几行:
ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1_2=YES # 强使用 TLS v1.2 或更高版本 # 指定证书位置 rsa_cert_file=/etc/vsftpd/vsftpd.pem rsa_private_key_file=/etc/vsftpd/vsftpd.pem
-
重启 vsftpd:
sudo systemctl restart vsftpd
-
测试: 在 FTP 客户端连接时,你需要选择使用 "FTP over SSL/TLS (Explicit)" 或 "FTPS" 模式进行连接。
B. 限制用户访问特定目录
如果你想创建一个只允许访问 /var/www/html 这样的目录的用户,而不是他的家目录。
-
创建用户并设置家目录:
sudo useradd -d /var/www/html -s /sbin/nologin webftpuser sudo passwd webftpuser
-d /var/www/html: 指定用户的主目录。
-
修改 vsftpd 配置: 在
/etc/vsftpd.conf中,确保chroot_local_user=YES是开启的。vsftpd会自动将用户限制在他指定的家目录中。 -
设置目录权限: 为了让
webftpuser能写入/var/www/html,需要设置正确的所有权。sudo chown -R webftpuser:webftpuser /var/www/html sudo chmod -R 755 /var/www/html
常见问题排查
-
连接被拒绝 (Connection refused):
- 检查
vsftpd服务是否正在运行:sudo systemctl status vsftpd。 - 如果没运行,启动它:
sudo systemctl start vsftpd,并设置开机自启:sudo systemctl enable vsftpd。 - 检查宿主机和虚拟机的防火墙是否放行了 21 端口。
- 检查
-
用户名或密码错误:
- 确认用户名和密码输入正确。
- 检查用户是否被锁定:
sudo passwd -S ftpuser。
-
无法上传/写入文件 (553 Could not create file):
- 检查
write_enable=YES是否在配置文件中。 - 检查目标目录的权限,特别是
chroot目录(如/home/ftpuser)的权限。vsftpd要求chroot目录不能有w权限给用户本身,否则allow_writeable_chroot=YES必须设置为YES。 - 检查 SELinux 是否是问题所在(针对 CentOS/RHEL)。
- 检查
-
被动模式连接失败:
-
如果客户端连接成功但列出目录或传输数据时卡住,通常是被动模式问题。
-
在
/etc/vsftpd.conf中设置被动端口范围,并在防火墙中开放这个范围:pasv_min_port=10020 pasv_max_port=10040
-
然后在防火墙中开放这个端口范围:
# UFW (Ubuntu) sudo ufw allow 10020:10040/tcp # Firewalld (CentOS) sudo firewall-cmd --permanent --add-port=10020-10040/tcp sudo firewall-cmd --reload
-
遵循以上步骤,你应该就能成功在虚拟机中配置好一个功能完善的 FTP 服务器了。
