Linux下FTP环境部署梳理(vsftpd和proftpd)

本文涉及的产品
云防火墙,500元 1000GB
简介:

在日常运维工作中,常部署到的FTP是vsftpd和proftd。之前写了Linux下FTP虚拟账号环境部署总结,下面简单说下本地用户下的FTP环境部署过程:

简单梳理下FTP主动和被动两种工作模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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部署(本地用户登陆环境)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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 登陆欢迎信息文件
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/6641224.html,如需转载请自行联系原作者
相关文章
|
21天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
175 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
22天前
|
运维 监控 Linux
Linux系统之部署Linux管理面板1Panel
【10月更文挑战第20天】Linux系统之部署Linux管理面板1Panel
69 3
Linux系统之部署Linux管理面板1Panel
|
8天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
23 3
|
8天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
21 3
|
20天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
48 2
|
21天前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
29 3
|
23天前
|
Ubuntu 应用服务中间件 Linux
Linux下搭建Nginx环境的搭建
Linux下搭建Nginx环境的搭建
|
18天前
|
Linux UED iOS开发
|
22天前
|
Java Linux 网络安全
NIFI在Linux服务区上的部署配置过程是什么?
【10月更文挑战第21天】NIFI在Linux服务区上的部署配置过程是什么?
38 2
|
23天前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
195 2