Linux下FTP环境部署梳理(vsftpd和proftpd)
时间:2022-04-23
本文章向大家介绍Linux下FTP环境部署梳理(vsftpd和proftpd),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在日常运维工作中,常部署到的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登陆欢迎信息文件
- ASP获取微信小程序的OpenID服务器端代码
- 手把手教你用python抢票回家过年 !(附代码)
- 技术总结:自动扩张WPF树型表格列宽
- 部署Microsoft .NET Framework 3.0[翻译]
- 性能优化总结(六):预加载、聚合SQL应用实例
- 性能优化总结(五):CSLA服务端如何使用多线程的解决方案
- 编辑-发布-开发分离:git作为NoSQL数据库
- 性能优化总结(四):预加载的设计
- 在Expression Blend中使用XAML建立3D应用程序
- 使用 Asp.net Future May 2007 开发Silverlight应用
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
- RePractise前端篇: 前端演进史
- 性能优化总结(三):聚合SQL在GIX4中的应用
- ASP.NET AJAX 控件开发基础
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python 中文情感分析 Snownlp库的使用
- Python数据分析实战(1) 成都土地市场分析
- 51单片机学习(1) LED点亮、闪烁以及流水灯实现
- python pyecharts地理数据可视化 绘制地理图表
- Python 爬虫+tkinter界面 实现历史天气查询
- python opencv+pytesseract 验证码识别
- python+opencv 实现图像人脸检测及视频中的人脸检测
- 手搓一个分布式大气监测系统(五)基于物联网开发平台的云架构延伸
- 关于Python的前后、单双下划线作用,看完这篇文章,吊打面试官!
- 图解EfficientNet模型的完整细节
- (⊙o⊙)?markdown文档中插入萌萌的emoji表情
- C语言中的字符串可以怎么处理?
- 一个简单的C语言测试框架
- Let's Encrypt实践指北
- MassTransit Get Started->