一、介绍

FTP 是 File Transfer Protocol (文件传输协议)的缩写 ,在 Unix/Linux 系统中常用的免费 FTP 服务器软件主要是 VSFTP,vsftp的官方地址:http://vsftpd.beasts.org

1. FTP 的工作模式

FTP工作时会开两个端口,一个命令端口(TCP:21),一个数据端口(TCP:20)

1.主动模式 (Active FTP)

服务器主动连接客户端

FTP 客户端随机开启一个大于1024 的端口 N 向服务器的 21 号端口发起连接,然后开放 N+1 号端口进行监听,并向服务器发出PORT N+1 命令。服务器接收到命令后,会用其本地的 FTP 数据端口(通常是 20 )来连接客户端指定的端口 N+1 ,进行数据传输

通道 client server
命令控制 1088 ------> 21
数据传输 1089 <------ 20

2. 被动模式(Passive FTP)

客户端主动链接服务器端

FTP 客户端随机开启一个大于1024 的端口 N 向服务器的 21 号端口发起连接,同时会开启 N+1 号端口。然后向服务器发送PASV 命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于 1024 的端口 P 进行监听,然后用 PORT P 命令通知客户端,自己的数据端口是 P 。客户端收到命令后,会通过 N+1号端后连接服务器的端口 P ,然后在两个端口之间进行数据传输

通道 client server
命令控制 1088 ------> 21
数据传输 1089 -- PASV --> 1099

关于两者的区别参考:http://slacksite.com/other/ftp.html

2.用户认证方式

1.匿名用户:ftp

2.系统用户:Linux系统用户

3.虚拟用户:

二、安装

ubuntu14.04

  1. $ sudo dpkg -i vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb
  2. $ netstat -lant | grep 21
  3. tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

三、配置文件

  • 用户认证配置文件:/etc/pam.d/vsftpd

  • 主配置文件:/etc/vsftpd.conf

  • 匿名用户(映射为系统用户ftp )共享文件位置:/srv/ftp

  1. anonymous_enable=NO # 是否允许匿名用户登陆,模式不允许
  2. local_enable=YES # 允许系统用户登陆
  3. #write_enable=YES # 允许登陆用户进行写操作,默认不允许
  4. #local_umask=022 # 用户登陆后创建文件的umask值
  5. #anon_upload_enable=YES # 允许匿名用户上传文件
  6. #anon_mkdir_write_enable=YES # 允许匿名用户创建目录
  7. dirmessage_enable=YES # 是否显示目录说明文件, 需要收工创建.message文件
  8. use_localtime=YES # 使用本地时间
  9. xferlog_enable=YES # 开启上传下载日志
  10. connect_from_port_20=YES # 数据传输端口
  11. #chown_uploads=YES # 是否改变上传文件的属主
  12. #chown_username=whoever # 如果是需要输入一个系统用户名
  13. #xferlog_file=/var/log/vsftpd.log # 日志文件的路径
  14. #xferlog_std_format=YES # 是否使用标准的ftp xferlog模式
  15. #idle_session_timeout=600 # session超时时间
  16. #data_connection_timeout=120   # 设置数据传输超时时间
  17. #nopriv_user=ftpsecure # 运行vsftpd需要的非特权系统用户默认是nobody
  18. #async_abor_enable=YES # 是否允许运行特殊的ftp命令async ABOR
  19. #ascii_upload_enable=YES # 是否使用ascii码方式上传文件
  20. #ascii_download_enable=YES # 是否使用ascii码方式下载文件
  21. #ftpd_banner=Welcome to blah FTP service. # 定制欢迎信息
  22. #deny_email_enable=YES # 是否允许禁止匿名用户使用某些邮件地址
  23. #banned_email_file=/etc/vsftpd.banned_emails # 禁止邮件地址的文件路径
  24. #chroot_local_user=YES # 本地用户禁锢在宿主目录中
  25. #chroot_list_enable=YES # 是否将系统用户限止在自己的home目录下
  26. #chroot_list_file=/etc/vsftpd.chroot_list # 列出的是不chroot的用户的列表
  27. #ls_recurse_enable=YES # 是否允许使用ls -R等命令
  28. secure_chroot_dir=/var/run/vsftpd/empty
  29. pam_service_name=vsftpd # pam的配置文件名称 /etc/pam.d/vsftpd
  30. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
  31. rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

四、 用户管理

1.匿名用户

1.1允许虚拟用户登陆

修改配置文件

  1. $ sudo vim /etc/vsftpd.conf
  2. nonymous_enable=YES
  3. $ sudo service vsftpd restart

