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