CentOS 环境下部署 vsftpd

安装 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_enableport_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.pdf 等)

通常 ftp 都使用 二进制传输模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值