测试:

  1. shuowei@gaopeng:~$ ftp 172.16.10.101
  2. Connected to 172.16.10.101.
  3. 220 (vsFTPd 3.0.2)
  4. Name (172.16.10.101:shuowei): ftp # 登陆用户为ftp
  5. 331 Please specify the password.
  6. Password: # 密码随意,可以为空
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> ls
  11. 200 PORT command successful. Consider using PASV.
  12. 150 Here comes the directory listing.
  13. -rw-r--r-- 1 0 0 0 Jan 25 11:12 test.txt
  14. 226 Directory send OK.
  15. ftp> get test.txt # 有下载的权限
  16. local: test.txt remote: test.txt
  17. 200 PORT command successful. Consider using PASV.
  18. 150 Opening BINARY mode data connection for test.txt (0 bytes).
  19. 226 Transfer complete.
  20. ftp> delete test.txt # 没有写的权限
  21. 550 Permission denied.
  22. ftp>

1.2允许匿名用户上传和建立目录

修改配置文件

  1. $ sudo vim /etc/vsftpd.conf
  2. nonymous_enable=YES
  3. write_enable=YES
  4. anon_upload_enable=YES
  5. anon_mkdir_write_enable=YES
  6. $ sudo service vsftpd restart
  1. $ sudo mkdir /srv/ftp/pub
  2. $ sudo chown ftp. /srv/ftp/pub/
  3. $ sudo chmod 777 /srv/ftp/pub/
  1. shuowei@gaopeng:~$ ftp 172.16.10.101
  2. Connected to 172.16.10.101.
  3. 220 (vsFTPd 3.0.2)
  4. Name (172.16.10.101:shuowei): ftp
  5. 331 Please specify the password.
  6. Password:
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> ls
  11. 200 PORT command successful. Consider using PASV.
  12. 150 Here comes the directory listing.
  13. drwxrwxrwx 2 105 112 4096 Jan 25 11:33 pub
  14. -rw-r--r-- 1 0 0 0 Jan 25 11:12 test.txt
  15. 226 Directory send OK.
  16. ftp> cd pub # 进入pub目录
  17. 250 Directory successfully changed.
  18. ftp> ls
  19. 200 PORT command successful. Consider using PASV.
  20. 150 Here comes the directory listing.
  21. 226 Directory send OK.
  22. ftp> mkdir testdir # 文件创建成功
  23. 257 "/pub/testdir" created
  24. ftp> put zabbix-3.0.tar.gz # 可以上传文件
  25. local: zabbix-3.0.tar.gz remote: zabbix-3.0.tar.gz
  26. 200 PORT command successful. Consider using PASV.
  27. 150 Ok to send data.
  28. 226 Transfer complete.
  29. 15653160 bytes sent in 0.10 secs (143.7224 MB/s)
  30. ftp> ls
  31. 200 PORT command successful. Consider using PASV.
  32. 150 Here comes the directory listing.
  33. drwx------ 2 105 112 4096 Jan 25 11:36 testdir
  34. -rw------- 1 105 112 15653160 Jan 25 11:42 zabbix-3.0.tar.gz
  35. 226 Directory send OK.

2.系统用户

1.系统用户登陆

  1. shuowei@gaopeng:~$ ftp 172.16.10.101
  2. Connected to 172.16.10.101.
  3. 220 (vsFTPd 3.0.2)
  4. Name (172.16.10.101:shuowei): ubuntu # 系统用户名
  5. 331 Please specify the password.
  6. Password: # 系统用户的密码
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> ls
  11. 200 PORT command successful. Consider using PASV.
  12. 150 Here comes the directory listing.
  13. -rw-r--r-- 1 1000 1000 111462 Jan 25 10:30 vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb
  14. 226 Directory send OK.
  15. ftp> pwd
  16. 257 "/home/ubuntu" # 登陆后在自己的家目录
  17. ftp> get vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb# 有下载的权限
  18. local: vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb remote: vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb
  19. 200 PORT command successful. Consider using PASV.
  20. 150 Opening BINARY mode data connection for vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb (111462 bytes).
  21. 226 Transfer complete.
  22. 111462 bytes received in 0.00 secs (52.1582 MB/s)
  23. ftp> delete vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb # 没有写的权限 需要开启write_enable=YES
  24. 550 Permission denied.

3.虚拟用户

VSFTP 一个称为安全的保证是采用了虚拟用户的认证方式,它靠对 /etc/pam.d/ 目录下指定的一个认证文件对用户进行认证,认证成功后再把虚拟用户映射为本地用户,该本地用户由服务器配置文件里的语句 ftp_username 的值指定。使用虚拟用户认证,则原有系统账户将不再可用。

所有虚拟用户会统一映射为一个指定的系统普通账号:访问共享位置,即为此系统普通用户的家目录,当然每个虚拟用户也可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

为了实现虚拟用户我们需要准备的环境

  1. 一个不可登陆的系统账户,并为这个系统创建一个家目录。虚拟账户就在这个家目录里活动。
  2. 创建虚拟账户名单,并为这些用户创建一个认证数据库

3.1创建虚拟用户

3.1.1.创建本地系统用户

  1. $ sudo mkdir /data
  2. $ sudo useradd -m -d /data/ftp -s /bin/false ftpadmin

3.1.2.建立虚拟账户名单

  1. ubuntu@node1:~$ sudo mkdir /etc/vsftpd/
  2. ubuntu@node1:~$ sudo vim /etc/vsftpd/ftpusers.txt
  3. jdyyy
  4. 123456
  5. yuanzhi
  6. 123456

3.1.3.生成虚拟账户的数据库

创建数据库文件需要安装db_util

  1. $ sudo dpkg -i db5.3-util_5.3.28-3ubuntu3.1_amd64.deb db-util_1%3a5.3.21~exp1ubuntu1_all.deb

生成认证数据库文件

  1. ubuntu@node1:~$ sudo db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/ftpusers.db
  2. # -T: 允许使用文本文件信息加载到数据库中
  3. # -t : 指定加密算法
  4. # -f : 指定文件
  5. ubuntu@node1:~$ sudo chmod 600 /etc/vsftpd/ftpusers.db

创建数据库的pam文件

  1. # 备份原来的pam文件
  2. $ sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
  3. # 拷贝pam模板文件到/etc/pam.d/
  4. $ sudo cp /usr/share/doc/vsftpd/examples/VIRTUAL_USERS/vsftpd.pam /etc/pam.d/vsftpd
  5. # 编译新的pam文件
  6. # 注意pam_userdb.so的位置,模板中/lib/security/pam_userdb.so是找不到的
  7. # 根据系统的情况改,db=/etc/vsftpd/ftpusers ftpuser是认证数据库文件的文件名,这里不需要加后缀
  8. $ sudo vim /etc/pam.d/vsftpd
  9. auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/ftpusers
  10. account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/ftpusers

3.1.4.修改配置文件

  1. # 激活虚拟用户
  2. guest_enable=YES
  3. # 虚拟用户映射到系统用户的用户名称(系统用户的名称)
  4. guest_username=ftpadmin
  5. # 虚拟用户拥有与系统用户相同的权限
  6. virtual_use_local_privs=YES

3.1.5.重启服务


异常处理

如果配置文件中没有加:virtual_use_local_privs=YES

登陆报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()

  1. shuowei@gaopeng:~$ ftp 172.16.10.101
  2. Connected to 172.16.10.101.
  3. 220 (vsFTPd 3.0.2)
  4. Name (172.16.10.101:shuowei): jdyyy
  5. 331 Please specify the password.
  6. Password:
  7. 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
  8. Login failed.
  9. ftp>

去除系统用户家目录写权限

  1. $ sudo chmod a-w /data/ftp/

但是又没有写的权限了。

3.1.6.最终配置

  1. listen=YES
  2. anonymous_enable=NO
  3. local_enable=YES
  4. write_enable=YES
  5. dirmessage_enable=YES
  6. use_localtime=YES
  7. xferlog_enable=YES
  8. connect_from_port_20=YES
  9. xferlog_file=/var/log/vsftpd.log
  10. secure_chroot_dir=/var/run/vsftpd/empty
  11. pam_service_name=vsftpd
  12. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
  13. rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
  14. guest_enable=YES
  15. guest_username=ftpadmin
  16. virtual_use_local_privs=YES

这样虚拟用户读写删权限都有

3.2. 实现虚拟用户不同权限

3.2.1 修改FTP主配置文件

  1. $ sudo vim /etc/vsftpd.conf
  2. user_config_dir=/etc/vsftpd_user_conf

