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

https://wiki.archlinux.org/index.php/Pure-FTPd