FTP服务器原理

21.1 FTP服务器原理

 
使用明码传输方式,且有相当多的安全危机历史。因此一般使用功能较少的vsftpd这个软件。
21.1.1 FTP功能简介
有以下功能
  • 文档传输与管理
  • 不同等级的用户身份:user,guest,anonymous
  • 命令记录与登录文件记录
  • 限制用户活动的目录:(change root,简称 chroot)
  • 即将登录用户的家目录变成根目录

 

21.1.2 FTP的运作流程与使用用的端口号
FTP的传输使用的是TCP封包协议。
FTP服务器使用了两个联机,分别是:
  • 命令信道
  • 数据流通道(ftp-data)
两个联机通道的关系是怎么样的?以FTP预设的主动式(active)联机来做说明:
主动指的是FTP服务器主动联机客户端,作为数据通道;

 

  • 建立命令通道的联机
    • 客户端会随机取一个大于 1024 以上的端口 (port AA) 来与 FTP服务器端的 port 21 达成联机, 这个过程当然TCP三次握手了!
    • 达成联机后客户端便可以透过这个联机来对 FTP 服务器下达指令, 包括查询文件名、下载、上传等指令
  • 通知 FTP 服务器端,使用 active 且告知连接的端口号
    • 客户端在需要数据的情况下,会告知服务器端要用什么方式来联机,如果是主动式 (active) 联机时, 客户端会先随机启用一个端口号 (图21.1-1 当中的 port BB) ,且透过命令通道告知 FTP 服务器这两个信息,并等待 FTP 服务器的联机;
  • FTP 服务器『主动』向客户端联机
    • FTP 服务器由命令通道了解客户端的需求后,会主动的由 20 这个端口号向客户端的 port BB 联机, 这个联机当然也会经过TCP三次握手!此时 FTP 的客户端与服务器端共会建立两条联机,分别用在命令的下达与数据的传递。 而预设 FTP服务器端使用的主动联机端口号就是 port 20 !
如此一来则成功的建立起『命令』与『数据传输』两个信道!不过,要注意的是,数据传输信道是在有数据传输的行为时才会建立的通道喔!并不是一开始连接到FTP 服务器就立刻建立的通道
由上可见,主动式联机使用到的端口号:
  •  命令通道的 ftp (默认为 port 21) 
  •  数据传输的 ftp-data (默认为 port 20)
在主动联机的 FTP 服务器与客户端之间具有防火墙的联机问题
 
一般来说,很多的局域网络都会使用防火墙(iptables) 的 NAT 功能,那么在 NAT 后端的 FTP 用户如何连接到 FTP 服务器呢?

 

服务器主动连到 NAT 等待转递至客户端的联机问题:
由于透过 NAT 的转换后, FTP 服务器只能得知 NAT 的 IP 而不是客户端的IP , 因此 FTP 服务器会以 port 20 主动的向 NAT 的 port BB 发送主动联机的要求。 但你的 NAT 并没有启动 port BB 来监听 FTP 服务器的联机啊!
解决办法:
  • 使用iptables所提供的FTP侦测模块
    • ip_conntrack_ftp 及 ip_nat_ftp 等模块主动的分析『目标是 port 21 的联机』信息,得到port BB 的资料,
    • 此时若接受到 FTP 服务器的主动联机,就能够将该封包导向正确的后端主机了。
  • 客户端选择被动式(Passive)联机模式
    • 主动式,是指 服务器主动联机客户端。那被动式,就是客户端联机服务器。这里都是指的数据传输联机。
21.1.3 客户端选择被动式联机模式

 

  • 用户与服务器建立命令信道
  • 客户端发出 PASV 的联机要求
    • 发出联机要求,病等待服务器的回应
  • FTP 服务器启动数据端口口,并通知客户端联机
    • 这个端口号码不是主动式的port 20 ,而是随机的。
    • 告知客户端这个 port PASV;
  • 客户端随机取用大于 1024 的端口号进行连接
21.1.4 FTP的安全性问题与替代方案
ssh,提供较为安全的sftp-server。在上面传输的数据是经过加密的。
 
