在日常运维工作中,常部署到的FTP是vsftpd和proftd。之前写了Linux下FTP虚拟账号环境部署总结,下面简单说下本地用户下的FTP环境部署过程:
简单梳理下FTP主动和被动两种工作模式:
FTP协议有两种工作方式: 1)port方式:主动模式 port(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器从20端口向客户端的空闲端口发送连接请求,建立一条数据链路来传送数据。 2)pasv方式:被动模式 pasv(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端向服务器的空闲端口发送连接请求,建立一条数据链路来传送数据 FTP是仅基于tcp的服务,不支持udp。FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)。但FTP工作方式的不同,数据端口并不总是20。这就是主动与被动FTP的最大不同之处。 一)主动FTP模式 主动方式的FTP工作流程:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“portN+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。 针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP: 1)任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接) 2)FTP服务器的21端口到大于1024的端口。(服务器响应客户端的控制端口) 3)FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口) 4)大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口) 二)被动FTP模式 FTP被动模式的连接方式有效解决了服务器发起到客户的连接问题,这种方式由叫做PASV,当客户端通知服务器它处于被动模式时才启用。在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N>1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P>1024),并发送PORTP命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。 对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP: 1)从任何大于1024的端口到服务器的21端口(客户端初始化的连接) 2)服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接) 3)从任何大于1024端口到服务器的大于1024端口(客户端初始化数据连接到服务器指定的任意端口) 4)服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口) 主动FTP: 命令连接:客户端>1023端口 ------> 服务器 21端口 数据连接:客户端>1023端口 <------ 服务器 20端口 被动FTP: 命令连接:客户端>1023端口 ------> 服务器 21端口 数据连接:客户端>1023端口 ------> 服务器>1023端口 三)主动与被动FTP优缺点: 主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。 被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。 随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。 通常我会选用被动模式的FTP。
下面简单记录下vsftpd和proftd部署过程:
1)vsftpd部署(本地用户登陆环境)
[root@bastion-IDC ~]# yum install -y vsftpd [root@bastion-IDC ~]# cat /etc/vsftpd/vsftpd.conf|grep -v "^#" anonymous_enable=NO //不允许匿名用户登录 local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES ascii_upload_enable=YES ascii_download_enable=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES local_max_rate=500000 //设置本地用户最大的传输速率 max_clients=200 max_per_ip=10 pasv_enable=YES //这三行配置,开启FTP被动模式 pasv_min_port=22222 pasv_max_port=22225 [root@bastion-IDC ~]# touch /etc/vsftpd/chroot_list [root@bastion-IDC ~]# useradd smsb-ftp -s /sbin/nologin [root@bastion-IDC ~]# passwd smsb-ftp [root@bastion-IDC ~]# echo "smsb-ftp" >> /etc/vsftpd/chroot_list //ftp账号需要放到这个列表文件里,登陆ftp后锁定到其家目录下! [root@bastion-IDC ~]# chown -R smsb-ftp.smsb-ftp /home/smsb-ftp [root@bastion-IDC ~]# ll -d /home/smsb-ftp drwx------ 4 smsb-ftp smsb-ftp 4096 May 26 14:07 /home/smsb-ftp [root@bastion-IDC ~]# /etc/init.d/vsftpd start [root@bastion-IDC ~]# vim /etc/sysconfig/iptables ....... -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22222:22225 -j ACCEPT 最后就可以通过ftp://ip在浏览器里访问上面的ftp(只有被动模式的ftp才能再浏览器里访问); 也可使用Filezilla等工具连接ftp,不过要在客户端里手动修改成被动模式。ftp登陆后的路径锁定到账号家目录下。
---------------------------------------------------------------------------------------------
连接ftp的时候如果报错如下:
500 OOPS: cannot change directory:/home/smsb-ftp
这种一般是由于selinux没有关闭造成的,解决办法:
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# setsebool ftp_home_dir on
--------------------------------------------------------------------------------------------
vsftpd.conf配置文件中的主要参数介绍
2)proftpd部署(本地用户登陆环境)
1)安装proftpd 下载proftpd-1.3.4b.tar.gz,解压安装,安装到/usr/local/proftpd 目录下 [root@bastion-IDC ~]# tar -zvxf proftpd-1.3.4b.tar.gz [root@bastion-IDC ~]# cd proftpd-1.3.4b [root@bastion-IDC proftpd-1.3.4b]# ./configure --prefix=/usr/local/proftpd [root@bastion-IDC proftpd-1.3.4b]# make && make install 2)配置proftpd [root@bastion-IDC proftpd]# pwd /usr/local/proftpd [root@bastion-IDC proftpd]# cat etc/proftpd.conf ServerName "ProFTPD Default Installation" ServerType standalone DefaultServer on Port 21 UseIPv6 off Umask 022 MaxInstances 30 //进程数,即限制连接数,或最大并发数 MaxClients 10 //最大允许10个用户同时访问 MaxClientsPerHost 5 //同一个客户端只能最多5个帐号可以登陆 MaxHostsPerUser 5 //每个帐户最多允许来源ip为5个, 对防止ftp帐号还是比较有用的。 MaxClientsPerUser 5 //每个帐户在每个客户端最多可以同时登陆5次,可以防止多线程软件下载对服务器的破坏。 User nobody //启动服务器的帐号 Group nobody //启动服务器的组帐号 AllowOverwrite on //允许文件覆盖权限.即支持续传功能 AllowRetrieveRestart on //允许下载续传,默认即开启 AllowStoreRestart on //允许上载续传 UseReverseDNS off //是否开启DNS反向查询 IdentLookups off //是否开启反向查询客户端的用户名的操作。 ServerIdent off //屏蔽服务器版本信息 RootLogin off //是否允许root用户登录,默认是不允许的,安全起见不推荐将此选项设置为on PassivePorts 20000 20200 //开启被动模式 DefaultRoot ~ //限制用户或组登录到FTP服务器后所在的目录,在默认情况下每个用户登录到ProFTPd后,会被引导到该用户的家目录 TransferRate STOR 300 user wangshibo //限制wangshibo用户上传的速率限制在300Kbytes/s TransferRate RETR 200 user wangshibo //限制wangshibo用户下载的速率限制在200Kbytes/s 3)创建用户 [root@bastion-IDC proftpd]# useradd wangshibo -d /home/web/wangshibo -s /sbin/nologin //确保目录/home/web/wangshibo存在 [root@bastion-IDC proftpd]# passwd wangshibo 4)修改proftpd账号目录权限 [root@bastion-IDC proftpd]# chown -R nobody.nobody /home/web/wangshibo [root@bastion-IDC proftpd]# chmod -R 777 /home/web/wangshibo 5)启动proftpd服务 [root@bastion-IDC proftpd]# /usr/local/proftpd/sbin/proftpd 6)添加 iptables 设置 [root@bastion-IDC proftpd]# cat /etc/sysconfig/iptables ............. -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 20000:20200 -j ACCEPT [root@bastion-IDC proftpd]# /etc/init.d/iptables restart 最后,就可以正常连接以上部署的proftpd服务了
-----------------------------------Proftpd配置说明--------------------------------------
1)Proftpd如何限速和设置发呆退出? 可以使用下面两参数来限制下载和上载速度: RateReadBPS 500000 RateWriteBPS 500000 其中: RateReadBPS和RateWriteBPS限制下载和上载的速率 500000限制当用户现在这么多数据量以后再进行限速,这样可以实现对于小文件不限速,而大文件限速。 TimeoutIdle -->设置空闲连接超时时钟 TimeoutLogin --> 设置空闲登陆超时时钟 TimeoutNoTransfer --> 设置当没有数据传输时的超时时钟 TimeoutStalled --> 设置被阻塞的下载的超时时钟 2)proftpd如何实现磁盘限额 首先编译的时候指定--with-modules的时候要包含mod_quota。 然后在配置文件中使用: Quotas on QuotaCalc on DefaultQuota 8000 QuotaBlockSize 1024 QuotaBlockName kb 就可以实现磁盘限额。其中DefaultQuota说明用户只能用8000个block,而QuotaBlockSize则指明每个block大小是1024byte也就是1k。 QuotaBlockName只在提示中出现,告诉用户block的单位。 3)如何设置proftpd的服务进程数 如果机器硬件配置不是非常好,或者为了防止DoS攻击,有时候需要限制proftpd所能提供的同时连接数。在standalone情况下,可以设置: MaxInstances 100 这样就能限制当外界的所有连接数到100的时候,proftpd将禁止新连接。 4)Proftpd如何限制每个客户端机器的同时连接 只要在配置文件里面使用: MaxClientsPerHost 10 这样限制客户端机器最多只能10个连接。用在匿名用户的配置中特别有用,有效地防止了某个客户端大量占用了其他人的连接数。 5)Proftpd如何限制某个用户的同时连接数 Proftpd 1.2.7rc1以后提供了一个新参数-MaxClientsPerUser。在配置文件中添加下列参数: MaxClientsPerUser 5 这样就能限制每个用户只能同时有5个连接,使用例如flashget等下载工具的时候就最多只能分成5块下载。 6)Proftpd如何提供续传功能 如果要支持下载续传,那么必须指定: AllowRetrieveRestart on 如果要支持上传续传,那么必须指定: AllowOverwrite on AllowStoreRestart on 必须同时指定AllowOverwrite和AllowStoreRestart的原因是由于重新上传或者续传也是属于覆盖文件。 同时记得不要同时使用HiddenStor和AllowStoreRestart。 7)proftpd如何允许以root身份登录 在配置文件中使用下面的配置: RootLogin on 8)如何缩短连接到proftpd服务的时间 在proftpd.conf里面加入两行: UseReverseDNS off IdentLookups off 防止proftpd进行DNS反查以及对用户端进行ident确认。 9)限制每个FTP用户在自己的目录下,不可查看上一级目录 DefaultRoot ~ 10)屏蔽服务器版本信息 ServerIdent off 11)其他 WtmpLog on 是否要把ftp记录在日志中,如果不想可以设置成off屏蔽掉log日志。 TimeoutIdle 600 客户端idle时间设置,默认就是600秒 DisplayLogin welcome.msg 设置ftp登陆欢迎信息文件