Aldebaran

人生最棒的感觉,就是你做到别人说你做不到的事。

0%

源码安装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 联机建立的过程:

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 便建立起来了。

ProFTPd vs PureFTPd vs vsftpd

这里不讨论哪一种FTP更好,仅仅是简单介绍一下,毕竟今天的主角是PureFTPd,剩下的两个FTP以后再写咯。

  • ProFTPd

    ProFTPd是一套可配置性强的开放源代码的FTP服务器软件,名称最后的d字是因为在Linux中是用daemon来称呼。ProFTPd与Apache的配置方式类似,因此十分容易配置和管理。

    ProFTPd亦开发了有图形用户界面的FTP服务器软件称为gProFTPd。

  • pureftpd

    Pure-FTPd是一款免费的FTP服务器,专注于软件安全。它可以在各种类Unix计算机操作系统上编译和运行,包括Linux,OpenBSD,NetBSD,FreeBSD,DragonFly BSD,Solaris,Tru64,Darwin,Irix和HP-UX。它也被移植到Android

  • vsftpd

    vsftpd的全称是“Very Security FTP daemon.”(非常安全的FTP)。vsftpd是基于安全考虑编写的FTP服务器。

    vsftpd是一个类Unix系统的FTP服务器,包括Linux。它是根据GNU通用公共许可证授权的。它支持IPv6和SSL。 vsftpd支持显式和隐式FTPS。 vsftpd是Ubuntu,CentOS,Fedora,NimbleX,Slackware和RHEL Linux发行版中的默认FTP服务器

安装依赖包

这里以Ubuntu为例

$ sudo apt-get -y install build-essential git autoconf automake cmake pkg-config \
    libperl-dev  libssl-dev libpcre3-dev libpcrecpp0 libxslt1-dev libcurl4-openssl-dev \
    libxml2 libxml2-dev libreadline-dev libreadline6-dev libtinfo-dev

安装Pure-ftp

$ cd /usr/local/src/
$ wget ftp://ftp.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.49.tar.gz
$ tar xf pure-ftpd-1.0.49.tar.gz && cd pure-ftpd-1.0.49
$ ./configure --prefix=/usr/local/pure-ftpd-1.0.49 \
    --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.49 /usr/local/pure-ftpd

$ cp -pv /usr/local/pure-ftpd/etc/pure-ftpd.conf{,.default}
$ vim /usr/local/pure-ftpd-1.0.49/etc/pure-ftpd.conf
 ChrootEveryone              yes
 #TrustedGID                 100
 BrokenClientsCompatibility  no
 MaxClientsNumber            50
 Daemonize                   yes
 MaxClientsPerIP             16
 VerboseLog                  no
 DisplayDotFiles             no
 AnonymousOnly               no
 NoAnonymous                 yes
 SyslogFacility              ftp
 AltLog                      clf:/var/log/pureftpd.log
 DontResolve                 yes
 MaxIdleTime                 5
 #MySQLConfigFile             /usr/local/pure-ftpd/etc/pureftpd-mysql.conf
 PureDB                      /usr/local/pure-ftpd/etc/pureftpd.pdb
 PIDFile                     /var/run/pure-ftpd.pid
 PAMAuthentication           no
 UnixAuthentication          yes
 #MinUID                     500
 LimitRecursion              30000 8
 AnonymousCanCreateDirs      no
 #MaxLoad                     4
 MaxLoad                     10
 PassivePortRange            49000 50000
 AntiWarez                   yes
 UserBandwidth               1024
 Umask                       133:022
 AllowUserFXP                yes
 AllowAnonymousFXP           no
 ProhibitDotFilesWrite       no
 ProhibitDotFilesRead        no
 AutoRename                  no
 #CallUploadScript           yes
 AnonymousCantUpload         no
 MaxDiskUsage                99
 CustomerProof               yes
 Bind                        0.0.0.0,52759

设置Pure-ftp虚拟用户

 $ sudo su -
 # cd /usr/local/pure-ftpd/bin

 ## 由于我们在pure-ftpd.conf配置的PureDB路径为:"/usr/local/pure-ftpd/etc/pureftpd.pdb", 因此我们需要保证跟pureftpd.pdb同级下有pureftpd.passwd文件,如果没有则需要创建一个pureftpd.passwd
 # touch /etc/pure-ftpd/pureftpd.passwd

 ## 创建PureDB
 # ./pure-pw mkdb

 ## 创建虚拟用户名,虚拟用户名随意比如XXX, 系统用户名需要系统本身存在,建议是ftp。
 # ./pure-pw useradd 虚拟用户名 -u 系统用户 -d 目录 -m

查看用户详细信息

比如创建用户为someuser,则

 # ./pure-pw show someuser

    Login              : someuser
    Password           : $6$KrlT8HaHnc0cL/K0$7yJkU6uXfZCJp6fnCmZg/CNGMjI9yh7X4OEGTS2Ep8Qtzj.fCZjmbYtNRJB/p5vo2edgH4q2IfPi60cHOwN7E/
    UID                : 2002 (ftp)
    GID                : 2002 (ftp)
    Directory          : /data/ftp/./
    Full name          : 
    Download bandwidth : 0 Kb (unlimited)
    Upload   bandwidth : 0 Kb (unlimited)
    Max files          : 0 (unlimited)
    Max size           : 0 Mb (unlimited)
    Ratio              : 0:0 (unlimited:unlimited)
    Allowed local  IPs : 
    Denied  local  IPs : 
    Allowed client IPs : 
    Denied  client IPs : 
    Time restrictions  : 0000-0000 (unlimited)
    Max sim sessions   : 0 (unlimited)

修改用户密码

# ./pure-pw passwd someuser

之后,通过更新来提交更改
# ./pure-pw

启动pure-ftpd

 # /usr/local/pure-ftpd/sbin/pure-ftpd  /usr/local/pure-ftpd/etc/pure-ftpd.conf

创建pure-ftp用户脚本(参考,未测试)

#!/bin/bash
read -p '添加一个描述:' comment
read -p '指定工作目录:' directory
user=$(tr -cd [a-z][A-Z][0-9] </dev/urandom | head -c 6)
passwd=$(tr -cd [a-z][A-Z][0-9] </dev/urandom | head -c 16)
(echo $passwd;echo $passwd) | pure-pw useradd $user -u ftpuser -d directory
pure-pw mkdb

echo '---------------------------' >> ./ftp_useradd.log
echo '创建时间:' `date +%Y-%m-%d_%H:%M:%S` >> ./ftp_useradd.log
echo '描述:' $comment >> ./ftp_useradd.log
echo '用户:' $user >> ./ftp_useradd.log
echo '密码': $passwd >> ./ftp_useradd.log
echo '' >> ./ftp_useradd.log
echo '' >> ./ftp_useradd.log

参考链接

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

https://www.jianshu.com/p/87cefe25a526

https://systembash.com/evaluating-ftp-servers-proftpd-vs-pureftpd-vs-vsftpd/