• CentOS 环境下部署 vsftpd


    安装 vsftpd

    yum install -y vsftpd
    
    • 1

    查看 vsftpd 版本

    vsftpd -version
    
    • 1

    vsftpd: version 3.0.2

    查看 vsftpd 启动方式

    systemctl cat vsftpd.service
    
    • 1

    想要实现多实例 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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
    
    • 1
    • 2
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    启动 vsftpd 并设为开机自启

    systemctl enable vsftpd.service && \
    systemctl start vsftpd.service
    
    • 1
    • 2

    创建虚拟用户

    创建虚拟用户配置文件目录

    mkdir /etc/vsftpd/virtuser
    
    • 1

    创建一个不允许登录 shell 的用户,这样更安全

    useradd ftptest -s /sbin/nologin
    
    • 1

    为用户设置密码

    echo 'ftptest' | passwd --stdin ftptest
    
    • 1

    配置虚拟用户名和密码

    奇数行为用户名

    偶数行为密码

    cd /etc/vsftpd
    vim virtuser.list
    
    • 1
    • 2
    ftptest
    ftptest   # 密码不一定要和之前创建的用户一致,最终是通过 PAM 去访问生成的 db 文件
    
    • 1
    • 2

    使用 db_load 命令用 HASH 算法生成 FTP 用户数据库文件 virtuser.db

    如果有需要追加的情况,重新编写 virtuser.list ,重新使用下面的命令生成文件即可

    db_load -T -t hash -f virtuser.list virtuser.db
    
    • 1

    修改 db 文件权限

    chmod 600 virtuser.db
    
    • 1

    完成后,删除 list 文件,因为都是明文密码

    rm -f virtuser.list
    
    • 1

    生成支持虚拟用户的 PAM 文件

    vim /etc/pam.d/virtftpuser
    
    • 1
    auth required pam_userdb.so db=/etc/vsftpd/virtuser
    account required pam_userdb.so db=/etc/vsftpd/virtuser
    
    • 1
    • 2

    配置虚拟用户配置文件

    vim virtuser/ftptest
    
    • 1
    guest_username=ftptest
    local_root=/data/vsftpd
    
    • 1
    • 2

    重启 vsftpd ,使配置生效

    systemctl restart vsftpd
    
    • 1

    环境验证

    先造一个假数据

    mkdir -p /data/vsftpd
    echo test > /data/vsftpd/test.txt
    
    • 1
    • 2

    登录 ftp 查看

    如果没有 ftp 命令,可以执行 yum install -y ftp

    ftp 10.0.0.11 10021
    
    • 1
    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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    关于主动模式和被动模式

    主动模式配置

    pasv_enable=YES
    pasv_min_port=
    pasv_max_port=
    
    • 1
    • 2
    • 3

    被动模式配置

    pasv_enable=NO
    port_enable=YES
    
    • 1
    • 2

    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 都使用 二进制传输模式

  • 相关阅读:
    Dubbo应用与实践
    D. Anti-Sudoku
    termux安装docker
    ubutun上编译出现undefined reference to symbol ‘dladdr@@GLIBC_2.2.5‘的错误
    【Push Kit】模拟服务端发送消息至客户端,测试消息发送功能(华为推送服务)
    干货|MATLAB工具箱之PsPM的介绍与安装
    二十、SpringBoot + Jwt + Vue 权限管理系统(1)
    【无标题】目录测试
    C++11中篇
    centos7下安装无头浏览器(headless Chrome)
  • 原文地址:https://blog.csdn.net/u010383467/article/details/125991132