共计 11521 个字符,预计需要花费 29 分钟才能阅读完成。
Vsftpd 原理
vsftpd 是 linux 发行版中的一款 ftp 服务器程序,它的全称是“very secure ftp daemon”, 号称是最安全的 ftp 服务器。它工作在 21,20 号端口,主要提供文件传输服务,可以跨越网络提供服务,非常好用。
本文主要内容:
一,ftp 的工作原理:
二,vsftpd 的配置文件:
三,vsftpd 的安装
四,vsftpd 的启动与关闭:
五,vsftpd 的配置文件 /etc/vsftpd/vsftpd.conf 解析:
六,用 tcp_wraper 来控制 vsftpd:
七,创建 ftp 虚拟用户
八,启用 ssl,建立安全的传输
————————————– 分割线 ————————————–
玩转 vsftpd 服务器的四大高级配置:http://www.linuxidc.com/Linux/2013-09/90565.htm
vsFTPd 配置教程:http://www.linuxidc.com/Linux/2013-09/90562.htm
Ubuntu 实用简单的 FTP 架设 http://www.linuxidc.com/Linux/2012-02/55346.htm
Ubuntu 上架设 FTP 服务器和 Apache 服务器 http://www.linuxidc.com/Linux/2011-04/35295.htm
Ubuntu 13.04 安装 LAMP\vsftpd\Webmin\phpMyAdmin 服务及设置 http://www.linuxidc.com/Linux/2013-06/86250.htm
RHEL6 平台下 SeLinux 和 vsftpd 的匿名上传的简单案例 http://www.linuxidc.com/Linux/2013-04/82300.htm
Linux 系统 vsftpd 源码安装 http://www.linuxidc.com/Linux/2013-03/81475.htm
vsftpd 的安全配置案例分析 http://www.linuxidc.com/Linux/2012-12/76501.htm
————————————– 分割线 ————————————–
一,ftp 的工作原理:
ftp 的两种工作模式:
1,主动模式
工作原理:客户端从一个任意的非特权端口(大于 1024)N 连接到 FTP 服务器的命令端口,也就是 21 端口。然后客户端开始监听端口 N +1,并发送 FTP 命令“portN+1”到 FTP 服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)
2,被动模式
工作原理:当开启一个 FTP 连接时,客户端打开两个任意的非特权本地端口(大于 1024)N 和 N +1。第一个端口连接服务器的 21 端口,但与主动方式的 FTP 不同,客户端不会 提交 PORT 命令并允许服务器来回连它的数据端口,而是提交 PASV 命令。这样做的结果是服务器会开启一个任意的非特权端口(大于 1024)P,并发送 PORT P 命令给客户端。然后客户端发起从本地端口 N + 1 到服务器的端口 P 的连接用来传送数据
主动模式与被动模式的比较:
主动 FTP 对 FTP 服务器的管理和安全很有利,但对客户端的管理不利,因为 FTP 服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端 的防火墙阻塞掉。被动 FTP 对 FTP 客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。目前,ftp 服务器一般工作在被动模式。
Last login: Wed Sep 11 19:46:41 2013 from192.168.2.2
[root@linuxidc ~]# rpm -qa | grep vsftpd
[root@linuxidc ~]# yum -y install vsftpddb4-devel db4 db4-utils pam-devel pam pam_pkcs11 ftp
[root@linuxidc ~]# service vsftpd start
为 vsftpd 启动 vsftpd:[确定]
[root@linuxidc ~]# chkconfig vsftpd on
第二步:配置 vsftpd 服务的宿主
#useradd vsftpdadmin -s /sbin/nologin
这个 vsftpdadmin 只是用来替换 root 的,并不需要登录
第三步:建立 ftp 虚拟宿主帐户
#useradd ftpuser-s /sbin/nologin
这 ftpuser 只个虚拟帐户的宿主,本身是不用登录的
[root@linuxidc ~]# cp -rf /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak // 备份一下,就算最后 vsftpd 搭建坏了,也可以恢复
[root@linuxidc ~]# grep -v “#”/etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf// 去除 #号重定向到 /etc/vsftpd/vsftpd.conf 文件中。
注:筛选目录一定和重定向目录不能相同,否则里面是空的。
[root@linuxidc ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES// 允许匿名访问
local_enable=YES// 允许本地用户访问,默认就是 YES,不用改
write_enable=YES// 允许写入,默认是 YES,不用改
local_umask=022// 上传后文件的权限掩码,不用改
dirmessage_enable=YES// 开启目录标语,默认是 YES,开不开无所谓,我是默认就行
xferlog_enable=YES// 开启日志,默认是 YES,不用改
xferlog_file=/var/log/vsftpd.log// 设定 vsftpd 的服务日志保存路径。注意,该文件默认不存在。必须要手动 touch 出来
connect_from_port_20=YES// 设定连接端口 20
xferlog_std_format=YES// 设定 vsftpd 的服务日志保存路径,不用改
listen=YES// 如果设置为 YES,则 vsftpd 将以独立模式运行,由 vsftpd 自己监听和处理连接请求
local_root=/var/ftp 锁定 ftp 访问目录
pam_service_name=vsftpd//PAM 认证文件名。PAM 将根据 /etc/pam.d/vsftpd 进行认证
userlist_enable=YES// 拒绝登录用户名单,不用改
tcp_wrappers=YES// 限制主机对 VSFTP 服务器的访问,不用改(通过 /etc/hosts.deny 和 /etc/hosts.allow 这两个文件来配置)
以上除了日志那项外都是系统默认存在的
chroot_list_enable=YES// 不允许 FTP 用户离开自己主目录,默认是被注释掉的。
chroot_list_file=/etc/vsftpd/chroot_list// 如果开启了 chroot_list_enable=YES,那么一定要开启这个,这条是锁定登录用户只能家目录的位置,如果不开启用户登录时就会报 500 OOPS 的错。
注意:/etc/vsftp/chroot_list
本身是不存在的,这要建立 vim/etc/vsftp/chroot_list,然后将帐户输入一行一个,保存就可以了
[root@linuxidc etc]# vi /etc/vsftpd/chroot_list
virtual
这步如果不写的话,会报 500 OOPS: could notread chroot() list file:/etc/vsftpd/chroot_list
idle_session_timeout=600// 会话超时,客户端连接到 ftp 但未操作,默认被注释掉,可根据个人情况修改
#async_abor_enable=YES// 支持异步传输功能,默认是注释掉的
#ascii_upload_enable=YES// 支持 ASCII 模式的下载功能,默认是注释掉的
#ascii_download_enable=YES// 支持 ASCII 模式的上传功能,默认是注释掉的
#ftpd_banner=Welcometo blah FTP service//FTP 的登录欢迎语,本身是被注释掉的,去不去都行
#chroot_local_user=YES// 禁止本地用户登出自己的 FTP 主目录,本身被注释掉
以上都是配置文件里有,但都是被注释掉的……
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-08/105113p2.htm
还可以增加:
guest_enable=YES // 设定启用虚拟用户功能。
guest_username=ftpuser // 指定虚拟用户的宿主用户。
virtual_use_local_privs=YES // 设定虚拟用户的权限符合他们的宿主用户。
user_config_dir=/etc/vsftpd/vconf // 设定虚拟用户个人 Vsftp 的配置文件存放路径
建立日志文件
#touch /var/log/vsftpd.log // 日志文件
#chown vsftpdadmin.vsftpdadmin /var/log/vsftpd.log // 属于 vsftpdadmin 这个宿主
第六步:建立虚拟用户文件
#mkdir /etc/vsftpd/vconf/
#touch /etc/vsftpd/vconf/vir_user
第七步:建立虚拟用户
#vim/etc/vsftpd/vconf/vir_user
virtualuser // 用户名
123456 // 密码
注意:第一行用户名,第二行是上一行用户名的密码,其他人的以此类推
第八步:生成数据库
#db_load -T -t hash -f /etc/vsftpd/vconf/vir_user/etc/vsftpd/vconf/vir_user.db
第九步:设置数据库文件的访问权限
#chmod 600 /etc/vsftpd/vconf/vir_user.db
#chmod 600 /etc/vsftpd/vconf/vir_user
第十步:修改 /etc/pam.d/vsftpd 内容
authrequired/lib/security/pam_userdb.so db=/etc/vsftpd/vconf/vir_user
account required/lib/security/pam_userdb.so db=/etc/vsftpd/vconf/vir_user
第十步:创建用户的配置文件
注意:用户配置文件的名字要和创建的“虚拟用户”名字对应
#touch/etc/vsftpd/vconf/virtualuser
#vim /etc/vsftpd/vconf/virtualuser
输入:
local_root=/home/virtualuser // 虚拟用户的个人目录路径
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
max_per_ip=5
local_max_rate=1048576 // 本地用户的最大传输速度,单位是 Byts/s,我设定的是 10M
第十一步:建立虚拟用户目录
如果不建立虚拟用户的个人目录,那么所有的虚拟用户登录后所在的目录都是同一个目录下
# mkdir /home/virtualuser
# chown ftpuser.ftpuser ./virtualuser
# chmod 600 /home/virtualuser
配置就此完成,如果想增加新的用户,只要按照上面的第七步、第十步进行就可以了。
注意:我的 selinux 是关闭的……
重起
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 未执行请求的的命令,名称不正确。
常见 FTP 命令及其功能
FTP命令 | 功能 | FTP命令 | 功能 |
ls | 显示服务器上的目录 | ls [remote-dir][local-file] | 显示远程目录 remote-dir,并存入本地文件 local-file |
get remote-file [local-file] | 从服务器下载指定文件到客户端 | mget remote-files | 下载多个远程文件(mget 命令允许用通配符下载多个文件) |
put local-file [remote-file] | 从客户端上传指定文件到服务器 | mput local-file | 将多个文件上传至远程主机(mput 命令允许用通配符上传多个文件) |
open | 连接 FTP 服务器 | mdelete [remote-file] | 删除远程主机文件 |
close | 中断与远程服务器的 ftp 会话(与 open 对应) | mkdir dir-name | 在远程主机中创建目录 |
open host[port] | 建立指定的 ftp 服务器连接,可指定连接端口 | newer file-name | 如果远程主机中 file-name 的修改时间比本地硬盘同名文件的时间更近,则重传该文件 |
cd directory | 改变服务器的工作目录 | rename [from][to] | 更改远程主机的文件名 |
lcd directory | 在客户端上 (本地) 改变工作目录 | pwd | 显示远程主机的当前工作目录 |
bye | 退出 FTP 命令状态 | quit | 同 bye, 退出 ftp 会话 |
ascii | 设置文件传输方式为 ASCII 模式 | reget remote-file [local-file] | 类似于 get, 但若 local-file 存在,则从上次传输中断处续传 |
binary | 设置文件传输方式为二进制模式 | rhelp [cmd-name] | 请求获得远程主机的帮助 |
![cmd [args]] | 在本地主机中交互 shell 后退回到 ftp 环境,如:!ls *.zip | rstatus [file-name] | 若未指定文件名,则显示远程主机的状态,否则显示文件状态 |
accout 此处含有隐藏内容,需要正确输入密码后可见! | 提供登录远程系统成功后访问系统资源所需的密码 | hash | 每传输 1024 字节,显示一个 hash 符号(#) |
append local-file [remote-file] | 将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名 | restart marker | 从指定的标志 marker 处,重新开始 get 或 put,如 restart 130 |
bye | 退出 ftp 会话过程 | rmdir dir-name | 删除远程主机目录 |
case | 在使用 mget 命令时,将远程主机文件名中的大写转为小写字母 | size file-name | 显示远程主机文件大小,如: |
cd remote-dir | 进入远程主机目录 | status | 显示当前 ftp 状态 |
cdup | 进入远程主机目录的父目录 | system | 显示远程主机的操作系统 |
delete remote-file | 删除远程主机文件 | user user-name 此处含有隐藏内容,需要正确输入密码后可见! [account] | 向远程主机表明自己的身份,需要密码时,必须输入密码,如:user anonymous my@email |
dir [remote-dir][local-file] | 显示远程主机目录,并将结果存入本地文件 | help [cmd] | 显示 ftp 内部命令 cmd 的帮助信息,如 help get |
常见错误:
1.500 OOPS: vsftpd: refusing to run withwritable anonymous root
vsftpd 是对安全性要求较高的 ftp server,所以不允许匿名写 ftp 主目录。基本是因为对 ftp 的主目录执行过 chmod 777 导致。所以,再用 chmod 命令改变权限即可,一般 chmod 750 就可以,亦或解决的方法是: chown root ftp; chmod -w ftp。如果想创建一个允许匿名访问可读写的,就在主目录下再创建一个文件夹,设置成 777 的权限,修改 vsftpd.conf 就 ok 了。
2.ftp:connect: 链接被拒绝
原因:服务没启动
解决:chkconfig vsftpd on
3.could not open chroot() listfile:/etc/vsftpd.chroot_lis
这个问题挺简单,纯属我没有好好动脑,对 vsftpd.conf 中的个别选项没有比较清楚的理解导致……解决办法把 chroot_list_enable=YES 改成 no 或者 comment 掉就可以。
4.530 permission denied
Login failed
原因:“/etc/vsftpd.user_list”文件中不存在当前登录用户
解决:echo virtual >> /etc/vsftpd/virtual_user
5.530 Login incorrect
login incorrect
原因:你的 CentOS 是 64 位,所以要在 pam 的那个位置把 lib 改成 lib64
或
将
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/ftpusr
account required /lib/security/pam_userdb.so db=/etc/vsftpd/ftpusr
改为:
auth required pam_userdb.so db=/etc/vsftpd/ftpusr
account required pam_userdb.so db=/etc/vsftpd/ftpusr
5.500 00PS:unrecognized variable in configfile
Connection closed by remote host
原因:参数前有空格
解决:将参数前空格删除
更多 CentOS 相关信息见CentOS 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=14
Vsftpd 原理
vsftpd 是 linux 发行版中的一款 ftp 服务器程序,它的全称是“very secure ftp daemon”, 号称是最安全的 ftp 服务器。它工作在 21,20 号端口,主要提供文件传输服务,可以跨越网络提供服务,非常好用。
本文主要内容:
一,ftp 的工作原理:
二,vsftpd 的配置文件:
三,vsftpd 的安装
四,vsftpd 的启动与关闭:
五,vsftpd 的配置文件 /etc/vsftpd/vsftpd.conf 解析:
六,用 tcp_wraper 来控制 vsftpd:
七,创建 ftp 虚拟用户
八,启用 ssl,建立安全的传输
————————————– 分割线 ————————————–
玩转 vsftpd 服务器的四大高级配置:http://www.linuxidc.com/Linux/2013-09/90565.htm
vsFTPd 配置教程:http://www.linuxidc.com/Linux/2013-09/90562.htm
Ubuntu 实用简单的 FTP 架设 http://www.linuxidc.com/Linux/2012-02/55346.htm
Ubuntu 上架设 FTP 服务器和 Apache 服务器 http://www.linuxidc.com/Linux/2011-04/35295.htm
Ubuntu 13.04 安装 LAMP\vsftpd\Webmin\phpMyAdmin 服务及设置 http://www.linuxidc.com/Linux/2013-06/86250.htm
RHEL6 平台下 SeLinux 和 vsftpd 的匿名上传的简单案例 http://www.linuxidc.com/Linux/2013-04/82300.htm
Linux 系统 vsftpd 源码安装 http://www.linuxidc.com/Linux/2013-03/81475.htm
vsftpd 的安全配置案例分析 http://www.linuxidc.com/Linux/2012-12/76501.htm
————————————– 分割线 ————————————–
一,ftp 的工作原理:
ftp 的两种工作模式:
1,主动模式
工作原理:客户端从一个任意的非特权端口(大于 1024)N 连接到 FTP 服务器的命令端口,也就是 21 端口。然后客户端开始监听端口 N +1,并发送 FTP 命令“portN+1”到 FTP 服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)
2,被动模式
工作原理:当开启一个 FTP 连接时,客户端打开两个任意的非特权本地端口(大于 1024)N 和 N +1。第一个端口连接服务器的 21 端口,但与主动方式的 FTP 不同,客户端不会 提交 PORT 命令并允许服务器来回连它的数据端口,而是提交 PASV 命令。这样做的结果是服务器会开启一个任意的非特权端口(大于 1024)P,并发送 PORT P 命令给客户端。然后客户端发起从本地端口 N + 1 到服务器的端口 P 的连接用来传送数据
主动模式与被动模式的比较:
主动 FTP 对 FTP 服务器的管理和安全很有利,但对客户端的管理不利,因为 FTP 服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端 的防火墙阻塞掉。被动 FTP 对 FTP 客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。目前,ftp 服务器一般工作在被动模式。
Last login: Wed Sep 11 19:46:41 2013 from192.168.2.2
[root@linuxidc ~]# rpm -qa | grep vsftpd
[root@linuxidc ~]# yum -y install vsftpddb4-devel db4 db4-utils pam-devel pam pam_pkcs11 ftp
[root@linuxidc ~]# service vsftpd start
为 vsftpd 启动 vsftpd:[确定]
[root@linuxidc ~]# chkconfig vsftpd on
第二步:配置 vsftpd 服务的宿主
#useradd vsftpdadmin -s /sbin/nologin
这个 vsftpdadmin 只是用来替换 root 的,并不需要登录
第三步:建立 ftp 虚拟宿主帐户
#useradd ftpuser-s /sbin/nologin
这 ftpuser 只个虚拟帐户的宿主,本身是不用登录的
[root@linuxidc ~]# cp -rf /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak // 备份一下,就算最后 vsftpd 搭建坏了,也可以恢复
[root@linuxidc ~]# grep -v “#”/etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf// 去除 #号重定向到 /etc/vsftpd/vsftpd.conf 文件中。
注:筛选目录一定和重定向目录不能相同,否则里面是空的。
[root@linuxidc ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES// 允许匿名访问
local_enable=YES// 允许本地用户访问,默认就是 YES,不用改
write_enable=YES// 允许写入,默认是 YES,不用改
local_umask=022// 上传后文件的权限掩码,不用改
dirmessage_enable=YES// 开启目录标语,默认是 YES,开不开无所谓,我是默认就行
xferlog_enable=YES// 开启日志,默认是 YES,不用改
xferlog_file=/var/log/vsftpd.log// 设定 vsftpd 的服务日志保存路径。注意,该文件默认不存在。必须要手动 touch 出来
connect_from_port_20=YES// 设定连接端口 20
xferlog_std_format=YES// 设定 vsftpd 的服务日志保存路径,不用改
listen=YES// 如果设置为 YES,则 vsftpd 将以独立模式运行,由 vsftpd 自己监听和处理连接请求
local_root=/var/ftp 锁定 ftp 访问目录
pam_service_name=vsftpd//PAM 认证文件名。PAM 将根据 /etc/pam.d/vsftpd 进行认证
userlist_enable=YES// 拒绝登录用户名单,不用改
tcp_wrappers=YES// 限制主机对 VSFTP 服务器的访问,不用改(通过 /etc/hosts.deny 和 /etc/hosts.allow 这两个文件来配置)
以上除了日志那项外都是系统默认存在的
chroot_list_enable=YES// 不允许 FTP 用户离开自己主目录,默认是被注释掉的。
chroot_list_file=/etc/vsftpd/chroot_list// 如果开启了 chroot_list_enable=YES,那么一定要开启这个,这条是锁定登录用户只能家目录的位置,如果不开启用户登录时就会报 500 OOPS 的错。
注意:/etc/vsftp/chroot_list
本身是不存在的,这要建立 vim/etc/vsftp/chroot_list,然后将帐户输入一行一个,保存就可以了
[root@linuxidc etc]# vi /etc/vsftpd/chroot_list
virtual
这步如果不写的话,会报 500 OOPS: could notread chroot() list file:/etc/vsftpd/chroot_list
idle_session_timeout=600// 会话超时,客户端连接到 ftp 但未操作,默认被注释掉,可根据个人情况修改
#async_abor_enable=YES// 支持异步传输功能,默认是注释掉的
#ascii_upload_enable=YES// 支持 ASCII 模式的下载功能,默认是注释掉的
#ascii_download_enable=YES// 支持 ASCII 模式的上传功能,默认是注释掉的
#ftpd_banner=Welcometo blah FTP service//FTP 的登录欢迎语,本身是被注释掉的,去不去都行
#chroot_local_user=YES// 禁止本地用户登出自己的 FTP 主目录,本身被注释掉
以上都是配置文件里有,但都是被注释掉的……
更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-08/105113p2.htm