一、遇到的核心问题总结
在离线环境中,主要遇到以下问题:
- 安装路径非默认:源码编译后 vsftpd 默认安装到
/usr/local/sbin/vsftpd(而非/usr/sbin/),导致服务文件ExecStart路径不匹配,启动失败; - 服务文件配置错误:
vsftpd.service中Type=forking与 vsftpd 前台运行模式冲突,未加bash -c "..." &导致启动超时; - 配置文件兼容性:旧版本
vsftpd.conf中部分参数(如-t语法检测)在 3.0.5 中不支持,引发语法错误; - 依赖缺失:离线环境下缺少
gcc、libcap-devel等编译依赖,导致make失败。
二、vsftpd 离线安装全流程(以 3.0.5 为例,鲲鹏 aarch64 麒麟 V10)
1. 准备工作
- 安装包:下载 vsftpd 3.0.5 源码包(
vsftpd-3.0.5.tar.gz),确保适用于通用 Linux(源码包不分架构); - 依赖包:下载鲲鹏 aarch64 架构的离线依赖(麒麟 V10 适配):
gcc-7.3.0-xxx.ky10.aarch64.rpm(编译工具)libcap-devel-2.27-xxx.ky10.aarch64.rpm(vsftpd 依赖库)make-4.2.1-xxx.ky10.aarch64.rpm(编译执行工具)
- 传输文件:将所有文件通过 U 盘传到服务器
/root/vsftpd_install/目录。
2. 安装依赖
# 进入依赖包目录 cd /root/vsftpd_install # 安装依赖(--nodeps忽略依赖检查,适合离线) rpm -ivh make-4.2.1-xxx.ky10.aarch64.rpm --nodeps --force rpm -ivh libcap-devel-2.27-xxx.ky10.aarch64.rpm --nodeps --force rpm -ivh gcc-7.3.0-xxx.ky10.aarch64.rpm --nodeps --force # 验证依赖:输出版本即成功 gcc --version && make --version3. 编译安装 vsftpd
# 解压源码包 tar -zxvf vsftpd-3.0.5.tar.gz && cd vsftpd-3.0.5 # 编译(鲲鹏架构无需修改,直接make) make # 安装(默认路径为/usr/local/sbin/vsftpd,可通过Makefile修改) make install # 验证安装路径 which vsftpd # 输出/usr/local/sbin/vsftpd即成功4. 创建服务文件(关键)
源码安装不会自动生成服务文件,需手动创建适配 systemd:
vi /usr/lib/systemd/system/vsftpd.service粘贴以下内容(适配非默认路径和前台运行模式):
[Unit] Description=Vsftpd ftp daemon After=network.target [Service] Type=forking # 核心:用bash后台运行vsftpd,适配非默认路径 ExecStart=/bin/bash -c "/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf &" ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=5s User=root Group=root [Install] WantedBy=multi-user.target保存后重载配置:
systemctl daemon-reload5. 初始化配置文件
# 创建配置目录 mkdir -p /etc/vsftpd # 创建基础配置文件(可复用旧配置,或新建) vi /etc/vsftpd/vsftpd.conf基础配置内容(适配本地用户ftpuser):
# 允许本地用户登录(如ftpuser) local_enable=YES # 允许写操作(上传/创建文件) write_enable=YES # 本地用户权限掩码 local_umask=022 # 禁用匿名登录 anonymous_enable=NO # 限制用户在家目录(/data/ftpuser) chroot_local_user=YES allow_writeable_chroot=YES # 允许家目录可写 # 被动模式端口范围(避免权限问题) pasv_enable=YES pasv_min_port=40000 pasv_max_port=40010 # 日志路径 xferlog_file=/var/log/vsftpd.log xferlog_enable=YES以下是一份详细的 vsftpd.conf 配置模板,涵盖匿名用户控制、本地用户权限、安全加固、日志审计等核心场景,并附带参数说明,方便你根据实际环境调整(适用于 vsftpd 3.0.5 及以上版本):
# ============================================== # 1. 基础服务设置 # ============================================== # 服务监听的IP版本(ipv4/ipv6,默认同时监听) listen=YES # 启用ipv4监听 listen_ipv6=NO # 禁用ipv6(若无需ipv6) listen_port=21 # 监听端口(默认21,特权端口) # 服务器标识(登录时显示的欢迎信息) ftpd_banner=Welcome to secure FTP service. # 自定义欢迎语 # 禁止使用ASCII模式传输(避免恶意文件篡改) ascii_upload_enable=NO ascii_download_enable=NO # 连接限制(防止DoS攻击) max_clients=100 # 最大并发连接数 max_per_ip=10 # 单IP最大连接数 # ============================================== # 2. 匿名用户控制(默认禁用,如需启用需调整权限) # ============================================== anonymous_enable=NO # 禁用匿名登录(安全优先) # anonymous_enable=YES # 如需启用匿名登录,取消注释此行 # 若启用匿名用户,需配置以下参数: # anon_root=/var/ftp # 匿名用户根目录 # anon_upload_enable=NO # 禁止匿名上传(默认) # anon_mkdir_write_enable=NO # 禁止匿名创建目录 # anon_other_write_enable=NO # 禁止匿名删除/重命名文件 # anon_max_rate=50000 # 匿名用户最大传输速率(50KB/s) # ============================================== # 3. 本地用户控制(重点:针对你创建的ftpuser等本地用户) # ============================================== local_enable=YES # 允许本地用户登录(必须开启) write_enable=YES # 允许本地用户写操作(上传/修改) # 本地用户根目录设置(可选:限制用户只能访问指定目录) # local_root=/data/ftp/$USER # 动态匹配用户家目录(如ftpuser对应/data/ftp/ftpuser) # local_root=/data/common # 所有本地用户共享目录(如需统一目录) # 家目录限制(chroot:防止用户访问系统其他目录) chroot_local_user=YES # 对所有本地用户启用chroot chroot_list_enable=NO # 不使用例外列表(若需部分用户不限制,设为YES并配置chroot_list_file) # chroot_list_file=/etc/vsftpd/chroot_list # 无需chroot的用户列表(一行一个用户名) allow_writeable_chroot=YES # 允许chroot目录可写(否则登录失败,必须开启) # 本地用户权限掩码(控制上传文件的默认权限) local_umask=022 # 上传文件权限为755(777-022),目录为755 # local_umask=002 # 若需同组可写,设为002(权限775) # 本地用户传输速率限制(可选) local_max_rate=0 # 0表示无限制(单位:字节/秒) # local_max_rate=1024000 # 限制为1MB/s # ============================================== # 4. 用户登录控制(黑白名单) # ============================================== userlist_enable=YES # 启用用户列表 userlist_deny=NO # 列表中的用户允许登录(白名单模式) # userlist_deny=YES # 列表中的用户禁止登录(黑名单模式) userlist_file=/etc/vsftpd/user_list # 用户列表路径(每行一个用户名,如ftpuser) # 禁止特定用户登录(如root、bin等系统用户,与userlist配合使用) # 需创建文件:/etc/vsftpd/ftpusers,添加禁止登录的用户(如root) pam_service_name=vsftpd # 使用PAM认证(默认,需确保/etc/pam.d/vsftpd存在) # ============================================== # 5. 被动模式配置(防火墙环境必备) # ============================================== pasv_enable=YES # 启用被动模式(客户端在NAT后必须开启) pasv_min_port=40000 # 被动模式最小端口 pasv_max_port=40100 # 被动模式最大端口(需在防火墙开放此范围) pasv_address=192.168.1.100 # 服务器公网IP(若客户端在公网访问,需填公网IP) # pasv_addr_resolve=YES # 若pasv_address填域名,需开启此参数 # ============================================== # 6. 日志与审计 # ============================================== xferlog_enable=YES # 启用传输日志 xferlog_file=/var/log/vsftpd/vsftpd.log # 传输日志路径(需创建目录并授权) xferlog_std_format=YES # 使用标准日志格式 # 启用详细日志(记录所有操作,便于排查问题) log_ftp_protocol=YES # 记录FTP命令细节 vsftpd_log_file=/var/log/vsftpd/vsftpd_details.log # 详细日志路径 # ============================================== # 7. 安全加固 # ============================================== # 禁止空密码用户登录 allow_anon_ssl=NO # 匿名用户禁用SSL(匿名已禁用,此行为冗余) force_local_data_ssl=NO # 本地用户数据传输不强制SSL(如需加密,设为YES并配置证书) force_local_logins_ssl=NO # 本地用户登录不强制SSL(如需加密,设为YES) # 超时设置(自动断开闲置连接) idle_session_timeout=300 # 会话闲置超时(5分钟) data_connection_timeout=120 # 数据传输超时(2分钟) # 禁止使用PORT模式(仅允许被动模式,更安全) connect_from_port_20=NO # 禁用主动模式的20端口数据连接 # ============================================== # 8. 其他高级设置(按需开启) # ============================================== # 启用目录消息(用户进入目录时显示.message文件内容) dirmessage_enable=YES message_file=.message # 消息文件名(默认.message) # 启用上传文件的所有者修改(可选) chown_uploads=NO # 禁用上传文件所有者修改 # chown_uploads=YES # chown_username=root # 上传文件所有者改为root(需谨慎使用) # 隐藏文件列表中的.和..(美化显示) ls_recurse_enable=NO # 禁止递归列出目录(安全)配置模板使用说明:
核心路径准备:
- 创建日志目录:
mkdir -p /var/log/vsftpd && chmod 755 /var/log/vsftpd - 用户列表文件:
touch /etc/vsftpd/user_list(添加允许登录的用户,如ftpuser) - 禁止登录用户文件:
touch /etc/vsftpd/ftpusers(添加root、bin等系统用户)
- 创建日志目录:
权限调整原则:
- 本地用户家目录(如
/data/ftpuser)权限:chown ftpuser:ftpuser /data/ftpuser && chmod 755 /data/ftpuser(必须非 root 所有,且不可写时需关闭allow_writeable_chroot) - 若需用户只能上传不能删除,可在目录下创建子目录并设置权限:
mkdir /data/ftpuser/upload && chmod 777 /data/ftpuser/upload
- 本地用户家目录(如
防火墙配合:
- 开放 21 端口和被动模式端口范围(40000-40100):
firewall-cmd --add-port=21/tcp --permanent firewall-cmd --add-port=40000-40100/tcp --permanent firewall-cmd --reload
- 开放 21 端口和被动模式端口范围(40000-40100):
参数调整建议:
- 生产环境建议开启 SSL/TLS 加密(需配置
ssl_cert_file和ssl_key_file) - 若无需匿名用户,保持
anonymous_enable=NO - 多用户场景下,通过
local_root动态指定家目录,便于隔离
- 生产环境建议开启 SSL/TLS 加密(需配置
6. 创建 ftp 用户(如需要)
# 创建用户ftpuser,家目录/data/ftpuser,禁止ssh登录(仅FTP可用) useradd -m -d /data/ftpuser -s /sbin/nologin ftpuser # 设置密码 passwd ftpuser # 授权目录权限 chown -R ftpuser:ftpuser /data/ftpuser chmod 755 /data/ftpuser7. 启动服务并验证
# 启动服务 systemctl start vsftpd # 设置开机自启 systemctl enable vsftpd # 验证状态(active (running)为正常) systemctl status vsftpd # 验证版本 vsftpd -v # 输出vsftpd: version 3.0.5 # 本地测试登录 ftp 127.0.0.1 # 输入ftpuser和密码,能登录即成功三、vsftpd 升级流程(从 3.0.3 到 3.0.5,保留配置和用户)
1. 备份关键文件
# 创建备份目录 mkdir -p /root/vsftpd_backup # 备份配置文件 cp /etc/vsftpd/vsftpd.conf /root/vsftpd_backup/ cp /etc/vsftpd/ftpusers /root/vsftpd_backup/ cp /etc/vsftpd/user_list /root/vsftpd_backup/ # 备份服务文件(若存在) cp /usr/lib/systemd/system/vsftpd.service /root/vsftpd_backup/ 2>/dev/null2. 卸载旧版本
# 停止服务 systemctl stop vsftpd # 卸载旧版本(yum安装的3.0.3) yum remove -y vsftpd3. 安装新版本(同 “二、安装流程” 的步骤 3-4)
编译安装 3.0.5 源码,确保安装路径为/usr/local/sbin/vsftpd,并创建服务文件。
4. 恢复配置和用户
# 恢复配置文件(复用旧配置) cp /root/vsftpd_backup/vsftpd.conf /etc/vsftpd/ cp /root/vsftpd_backup/ftpusers /etc/vsftpd/ # 无需重新创建ftpuser(用户信息保存在/etc/passwd,卸载不删除)5. 验证升级
同安装流程的 “步骤 7”,确保版本为 3.0.5 且ftpuser可正常登录。
四、核心配置详解(vsftpd.conf 关键参数)
| 参数 | 作用说明 | 推荐值(适配 ftpuser) |
|---|---|---|
local_enable | 是否允许本地用户(如 ftpuser)登录 | YES |
write_enable | 是否允许用户上传 / 修改文件 | YES |
chroot_local_user | 是否限制用户在家目录(防止访问系统其他目录) | YES |
allow_writeable_chroot | 允许家目录(/data/ftpuser)可写(否则登录失败) | YES |
anonymous_enable | 是否允许匿名登录(安全风险,禁用) | NO |
pasv_min_port/pasv_max_port | 被动模式端口范围(避免权限问题) | 40000-40010 |
userlist_enable | 启用用户列表(控制允许 / 禁止登录的用户) | YES |
userlist_file | 用户列表文件路径(需包含 ftpuser,允许其登录) | /etc/vsftpd/user_list |
五、常见问题及解决方案
启动失败:“Job for vsftpd.service failed...”
- 检查服务文件
ExecStart路径是否与实际安装路径一致(/usr/local/sbin/vsftpd); - 执行
/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf查看具体错误(如配置文件参数错误)。
- 检查服务文件
登录失败:“530 Login incorrect”
- 检查
ftpuser密码是否正确(passwd ftpuser重置); - 确认
vsftpd.conf中local_enable=YES且ftpuser在/etc/vsftpd/user_list中。
- 检查
权限错误:“Permission denied”
- 确保
/data/ftpuser属主为ftpuser:ftpuser,权限755(chown -R ftpuser:ftpuser /data/ftpuser && chmod 755 /data/ftpuser); - 临时关闭 SELinux 测试:
setenforce 0(永久生效:setsebool -P ftpd_full_access on)。
- 确保
端口占用:“could not bind listening IPv4 socket”
- 查找占用 21 端口的进程:
netstat -tnlp | grep 21,终止进程:kill -9 <进程ID>。
- 查找占用 21 端口的进程: