一、基础介绍
1.vsftpd运行模式分为standalone和xinetd模式,现在生产环境中,绝大多数均采用standalone模式。
vsftpd一启动,standalone模式中进程会一直驻留在内存中,当接收到21端口的请求时vsftpd进程会fork出一个子进程去处理连接,而原进程继续监听21端口。另更加便于PAM验证的应用(可通过pam_ihosts.so实现单一IP、单一用户的限制)。
xinetd模式的话默认是xinetd进程监听21端口,当网卡收到外部连接请求时,xinetd进程会去调用ftp进程,并将21端口收到数据转交给vsftpd进程处理(连接处理完毕后,vsftpd进程会自动退出),而xinetd则继续监听21端口(另支持单一IP限制)
既然vstandlone的模式这么好,那么该怎么配置呢
1)首先禁用xinetd进程中的vsftpd,并重启xinetd服务
# grep 'disable' /etc/xinetd.d/vsftpd disable = yes
2)把vsftpd配置文件中的 listen 参数置为 YES
# grep '^listen' /etc/vsftpd/vsftpd.conf listen=YES
2.vsftpd工作模式分主动(PORT)及被动(PASV)2 种,centos及windows等常见系统默认一般采用被动模式连接ftp server,所以搭建vsftpd时,推荐使用被动模式。如果需启用防火墙,可以在FTP SERVER上限制被动模式数据端口范围并放行即可。下面我们来看看这两种模式的区别。
PORT模式(FTP服务器主动去连接客户端的数据端口): 服务器端口固定,命令端口21,数据端口20。客户端从任意特权限端口N(N>1024)发起请求连接服务器命令端口21,并监听本机的 N+1端口,并发送FTP命令(port N+1)到服务器,FTP服务器会从自己的数据端口(默认20)主动连接客户端的N+1端口,这样就完成了数据传输通道建立了。
PASV模式(FTP服务器数据端口被动的等待客户来连接):客户端打开2个任意特权端口(N>1024,N+1),并从端口N发起一个连接,PASV模式执行PASV命令,并授权服务器连接它的数据端口,即N+1。FTP服务器会开启一个任意的非特权端口P(如果vsftpd.conf没有限制端口范围),并向客户端发送PORT P 命令。然后等待客户通过 N+1 来连接端口P建立数据传输通道。
参考文档:https://www.cnblogs.com/kuliuheng/p/3209744.html
二、vsftpd安装配置
1.安装
# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm # rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm
2.参数如下,具体配置根据业务需求定义
常用参数: local_umask=022 本地用户上传文件后的默认权限(umask是unix系统的概念,新建的目录权限为755,文件644) anon_umask=077 匿名用户的umask值,默认为077,及目录权限是700,文件是 600 anonymous_enable=NO 禁止匿名访问 listen=YES 运行于standalone mode local_enable=YES 任何非匿名用户(包含本地及虚拟用户)都需启用此参数 max_clients=100 #FTP服务器最大承载用户数 max_per_ip=4 # 限制一个用户最多连接数为4 local_max_rate=512000 # 限制本地下载带宽不能超过500KB anon_max_rate 限制匿名用户的下载带宽,单位是bytes/s accept_timeout=60 #超时,以秒计,用于远程客户端以PASV模式建立数据连接 connect_timeout=60 #超时,以秒计,用于远程客户端以PORT模式建立数据连接 connect_from_port_20=YES # 控制端口数据走端口20,如果是被动模式,需把此参数改为NO listen_port=8080 #更改监听端口8080, 默认是21 #anon_upload_enable=YES 允许匿名用户上传文件,默认禁止 #anon_mkdir_write_enable=YES 允许匿名用户创建目录,默认禁止 user_config_dir=/etc/vsftpd/vsftpd_user_conf 创建虚拟用户存储文件 virtual_use_local_privs=NO 虚拟用户权限与匿名用户权限相同,虚拟用户权限单独设定 chroot_local_user=YES 将所有用户锁定在主目录(vsftpd如果启用chroot,默认必须保证ftp根目录不可写,chmod a-w /vsftp/chenss/) chroot_list_enable=YES 启动锁定用户的名单(NO或注释为禁用),如果为NO,只锁定chroot_list中限制用户,YES则表明将所有用户锁定在主目录,而chroot_list中的用户不锁定 chroot_list_file=/etc/vsftpd/chroot_list 锁定用户名单列表 allow_writeable_chroot=YES 默认为NO,当启用chroot并配置些参数为YES后,虚拟用户将具备对其根目录写权限 dirmessage_enable=YES #用户切换进入目录时显示.message(如果存在)文件的内容 权限参数 userlist_deny 如果userlist_enable为YES则检查此项(默认YES) userlist_enable 当值为YES时,如果userlist_deny为YES则禁用/etc/vsftpd/user_list文件中账号,在输入密码之前就提示权限拒绝。如果userlist_deny=NO,则代表仅允许此文件中的账号登陆 虚拟账号参数: pam_service_name=vsftpd PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证 guest_enable=YES 启用虚拟用户功能 guest_username=vsftpd 指定虚拟用户(无需是系统用户)的宿主用户,虚拟用户从此账号继承权限 user_config_dir=/etc/vsftpd/vsftpd_user_conf 设定虚拟用户个人vsftp的文件存放路径(配置文件名=虚拟用户名) anon_upload_enable 如果设置为YES,匿名用户将可以在特定条件下上传文件,此参数必须激活write_enable,而且ftp用户必须具备对上传目录的写权限,虚拟用户默认为被匿名处理,因此也需启用此参数 anon_mkdir_write_enable 如果设置为YES,匿名用户将可以创建目录,条件同anon_upload_enable write_enable 建议主配置文件中不启用此参数,在虚拟用户配置中开启。允许或禁止任意形式的FTP命令写入
详细配置参数请参考:https://security.appspot.com/vsftpd/vsftpd_conf.html
被动模式参考配置:
anonymous_enable=NO local_enable=YES write_enable=NO local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=NO xferlog_std_format=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES pam_service_name=vsftpd userlist_enable=YES userlist_deny=YES tcp_wrappers=YES guest_enable=YES guest_username=ftp user_config_dir=/etc/vsftpd/vsftpd_user_conf vsftpd_log_file=/var/log/vsftpd.log pasv_enable=YES pasv_min_port=30000 pasv_max_port=30010
3.虚拟账号创建
1)创建用户密码文本
# cat /etc/vsftpd/logins.txt # 奇数行是账号,偶数行是密码 chenss abcdefg test 123456
2)生成虚拟用户认证文件
# db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db
备注:
-T 允许应用程序将文本转译载入数据库
-t 指定载入的数据库类型,使用hash码加密
-f 指定账号密码文本文件
3)配置认证文件(注释vsftpd原全部内容,再加以下2行)
# cat /etc/pam.d/vsftpd auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
备注:
auth是指对用户的用户名口令进行验证。
accout是指对用户的帐户有哪些权限哪些限制进行验证。
再后面的/lib64/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。
如果是32bit系统,该文件所在位置是/lib/security/pam_userdb.so
如果是64bit系统,该文件所在位置是/lib64/security/pam_userdb.so
最后db=/etc/vsftpd/login则指定了验证库函数将到这个指定的数据库中调用数据进行验证。其实该文件指的是/etc/vsftpd/login.db文件。注意:db=/etc/vsftpd/login格式是这样的,去掉.db后缀。
4)创建虚拟用户配置目录和文件(虚拟用户配置文件必须与用户名一致)
# cat /etc/vsftpd/vsftpd_user_conf/chenss local_root=/vsftp/chenss # 虚拟用户根目录 guest_username=vsftp #虚拟用户的宿主用户 file_open_mode=0400 # 文件权限 write_enable=YES # 写权限 anon_upload_enable=YES # 上传权限 anon_mkdir_write_enable=YES # 创建文件夹权限 virtual_use_local_privs=YES #虚拟用户和本地用户有相同的权限(即vsftpd用户) cmds_allowed=ABOR,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,SIZE,STOR,TYPE,USER,HELP,STAT #授权读写,禁止删除
备注:cmds_allowed详细信息请参考:http://dreamway.blog.51cto.com/1281816/1045610
5)创建虚拟用户根目录(test账号同chenss)
[root@test2 ~]# mkdir -p /vsftp/chenss [root@test2 ~]# chmod 500 /vsftp/chenss [root@test2 ~]# chown -R vsftpd.vsftpd /vsftp/chenss
其实到了这里,启用vsftpd服务即可使用了
三、编译pam_ihosts.so并加载入PAM认证
1.编译
# git clone git@github.com:ColumPaget/pam_ihosts.git # ./configure # make # make instal
2.授权chenss用户只能能过192.168.1.10来访问ftp:
# cat /etc/pam.d/vsftpd account required /lib/security/pam_ihosts.so user=chenss syslog allow-ip=192.168.1.10 auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
pam_ihosts用法:https://github.com/ColumPaget/pam_ihosts
四、FTP数字代码的意义(忘记在哪看到的,没有链接,就直接贴代码了)
110 重新启动标记应答。 120 服务在多久时间内ready。 125 数据链路端口开启,准备传送。 150 文件状态正常,开启数据连接端口。 200 命令执行成功。 202 命令执行失败。 211 系统状态或是系统求助响应。 212 目录的状态。 213 文件的状态。 214 求助的讯息。 215 名称系统类型。 220 新的联机服务ready。 221 服务的控制连接端口关闭,可以注销。 225 数据连结开启,但无传输动作。 226 关闭数据连接端口,请求的文件操作成功。 227 进入passive mode。 230 使用者登入。 250 请求的文件操作完成。 257 显示目前的路径名称。 331 用户名称正确,需要密码。 332 登入时需要账号信息。 350 请求的操作需要进一部的命令。 421 无法提供服务,关闭控制连结。 425 无法开启数据链路。 426 关闭联机,终止传输。 450 请求的操作未执行。 451 命令终止:有本地的错误。 452 未执行命令:磁盘空间不足。 500 格式错误,无法识别命令。 501 参数语法错误。 502 命令执行失败。 503 命令顺序错误。 504 命令所接的参数不正确。 530 未登入。 532 储存文件需要账户登入。 550 未执行请求的操作。 551 请求的命令终止,类型未知。 552 请求的文件终止,储存位溢出。 553 未执行请求的的命令,名称不正确。