安装 vsftpd
yum install -y vsftpd
查看 vsftpd 版本
vsftpd -version
vsftpd: version 3.0.2
查看 vsftpd 启动方式
systemctl cat vsftpd.service
想要实现多实例 vsftpd 的场景,只需要复制 vsftpd.service
文件,重命名一下,然后修改一下指向的 /etc/vsftpd/vsftpd.conf
文件名称,配置文件内再修改一下 listen_port=
定义端口
# /usr/lib/systemd/system/vsftpd.service [Unit] Description=Vsftpd ftp daemon After=network.target [Service] Type=forking ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf [Install] WantedBy=multi-user.target
vsftpd 配置文件说明
ftp 访问路径
local_root=
是否开启匿名模式
anonymous_enable=YES
是否允许本地用户登录
local_enable=YES
是否允许任何形式写入 ftp
write_enable=YES
本地 umask 值
local_umask=022
允许匿名用户上传文件到 ftp
anon_upload_enable=YES
允许匿名用户在 ftp 上创建目录
anon_mkdir_write_enable=YES
虚拟用户是否和本地用户权限一致
virtual_use_local_privs=YES
是否记录目录活动信息
dirmessage_enable=YES
是否记录上传和下载的信息
xferlog_enable=YES
开启主动模式
connect_from_port_20=YES
开启被动模式
pasv_enable=YES
配置被动模式端口范围
默认为 0,表示 1024 以上的所有端口
pasv_min_port=30000
pasv_max_port=31000
指定登录传输的端口
listen_port=10022
指定上传文件属于哪个用户
chown_uploads=YES
chown_username=whoever
定义日志目录,默认为
/var/log/xferlog
xferlog_file=/var/log/xferlog
定义日志格式是否为 xferlog
xferlog_std_format=YES
定义空闲会话超时时间
idle_session_timeout=600
定义数据链接超时时间
data_connection_timeout=120
定义非特权用户
nopriv_user=ftpsecure
服务器是否识别 ABOR 异步请求
async_abor_enable=YES
是否允许 ASCII 模式,默认为 NO
ascii_upload_enable=YES
ascii_download_enable=YES
定义 ftp 登录时的横幅
ftpd_banner=Welcome to blah FTP service.
是否拒绝匿名电子邮件,
deny_email_enable=YES
指定用户登陆时 chroot 到某个指定的目录
chroot 可能非常危险。如果使用 chroot,请确保用户对 chroot 内的顶级目录没有写入权限
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
是否启用
ls -R
参数,避免多用户造成 I/O 问题
ls_recurse_enable=NO
当启用“listen”指令时,vsftpd 以独立模式运行并侦听 IPv4 套接字
该指令不能与 listen_ipv6 指令结合使用
listen=NO
启用侦听 IPv6 套接字
listen_ipv6=YES
开启虚拟用户模式
guest_enable=YES
设定 PAM 服务下 vsftpd 的验证配置文件名
PAM 验证将参考 /etc/pam.d/ 下的 vsftpd 文件配置
pam_service_name=vsftpd
是否启用 user_list 文件
userlist_deny=NO
时表示 user_list 文件内的用户拒绝登录 vsftp
userlist_deny=YES
时表示 user_list 文件内的用户允许登录 vsftp
userlist_enable=YES
虚拟用户配置文件路径
user_config_dir=
支持 TCP Wrappers
tcp_wrappers=YES
配置 vsftpd
cp /etc/vsftpd/vsftpd.conf{,.bak} vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO write_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES local_enable=YES write_enable=YES local_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES dirmessage_enable=YES connect_from_port_20=NO pasv_enable=YES pasv_min_port=20000 pasv_max_port=20480 listen_port=10021 chown_uploads=NO xferlog_enable=YES xferlog_file=/var/log/xferlog xferlog_std_format=YES async_abor_enable=YES ascii_upload_enable=NO ascii_download_enable=NO ftpd_banner=Welcome My Friend chroot_list_enable=NO ls_recurse_enable=NO listen=YES tcp_wrappers=YES guest_enable=YES virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/virtuser pam_service_name=/etc/pam.d/virtftpuser
启动 vsftpd 并设为开机自启
systemctl enable vsftpd.service && \ systemctl start vsftpd.service
创建虚拟用户
创建虚拟用户配置文件目录
mkdir /etc/vsftpd/virtuser
创建一个不允许登录 shell 的用户,这样更安全
useradd ftptest -s /sbin/nologin
为用户设置密码
echo 'ftptest' | passwd --stdin ftptest
配置虚拟用户名和密码
奇数行为用户名
偶数行为密码
cd /etc/vsftpd vim virtuser.list
ftptest ftptest # 密码不一定要和之前创建的用户一致,最终是通过 PAM 去访问生成的 db 文件
使用 db_load
命令用 HASH 算法生成 FTP 用户数据库文件 virtuser.db
如果有需要追加的情况,重新编写 virtuser.list
,重新使用下面的命令生成文件即可
db_load -T -t hash -f virtuser.list virtuser.db
修改 db 文件权限
chmod 600 virtuser.db
完成后,删除 list 文件,因为都是明文密码
rm -f virtuser.list
生成支持虚拟用户的 PAM 文件
vim /etc/pam.d/virtftpuser
auth required pam_userdb.so db=/etc/vsftpd/virtuser account required pam_userdb.so db=/etc/vsftpd/virtuser
配置虚拟用户配置文件
vim virtuser/ftptest
guest_username=ftptest local_root=/data/vsftpd
重启 vsftpd ,使配置生效
systemctl restart vsftpd
环境验证
先造一个假数据
mkdir -p /data/vsftpd echo test > /data/vsftpd/test.txt
登录 ftp 查看
如果没有 ftp 命令,可以执行
yum install -y ftp
ftp 10.0.0.11 10021
Connected to 10.0.0.11 (10.0.0.11). 220 Welcome My Friend Name (10.0.0.11:root): ftptest # 配置的虚拟用户 331 Please specify the password. Password: # 输入密码 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls # 查看文件 227 Entering Passive Mode (10,0,0,11,79,202). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 5 Jul 25 10:10 test.txt 226 Directory send OK.
关于主动模式和被动模式
主动模式配置
pasv_enable=YES pasv_min_port= pasv_max_port=
被动模式配置
pasv_enable=NO port_enable=YES
当 pasv_enable
和 port_enable
同时为 YES
时,同时支持主、被动模式
主动模式(PORT)
- FTP 客户端连接到 FTP 服务器的 21 端口,发送用户名和密码登录,登录成功后要 list 列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT 命令到 FTP 服务器,告诉服务器,客户端采用主动模式并开放端口
- FTP 服务器收到 PORT 主动模式命令和端口号后,通过服务器的 20 端口和客户端开放的端口连接,发送数据
- 主动模式传输数据时是
服务器
连接到客户端
的端口
- 主动模式需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给 FTP 服务器访问比较困难
被动模式(PASV是Passive的缩写)
- FTP 客户端连接到 FTP 服务器的 21 端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送 PASV 命令到 FTP 服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端,客户端再连接到服务器开放的端口进行数据传输
- 被动模式传输数据是
客户端
连接到服务器
的端口- 被动模式只需要服务器端开放端口给客户端连接就行了
总结
- FTP 默认采用主动模式
- 如果 FTP 在局域网内使用,主动模式不影响实际的使用
- 如果 FTP 需要暴露在公网使用,需要切换成被动模式
关于 ftp 的 ASCII 传输模式和 二进制传输模式
ASCII 传输模式
传输时会对文件内容进行编译,主要是针对不同操作系统之间的
回车
/换行
/结束符
等进行转译
如果要传输文本文件,建议使用 ASCII 数据类型或传输模式
- 除了纯文本文件(扩展名为 .txt 的文件)之外以及使用 UTF-8 字符编码的文本文件 [ ASCII 不支持
日文
、中文
或韩文字符
] - HTML 文件
- CGI 脚本
- 级联样式表文件
- javascript 文件
- 同样属于此分类的一些文件扩展名包括:
.html
.php
.cgi
.js
.txt
.css
二进制传输模式
传输时保留文件的位序,逐位拷贝原始文件而不管内容
- 图像文件(例如
.jpg
、.bmp
、.png
)
- 声音文件(例如
.mp3
、.avi
、.wma
)- 视频文件(例如
.flv
、.mkv
、.mov
、.mp4
)- 存档文件(例如
.zip
、.rar
、.tar
)- 其他文件(例如
.exe
、.doc
、.xls
、
通常 ftp 都使用 二进制传输模式