3.2.2给每个虚拟用户创建一个独立的权限配置文件-版本1

  1. $ sudo mkdir /data/ftp/jdyyy
  2. $ sudo mkdir /etc/vsftpd_user_conf
  3. $ sudo vim /etc/vsftpd_user_conf/jdyyy
  4. # 只有上传权限,没有下载权限
  5. write_enable=YES
  6. virtual_use_local_privs=NO
  7. anon_upload_enable=YES
  8. anon_world_readable_only=YES
  9. anon_mkdir_write_enable=YES
  10. anon_other_write_enable=NO
  11. $ sudo vim /etc/vsftpd_user_conf/yuanzhi
  12. # 只有下载权限
  13. write_enable=NO
  14. virtual_use_local_privs=NO
  15. anon_upload_enable=NO
  16. anon_world_readable_only=NO
  17. anon_mkdir_write_enable=NO
  18. anon_other_write_enable=NO
  19. # 注意ftp文件夹的权限
  20. ubuntu@node1:/$ ll /data/
  21. total 12
  22. drwxr-xr-x 3 root root 4096 Jan 25 16:17 ./
  23. drwxr-xr-x 23 root root 4096 Jan 25 16:17 ../
  24. drwxr-xr-x 4 ftpadmin ftpadmin 4096 Jan 25 17:50 ftp/
  25. # 主配置文件
  26. ubuntu@node1:/$ grep -Ev "(^#|^$)" /etc/vsftpd.conf
  27. listen=YES
  28. anonymous_enable=NO
  29. local_enable=YES
  30. dirmessage_enable=YES
  31. use_localtime=YES
  32. xferlog_enable=YES
  33. connect_from_port_20=YES
  34. xferlog_file=/var/log/vsftpd.log
  35. chroot_local_user=YES
  36. secure_chroot_dir=/var/run/vsftpd/empty
  37. pam_service_name=vsftpd
  38. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
  39. rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
  40. guest_enable=YES
  41. guest_username=ftpadmin
  42. virtual_use_local_privs=YES
  43. allow_writeable_chroot=YES
  44. user_config_dir=/etc/vsftpd_user_conf

3.2.3给每个虚拟用户创建一个独立的权限配置文件-版本2

​权限 upload download admin
下载 - + +
上传 + - +
创建目录 + - +
删除 - - +
  1. root@node1:~# ls -ld /data/ftp/*
  2. drwxr-xr-x 2 ftpadmin ftpadmin 4096 Jan 28 18:50 /data/ftp/download
  3. drwxr-xr-x 3 ftpadmin ftpadmin 4096 Jan 28 18:54 /data/ftp/upload
  4. vsftpd服务的主配置文件
  5. ubuntu@node1:~$ grep -Ev "(^#|^$)" /etc/vsftpd.conf
  6. listen=YES
  7. anonymous_enable=NO
  8. local_enable=YES
  9. dirmessage_enable=YES
  10. use_localtime=YES
  11. xferlog_enable=YES
  12. connect_from_port_20=YES
  13. xferlog_file=/var/log/vsftpd.log
  14. chroot_local_user=YES
  15. secure_chroot_dir=/var/run/vsftpd/empty
  16. pam_service_name=vsftpd
  17. rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
  18. rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
  19. guest_enable=YES
  20. guest_username=ftpadmin
  21. allow_writeable_chroot=YES
  22. user_config_dir=/etc/vsftpd_user_conf

创建不同用户各自的的配置文件

  1. root@node1:~# ls /etc/vsftpd_user_conf/
  2. admin download upload
  3. ubuntu@node1:~$ cat /etc/vsftpd_user_conf/download
  4. write_enable=NO
  5. anon_upload_enable=NO
  6. anon_world_readable_only=NO
  7. anon_mkdir_write_enable=NO
  8. anon_other_write_enable=NO
  9. local_root=/data/ftp/download
  10. ubuntu@node1:~$ cat /etc/vsftpd_user_conf/upload
  11. write_enable=YES
  12. anon_upload_enable=YES
  13. anon_world_readable_only=YES
  14. anon_mkdir_write_enable=YES
  15. anon_other_write_enable=NO
  16. local_root=/data/ftp/upload
  17. ubuntu@node1:~$ cat /etc/vsftpd_user_conf/admin
  18. write_enable=YES
  19. anon_upload_enable=YES
  20. anon_world_readable_only=NO
  21. anon_mkdir_write_enable=YES
  22. anon_other_write_enable=YES

生成用户数据库文件

  1. ubuntu@node1:~$ cat /etc/vsftpd/ftpusers.txt upload
  2. 123456
  3. download
  4. 123456
  5. admin
  6. admin
  7. ubuntu@node1:~$ sudo db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/ftpusers.db

重启服务

