ftp服务器:
1 介绍:
FTP (File transfer protocol) 是相当古老的传输协议之一,他最主要的功能是在服务器与客户端之间进行档案的传输。 这个古老的协议使用的是明码传输方式。 不支持udp, FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口。
特点:
不同等级的用户身份:user, guest, anonymous, anonymous匿名登录用来分享数据
命令记录与登录文件记录:FTP 可以利用系统的 syslogd 来进行数据的纪录, /var/log/xferlog 日志记录文件
限制用户活动的目录: (change root, 简称 chroot), 包括一系列配置参数
端口:
使用TCP封包协议, 分为主动式和被动式两种方式
主动模式(port方式):
FTP默认模式,客户端主动告知服务器20端口,本地客户端是数据传输是随机端口(一般为1024以上的一个随机端口),服务器通过20端口向客户端这个端口建立链接,传输数据。
主动方式的FTP工作流程:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“portN+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
1)任何大于1024的端口到FTP服务器的21端口达成联机,进行三次握手,然后客户端便透过联机对FTP服务器下达指令(上传, 下载, 查询等)。(客户端初始化的连接)客户端随机启动一个端口,通过第一个联机通知服务端(接收数据端口和命令), 并等待FETP服务器的联机。
2)FTP服务器的20端口到大于1024的端口。服务端主动向客户端联机, 通过自己的20端口向客户端数据端口联机, 也是经过三次握手 (服务器端初始化数据连接到客户端的数据端口)
3)大于1024端口到FTP服务器的20端口。 客户端的数据端口响应握手(客户端发送ACK响应到服务器的数据端口)
被动模式(pasv方式):
因考虑到网络中存在的NAT路由器(防火墙NAT功能)的时候,主动模式就无法建立数据通道。被动模式可以解决客户端在NAT环境内的情况,数据通道建立。
FTP被动模式的连接方式有效解决了服务器发起到客户的连接问题,这种方式由叫做PASV,当客户端通知服务器它处于被动模式时才启用。
在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N>1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P>1024),并发送PORTP命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1)从任何大于1024的端口到服务器的21端口。 命令联机通道, 和主动式一样, 三次交握建立TCP连接, 不同的是提交PASV命令。(客户端初始化的连接)
2)服务器的21端口到任何大于1024的端口, 服务器透过命令联机,以通知客户端已开启的数据监听端口(服务器响应到客户端的控制端口的连接)
3)从任何大于1024端口到服务器的大于1024端口。 客户端主动向服务端建立数据联机(客户端初始化数据连接到服务器指定的任意端口)
4)服务器的大于1024端口到远程的大于1024的端口。 服务端回应三次交握, 建立第二个联机用于数据传输(服务器发送ACK响应和数据到客户端的数据端口)
主动FTP:
命令连接:客户端>1023端口 ------> 服务器 21端口
数据连接:客户端>1023端口
被动FTP:
命令连接:客户端>1023端口 ------> 服务器 21端口
数据连接:客户端>1023端口 ------> 服务器>1023端口
主动与被动FTP优缺点:
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。
被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。
被动式 FTP 数据信道的联机方向是由客户端向服务器端联机,在 NAT 内部的客户端主机就可以顺利的连接上 FTP Server了
vsftpd vs profited
vsftpd(Very Secure FTP Daemon)配置部署:
安装
# 检查是否安装
rpm -qa | grep vsftpd
yum install vsftpd
yumdownloader vsftpd
rpm2cpio ctags-5.8-2.el6.x86_64.rpm |cpio -idvm
yum需要有root权限, 非root用户可以选择rpm或者源码编译
部署:
chkconfig --list
chkconfig vsftpd on
启动:
service vsftpd start
或者
/etc/init.d/vsftpd restart
ftp原理配置参数
/etc/vsftpd/vsftpd.conf
配置文件, man 5 vsftpd.conf 查看说明
/etc/pam.d/vsftpd
这个是 vsftpd 使用 PAM 模块时的相关配置文件。主要用来作为身份认证之用,还有一些用户身份的抵挡功能, 也是透过这个档案来达成的
/etc/vsftpd/ftpusers (这个我用yum安装时给放到 /etc/ftpusers了)
与上一个档案有关系,也就是 PAM 模块 (/etc/pam.d/vsftpd) 所指定的那个无法登入的用户配置文件啊! 这个档案的设定很简单,你只要将『不想让他登入 FTP 的账号』写入这个档案即可。一行一个账号,看起来像这样:
[root@www ~]# cat /etc/vsftpd/ftpusers
root
bin
daemon
瞧见没有?绝大部分的系统账号都在这个档案内喔,也就是说,系统账号默认是没有办法使用 vsftpd 的啦! 如果你还想要让某些使用者无法登入,写在这里是最快的!
/etc/vsftpd/user_list(自己创建)
这个档案是否能够生效与 vsftpd.conf 内的两个参数有关,分别是『 userlist_enable, userlist_deny 』。 如果说 /etc/vsftpd/ftpusers 是 PAM 模块的抵挡设定项目,那么这个 /etc/vsftpd/user_list 则是 vsftpd 自定义的抵挡项目。事实上这个档案与 /etc/vsftpd/ftpusers 几乎一模一样, 在预设的情况下,你可以将不希望可登入 vsftpd 的账号写入这里。不过这个档案的功能会依据 vsftpd.conf 配置文件内的 userlist_deny={YES/NO} 而不同,这得要特别留意喔!
/etc/vsftpd/chroot_list (自己创建)
这个档案预设是不存在的,所以你必须要手动自行建立。这个档案的主要功能是可以将某些账号的使用者 chroot 在他们的家目录下!但这个档案要生效与 vsftpd.conf 内的『 chroot_list_enable, chroot_list_file 』两个参数有关。 如果你想要将某些实体用户限制在他们的家目录下而不许到其他目录去,可以启动这个设定项目喔!
/usr/sbin/vsftpd
这就是 vsftpd 的主要执行档咯!不要怀疑, vsftpd 只有这一个执行档而已啊!
/var/ftp/
这个是 vsftpd 的预设匿名者登入的根目录喔!其实与 ftp 这个账号的家目录有关啦!vim /etc/passwd 中设置查看
sftpd 启动的模式
vsftpd 可以使用 stand alone(listen=YES) 或 super daemon(listen=NO)的方式来启动,我们 CentOS 预设是以 stand alone来启动的。 那什么时候应该选择 stand alone 或者是 super daemon 呢?如果你的 ftp 服务器是提供给整个因特网来进行大量下载的任务,例如各大专院校的 FTP 服务器,那建议你使用 stand alone 的方式, 服务的速度上会比较好。如果仅是提供给内部人员使用的 FTP 服务器,那使用 super daemon 来管理即可啊。
利用 CentOS 提供的 script 来启动 vsftpd (stand alone)
其实 CentOS 不用作任何设定就能够启动 vsftpd 啰!是这样启动的啦:
[root@www ~]# /etc/init.d/vsftpd start
[root@www ~]# netstat -tulnp| grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 11689/vsftpd
看到啰,是由 vsftpd 所启动的呢!
自行设定以 super daemon 来启动 (有必要再进行,不用实作)
如果你的 FTP 是很少被使用的,那么利用 super daemon 来管理不失为一个好主意。 不过若你想要使用 super daemon 管理的话,那就得要自行修改一下配置文件了。其实也不难啦,你应该要这样处理的:
[root@www ~]# vim /etc/vsftpd/vsftpd.conf
**找到 listen=YES 这一行:大约在 109 行左右啦,并将它改成:listen=NO **
接下来修改一下 super daemon 的配置文件,底下这个档案你必须要自行建立的,原本是不存在的喔:
[root@www ~]# yum install xinetd <==假设 xinetd 没有安装时
[root@www ~]# vim /etc/xinetd.d/vsftpd
service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 10
disable = no
}
然后尝试启动看看呢:
[root@www ~]# /etc/init.d/vsftpd stop
[root@www ~]# /etc/init.d/xinetd restart
[root@www ~]# netstat -tulnp| grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 32274/xinetd
有趣吧!两者启动的方式可不一样啊!管理的方式就会差很多的呦!不管你要使用哪种启动的方式,切记不要两者同时启动,否则会发生错误的!你应该使用 chkconfig –list 检查一下这两种启动的方式,然后依据你的需求来决定用哪一种方式启动。鸟哥底下的设定都会以 stand alone 这个 CentOS 默认的启动模式来处理,所以赶紧将刚刚的动作给他改回来喔!
**所以说, 如果采用stand alone模式, 可以 service xinetd close 关闭掉 **
vsftpd.conf 参数解释
example:
# cat /etc/vsftpd/vsftpd.conf | grep -E -v '^$|#'
anonymous_enable=YES # 允许匿名登录, 默认YES
local_enable=YES # 这个设定值必须要为 YES 时,在 /etc/passwd 内的账号才能以实体用户的方式登入我们的 vsftpd 服务器喔!
write_enable=YES # 如果你允许用户上传数据时,就要启动这个设定值
local_umask=022 # 建立新目录 (755) 与档案 (644) 的权限
dirmessage_enable=YES # 若目录下有 .message 则会显示该档案的内容
xferlog_enable=YES # 当设定为 YES 时,使用者上传与下载文件都会被纪录起来。记录的档案与下一个设定项目有关:xferlog_file 默认/var/log/xferlog
connect_from_port_20=YES
xferlog_std_format=YES # 是否设定为 wu ftp 相同的登录档格式?预设为 NO ,因为登录档会比较容易读! 不过,如果你有使用 wu ftp 登录文件的分析软件,这里才需要设定为 YES
pam_service_name=vsftpd # 这个是 pam 模块的名称,我们放置在 /etc/pam.d/vsftpd 即是这个咚咚!
userlist_enable=YES
# 是否藉助 vsftpd 的抵挡机制来处理某些不受欢迎的账号,与底下的参数设定有关: userlist_deny, userlist_file
listen=YES # 若设定为 YES 表示 vsftpd 是以 standalone 的方式来启动的!预设是 NO
tcp_wrappers=YES # 当然我们都习惯支持 TCP Wrappers 的啦!所以设定为 YES 吧!
pasv_enable=YES # 支持数据流的被动式联机模式(passive mode),一定要设定为 YES 的啦!
pasv_min_port=22222
pasv_max_port=22225
# 上面两个是与 passive mode 使用的 port number 有关,如果你想要使用 65400 到 65410 这 11 个 port 来进行被动式联机模式的连接,可以这样设定 pasv_max_port=65410 以及 pasv_min_port=65400。 如果是 0 的话,表示随机取用而不限制。
chroot_local_user=NO
# 在预设的情况下,是否要将使用者限制在自己的家目录之内(chroot)?如果是 YES 代表用户默认就会被 chroot,如果是 NO, 则预设是没有 chroot。不过,实际还是需要chroot_list_enable, chroot_list_file两个参数互相参考才行。为了安全性,这里应该要设定成 YES 才好。
use_localtime=YES # 是否使用本地时间?vsftpd 预设使用 GMT 时间(格林威治),所以预设的 FTP 内的档案日期会比台湾晚 8 小时,建议修改设定为 YES 吧!