21.1.5 开放什么身份的使用者登入
 
  • 开放实体用户的情况 (Real user)
    • 系统默认并没有针对实体用户来进行『限制』的,所以他可以针对整个文件系统进行任何他所具有权限的工作。
    • 限制用户能力: chroot 与 /sbin/nologin 等
  • 访客身份(Guest)
    • 访客身份的限制
    • 上传下载档案数目与磁盘容量限制,联机时间,可用指令。
    • 如chmod等就不要允许使用
  • 匿名登录使用者(anonymous)
    • 几乎不要给指令
    • 限制文件传输的数量,尽量不给上传数据的权限
    • 限制匿名者同时登录的最大联机数量。

转载于:https://www.cnblogs.com/csguo/p/7250720.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jdk1.8 stream() 把List<Map<String,Object>> 变成Map<Object, List<Map<String, Object>>>

jdk1.8 stream() 把List<Map<String,Object>> 变成Map<Object, List<Map<String, Object>>>List<Map<String,Object>> list jdbc.queryForList(sql); Map<Object, List<Map<String, Object>>> map list.stream(…

java对两个表进行排序_Excel工作簿中多个worksheet工作表,如何对工作表进行排序?...

案例&#xff1a;如下图所示&#xff0c;一个Excel文件中&#xff0c;包含了多个工作表&#xff0c;有1-雷哥office&#xff0c;2-雷哥office......但是&#xff0c;我们发现工作表的顺序是比较混乱的&#xff0c;为了方便管理&#xff0c;如何对工作表进行排序呢&#xff1f;方…

mysql5.7用户管理

添加用户 命令&#xff1a;create user usernamehost identified by password 例子&#xff1a;create user changfeng% identified by 111111 配置用户权限 命令&#xff1a;grant privileges on database.table to usernamehost 例子&#xff1a;grant all on *.* to changfe…

jdk1.8 stream() 把List对象 变成String

jdk1.8 stream() 把List对象 变成StringString dm list.stream().map(XXX -> XXX.getDm()).collect(Collectors.joining(",", "", ""));有时候获取到一个List<XXX>(XXX是对象),因为业务需求,我们想要获取其中一个属性&#xff0c;变成…

Spring Cloud Ribbon –进行安全呼叫

很简单&#xff0c;但是最近我为此感到困惑 –我必须对安全的远程服务进行基于Netflix Ribbon的客户端调用。 事实证明&#xff0c;使用Netflix Ribbon可以通过两种方式实现这一点&#xff0c;我将通过Spring Cloud对Ribbon库的出色支持来演示这一点。 在之前的两个博客文章中…

python、中循环功能可通过什么命令实现_python定时执行指定函数的方法 Python如何定时循环执行命令?...

python中如何定时执行某一个函数 怎么连接。。先调用注册函数 然后调用登录函数就行。顺序执行。至于如果你说注册失败不进行登录的话 直接在注册函数里面处理 注册失败 return def sign_up(user,pwd): #注册代码... # if not sign_up_true: # 注册失败 返回false return fals如…

我的做题日志(1),来源:COCI2017,SDOJ

Mirko在一家大型IT公司暑假实习。 该公司构建了一个由N行和M列组成的大型数据库。 在他第一天&#xff0c;Mirko收到了Q个查询。 每个查询由M个数字组成。 然而&#xff0c;一些数字在传输过程中丢失&#xff0c;所以它们用-1表示。 Mirko想知道数据库中有多少行对应于查询&…

java异步队列

文章目录前言一、异步队列实现思路&#xff1f;二、实现步骤1.加入监听器2.实现监听器3.实现转交处理对象和转交处理线程4.自动转交异步处理5.业务如何添加前言 在某些场景下&#xff0c;操作比较耗时&#xff0c;给用户体验不是很好&#xff0c;这时候我们就会直接想到两种方…

python27怎么使用_pygtk:glade的使用(针对python27的第一个例子)

glade是一个用来创建GTK界面的软件&#xff0c;这个界面以xml形式表示。这样达到了界面与语言分离的效果&#xff0c;pygtk就能使用这种方法来快速构建界面。在知道这个以前&#xff0c;我一直都是一个一个字母的敲出来的界面&#xff0c;实在无法忍受已经准备投入pyqt怀抱的时…

Kali 2017更新源

一、添加更新源 leafpad /etc/apt/sources.list 二、国内更新源 #autodeb http://http.kali.org/kali kali-rolling main non-free contrib#中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rol…

获取hh:mm:ss

获取hh:mm:ss format(date, "HH:mm:ss")

orm的理解_ORM仇恨者无法理解

orm的理解我看过无数的文章和评论&#xff08;尤其是评论&#xff09;&#xff0c;它们告诉我们ORM&#xff08;对象关系映射&#xff09;概念的严重性&#xff0c;糟糕性和错误性。 以下是通常的声明&#xff0c;以及我对它们的评论&#xff1a; “它们很慢” –映射有一些开销…

华为手机打字声音怎么开启_华为手机这5个超实用小功能,记得要开启,谁用都说好...

华为手机这5个超实用小功能&#xff0c;记得要开启&#xff0c;谁用都说好用过华为手机的用户应该都知道&#xff0c;emui优化的很到位&#xff0c;同时也给用户非常好的体验感&#xff0c;随着系统的优化&#xff0c;功能也是越来越完善&#xff0c;不仅越来越好用&#xff0c…

ORM进阶之Hibernate 的三大对象

ORM进阶之 ORM简单介绍 ORM进阶之Hibernate 简单介绍及框架搭 ORM进阶之Hibernate 的三大对象 我们在上一篇博客中讲到了怎样搭建一个Hibernate框架&#xff0c; 提到Hibernate我们就不得不说他的三大对象&#xff0c;Configuration&#xff0c;SessionFactory &#xff0c; Se…

与Java EE和Spring的集成架构

本周在纽约举行的OReilly软件体系结构大会将举行 。 我很高兴与Josh Long一起提供了有关如何集成Java EE和Spring的教程。 一段时间以来&#xff0c;我们一直在开玩笑。 某些人想到的对两种技术的超级愚蠢见解使我们俩都感到困扰了一段时间。 这次演讲的另一个重要原因是&#…

推广的euclid_欧几里德(Euclid)贴近度评价法在人类进化上的应用

文●螭母&#xff1a;1008一s688 12001)Ol一0006—03 欧几里德(Euclid)贴近度评价法在人类进化上的应用 刘国民1&#xff0c;宋香梅2 (1奉溪拜专&#xff0c;皋溪117022&#xff1b;2&#xff0e;本溪市圆税局&#xff0c;苯澳117022) 搞要&#xff1a;用F唧数学中的欧几里德贴…

HTML个人笔记

<hr/> 水平线标签 <hr style "whidth:80px"/>设置水平线宽度&#xff1b; <hr style "whidth:80%"/>居中 <hr style "whidth:80%" align "left"/>段落的80%&#xff0c;居左&#xff1b; ol>li*5tab生产5…

qt 保存绘制图片时背景变黑_QGraphicsScene绘制背景图片引起的问题

项目是基于Qt的图形视图框架编写的&#xff0c;现有个需求是要在图形中加入自定义的背景图片。心想不就是个背景图片吗&#xff1f;只要重写drawBackground函数我想怎么画就怎么画啊。于是立马从QGraphicsScene类中派生了一个CScene类&#xff0c;并重写了虚函数drawBackground…

JavaScript | JSON基本格式

————————————————————————————————————————————————————————— JSON 语法 "use strict"; // 简单值 "hello,world" // 必须使用双引号// 对象 {"name": "hugh","age&…

Linux命令大全(文件管理)

Linux命令&#xff08;文件管理命令&#xff09; 1、cat命令。用于连接文件并打印到标准输出设备上。 参数: -n 从1开始对所有的输出行数进行编号 -b 和n类似&#xff0c;只是不算空行 -s 大于等于2个空格&#xff08;连续的&#xff09;当一个空格处理 -T 将Tab字符显示…