Ubuntu14 vsftp 的安装和虚拟用户配置的更多相关文章

  1. vsftpd安装及虚拟用户配置

    服务器环境:CentOS6.9 Linux 2.6.32-696.10.1.el6.x86_64 安装vsftpd.db4.db4-utils # yum -y install vsftpd db4 ...

  2. vsftpd服务安装与虚拟用户配置

    vsftpd的全名是“Very secure FTP Daemon” 一.安装vsftpd安装db4-util用于生成认证文件 yum -y install db4-utils 安装vsftpd yu ...

  3. CentOS7安装vsftpd3.0.2、以及虚拟用户配置

    vsftpd(very secure ftp daemon)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,还具有很高的安全性.传输速度,以及支持虚拟用户验证. vsftpd ...

  4. VSFTPD虚拟用户配置

    转载:http://www.cnblogs.com/allenjin/archive/2011/12/03/2274542.html 以下操作验证OK!!!! VSFTPD虚拟用户配置 VSFTP = ...

  5. 烂泥:Postfix邮件服务器搭建之虚拟用户配置

    virtual_gid_maps = static: virtual_transport = dovecot dovecot_destination_recipient_limit = 1 注意:po ...

  6. 最简洁粗暴版的虚拟用户配置FTP

    最简洁粗暴版的虚拟用户配置FTP yum安装FTP: yum install vsftpd pam* db4* -y 设置为系统服务:chkconfig –level 35 vsftpd on 2.v ...

  7. vsftpd 虚拟用户配置

    vsftpd 虚拟用户的作用是 通过不同的虚拟用户可以有不同的根目录. 从 2.3.5 版本之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能在具有写权限了,如果检查 ...

  8. FTP服务器虚拟用户配置

    FTP服务配置问题及解决方案 使用被动模式,设置云主机IP为被动模式数据传输地址:在配置文件内添加 pasv_enable=YES pasv_promiscuous=YES pasv_address= ...

  9. vsftp虚拟用户配置

    找了很久,终于找到像样一点的文章,很详细,参数方面懂英文基本能看懂,一个教程是否有用,关键在于细节.错了一点点就不能配下去了. ------------------------------------ ...

随机推荐

  1. 3D打印格式STL

    STL格式及其转换 近期接触了3D打印的一些东西,也制作了一个vrml转stl的插件,对该领域多了一些认识. 目前尚没有打印机直接支持stl.obj等格式,在打印之前需使用厂家提供的软件将stl等格式 ...

  2. HTML5基础知识汇总(一)

    一.HTML的开发工具和使用的浏览器 开发工具:记事本等文本编辑器,Atom.VisualStudioCode( VSCode).Brackets.Sublime text和Hbuider. 浏览器: ...

  3. POJ 3764 The xor-longest Path ( 字典树求异或最值 && 异或自反性质 && 好题好思想)

    题意 : 给出一颗无向边构成的树,每一条边都有一个边权,叫你选出一条路,使得此路所有的边的异或值最大. 分析 : 暴力是不可能暴力的,这辈子不可能暴力,那么来冷静分析一下如何去做.假设现在答案的异或值 ...

  4. springboot-mybatis-demo遇到的坑

    目录 前言 问题&解决 1.初始化Maven工程过慢 2.Spring Boot 集成druid时时区问题和连接超时问题 3.完整工程下载 前言 环境: java version " ...

  5. UNR#3 Day1——[ 堆+ST表+复杂度分析 ][ 结论 ][ 线段树合并 ]

    地址:http://uoj.ac/contest/45 第一题是鸽子固定器. 只会10分.按 s 从小到大排序,然后 dp[ i ][ j ][ k ] 表示前 i 个元素.已经选了 j 个.最小值所 ...

  6. Coffee Chicken

    Coffee Chicken 字符串斐波那契 输出第s[n]个字符串的第k位及后十位 暴力算出前20项,超过20,跑dfs #include<bits/stdc++.h> using na ...

  7. rf-idf的java实现

    还存在的问题是,对于其中分词借助的库还存在问题 参考此篇链接 http://www.cnblogs.com/ywl925/archive/2013/08/26/3275878.html 具体代码部分: ...

  8. React-Native 之 GD (一)目录结构与第三方框架使用与主题框架搭建

    1.APP效果图 2.工程环境配置 IOS: 将压缩包内的 Images.xcassets 文件夹直接替换掉我们iOS工程中的 Images.xcassets 文件夹. 这时候我们可以看到所有图片资源 ...

  9. React-Native 之 GD (二)自定义共用导航栏样式

    1.自定义导航栏样式 步骤一:从效果图中可以看出,导航栏的样式都差不多,因为我们前面已经设置了 Navigator ,这边的话我们还需要自定义 Navigator 的样式,可以看到所有的 Naviga ...

  10. leetcode-mid-Linked list-160 Intersection of Two Linked Lists-NO

    mycode 用了反转链表,所以不符合题意 参考: 思路: 1 先让长的链表先走,然后相同长度下看是否相遇 class Solution(object): def getIntersectionNod ...