Install Pure-ftp
FTP 簡介
FTP (File Transfer Protocol) 是在因特网上已行之多年的文件传输协议,透过这个通讯协议,可以将远程计算机的档案数据传送回本机端 (下载),也可以把本机的档案数据传输至远程计算机 (上传) ﹔而所谓的 FTP Server,就是一部专门提供给客户端进行档案上传与下载服务的服务器。
我们都知道 Web Server 是用 http 来做数据传输的协议,其除了可让 Client 端浏览网页外,同时也提供档案上传与下载的服务,不过它比较适用于小档案的传输,而在对大文件传输时,所表现的稳定度及传输效率就不那么高了。所以想改善 http 传输档案上的缺失及效能,最好的方式就是架设一台 FTP Server 了。
用来架设 FTP Server 的软件有好几种,其中最老牌的算是 wu-ftpd,不过也由于其树大招风的关系,使得在安全性方面会有比较大的隐忧。不过还好后来又陆续发展出一些安全性较佳的服务器软件,比方像 proftpd、vsftpd 及 pure-ftpd 等,而本章将会针对 pure-ftpd 及 vsftpd 这两个服务器软件来做介绍。
FTP 的联机流程
在还没开始介绍流程之前,要先来了解一下两台计算机间 TCP 联机建立的过程:
当 Client 向 Server 提出主动联机请求时,会送出联机过程的第一个 TCP 封包给对方,而此时 TCP 封包中的 SYN (同步旗标) 位值设定为 1,代表的是一个联机的启动 ﹔接着 Server 端也必须启动自己的联机并做响应的确认,因此会向 Client 端送出联机过程的第二个封包,此时该封包的 SYN 及 ACK (回应确认旗标) 位值皆设定为 1 ﹔最后在 Client 端收到对方的封包后,必须做响应确认的动作,因此会送出联机过程的第三个封包给 Server,此时封包的 ACK 位值设定为 1。至此双方的联机才正式建立起来,这就是所谓的 TCP Three-Way Handshake ( TCP 三段式交握 )。
了解了 TCP 联机建立的观念后,底下就来说明 FTP 联机的过程。不过在此之前,要先了解的是,FTP Client 能采取的联机模式有两种,分别是主动模式 (Active mode) 及被动模式 (Passive mode),所以接着会以这两种不同模式来叙述联机过程。
主动模式下的 FTP 联机
当 FTP Client 一开始要连上 FTP Server 时,会先随机产生一个大于 1024 的 port ( 假设 3000 port ),来主动对 FTP Server 的 21 port 做联机,等完成了 TCP 三段式交握后,联机才正式建立起来,而这个 3000 port 与 21 port 所建立的联机信道,就叫做命令信道 (command channel )。之所以会称其为命令通道,当然是只能执行一些基本指令而已啰。
现在若是 Client 端想要下载或上传数据时,还要另外建立起一条数据信道 (data channel ) 来作为数据传输使用。由于 Client 是采取主动模式 (可以想象 Client 要求 Server 做主动联机,也就是 Server 主动连 Client ),因此本身会再开启另一个大于 1024 的 port ( 假设 5000 port ),然后透过命令通道通知 Server 已准备好这个 data channel 的端口,接着 Server 就以 20 port 来主动与 Client 端的 5000 port 建立联机,就在完成了另一次的三段式交握后,此 data channel 便建立起来,至此 Client 方可开始做数据传输。
被动模式下的 FTP 联机
一开始 command channel 的建立,与上面所述相同,不再重复,这里只针对 data channel 的建立做说明。由于此时 Client 是希望采取被动模式 (可以想象 Client 要求 Server 做被动联机,也就是 Client 主动连 Server),所以会先透过 command channel 来通知 Server 这个讯息,Sever 收到后就随机开启一个大于 1024 的 port (假设 8000 port),并经由 command channel 知会 Client 已准备好 data channel 的端口,接着 Client 也随机开启一个大于 1024 的 port (假设 9000 port) 来主动与 Server 建立联机,而完成的三段式交握后,此 8000 port 与 9000 port 之间的 data channel 便建立起来了。
编译安装Pure-ftp
$ cd /usr/local/src/
$ wget ftp://ftp.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.45.tar.gz
$ tar xf pure-ftpd-1.0.45.tar.gz && cd pure-ftpd-1.0.45
$ ./configure --prefix=/usr/local/pure-ftpd-1.0.45 \
--with-cookie --with-throttling \
--with-ratios --with-quotas --with-sysquotas \
--with-tls --with-welcomemsg \
--with-uploadscript --with-virtualhosts \
--with-virtualchroot --with-puredb \
--with-diraliases --with-peruserlimits \
--with-paranoidmsg --with-altlog --with-nonroot
$ make && make install
$ ln -s /usr/local/pure-ftpd-1.0.45 /usr/local/pure-ftpd
$ cp -pv /usr/local/pure-ftpd/etc/pure-ftpd.conf{,.default}
$ vim /usr/local/pure-ftpd-1.0.45/etc/pure-ftpd.conf
ChrootEveryone yes # 启用chroot
BrokenClientsCompatibility no # 兼容不同客户端
MaxClientsNumber 100 # 客户端最大连接数
Daemonize yes # 后台运行
MaxClientsPerIP 16 # 每个ip最大连接数
VerboseLog no # 记录日志
DisplayDotFiles no # 显示隐藏文件
AnonymousOnly no # 只允许匿名用户访问
NoAnonymous yes # 不允许匿名用户连接
SyslogFacility none # 不将日志在syslog日志中显示
AltLog clf:/var/log/pureftpd.log # clf格式日志文件位置
DontResolve yes # 不进行客户端DNS解析
MaxIdleTime 5 # 最大空闲时间
#MySQLConfigFile /usr/local/pure-ftpd/etc/pureftpd-mysql.conf # 用户数据库文件 MySQL
PureDB /usr/local/pure-ftpd/etc/pureftpd.pdb # 用户数据库文件
PIDFile /var/run/pure-ftpd.pid
PAMAuthentication no # 取消使用PAM验证
UnixAuthentication yes # /etc/passwd 文件验证
#MinUID 500 # 验证登录用户的最小UID
LimitRecursion 30000 8 # 浏览限制,文件30000,目录8层
AnonymousCanCreateDirs no # 不允许匿名用户创建目录
MaxLoad 10 # 超出负载后禁止下载
PassivePortRange 49000 50000 # 被动模式端口范围
AntiWarez yes # 禁止下载匿名用户上传但未经验证的文件
UserBandwidth 1024 # 所有用户最大带宽(KB)
Umask 133:022 # 创建文件/目录默认掩码
AllowUserFXP yes # 仅运行用户进行FXP传输
AllowAnonymousFXP no # 不能删除/写入隐藏文件
ProhibitDotFilesWrite no # 不能删除/写入隐藏文件
ProhibitDotFilesRead no # 禁止读取隐藏文件
AutoRename no # 有同名文件时自动重新命名
AnonymousCantUpload yes # 不允许匿名用户上传文件
MaxDiskUsage 90 # 当磁盘使用量打到90%时禁止上传
CreateHomeDir yes # 如果虚拟用户的目录不存在则自动创建#需要ftp根目录权限为755
CustomerProof yes # 防止命令误操作
Bind 0.0.0.0,52759 # 绑定端口
yum 安装
$ yum -y install pure-ftpd
设置系统用户
$ useradd -s /sbin/nologin -u 600 -d ${ftpdir} -M vftp
$ chown -R vftp.vftp ${ftpdir}
$ # 或者
$ groupadd ftpgroup
$ useradd -g ftpgroup -d /dev/null -s /sbin/nologin ftpuser
$ mkdir /data/ftpdata
$ chown ftpuser.ftpgroup /data/ftpdata
设置Pure-ftp虚拟用户
$ /usr/local/pure-ftpd/bin/pure-pw useradd ftpuser -u 600 -g 600 -d ${ftpdir} -m
$ 或者
$ sudo pure-pw mkdb
$ ./pure-pw useradd 虚拟用户名 -u 系统用户 -g 系统组 -d 目录 -m
$ # 当使用pure-pw 生成虚拟用户之后一定要使用pure-pw mkdb命令生成数据库文件, 否则pure-ftp启动之后也无法验证虚拟用户
$ /usr/local/pure-ftpd/bin/pure-pw mkdb /usr/local/pure-ftpd/etc/pureftpd.pdb -f /usr/local/pure-ftpd/etc/pureftpd.passwd
查看用户
比如创建好的用户为someuser,则
$ pure-pw show someuser
修改用户密码
$ sudo pure-pw passwd someuser
之后,通过更新来提交更改
$ sudo pure-pw
启动pure-ftpd
/usr/local/pure-ftpd/sbin/pure-ftpd /usr/local/pure-ftpd/etc/pure-ftpd.conf
or
/etc/init.d/pure-ftpd start
重启
/etc/init.d/pure-ftpd restart