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
[root@ftp ~]# yum -y install vsftpd
# 备份配置文件
[root@ftp ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}
# 简化配置文件内容
[root@ftp ~]# grep -Ev '^#|^$' /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
# 修改配置文件
anonymous_enable=NO # 是否禁止匿名用户登录
local_enable=YES # 是否允许本地用户登录
write_enable=YES # 是否允许写入
local_umask= # 本地用户文件掩码
xferlog_enable=YES # 是否在上传/下载文件时记录日志
connect_from_port_20=NO # 是否使用20端口传输数据(是否使用主动模式)
xferlog_std_format=YES # 是否使用标准日志格式
xferlog_file=/var/log/xfer.log # 日志文件路径
chroot_local_user=NO # 是否限制所有的本地用户在自己的家目录
chroot_list_enable=YES # 是否指定不能离开家目录的用户
chroot_list_file=/etc/vsftpd/chroot_list # 指定不能离开家目录的用户名单文件
allow_writeable_chroot=YES  # 是否开启家目录可写
listen=YES # 是否开启ipv4监听
listen_ipv6=NO # 是否开启ipv6监听
pam_service_name=vsftpd # 使用pam模块控制,vsftpd文件在/etc/pam.d/目录下
userlist_enable=YES # 是否开启用户本地用户名单, 当userlist_deny=NO时 , userlist_file名单内的用户为白名单,反则反之
userlist_deny=YES # 决定禁止/允许userlist_file名单内的用户登录
tcp_wrappers=YES # 是否允许tcp_wrappers管理
pasv_enable=YES # 是否允许pasv模式
pasv_min_port= # pasv模式使用的最小端口号
pasv_max_port= # pasv模式使用的最大端口号
download_enable=NO # 是否允许下载
userlist_file=/etc/vsftpd/user_list # 用户名单文件
user_config_dir=/etc/vsftpd/vsftpd_user_conf # 用户配置文件

创建本地用户

# 创建本地用户指定家目录
[root@ftp ~]# useradd -d /var/ftp/pub/user1 -s /sbin/nologin user1
# 设置密码
[root@ftp ~]# passwd user1
# 添加到禁止离开家目录的列表中
[root@ftp ~]# echo user1 >> /etc/vsftpd/chroot_list
# 修改权限
[root@ftp ~]# chown -R user1.user1 /var/ftp/pub/user1/
[root@ftp ~]# ll -d /var/ftp/pub/user1/
drwx------. user1 user1 10月 : /var/ftp/pub/user1/
# 添加防火墙策略
[root@ftp ~]#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT
[root@ftp ~]#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport : -j ACCEPT
[root@ftp ~]# getenforce
Permissive
[root@ftp ~]# systemctl start vsftpd
最后就可以通过ftp://ip在浏览器里访问上面的ftp(只有被动模式的ftp才能再浏览器里访问)
也可使用Filezilla等工具连接ftp,不过要在客户端里手动修改成被动模式  ftp登陆后的路径锁定到账号家目录下
ftp传输数据是明文,弄个抓包软件就可以通过数据包来分析到账号和密码,为了搭建一个安全性比较高ftp,可以结合SSL来解决问题
 
查看vsftp当前是否支持ssl加密
# 如果没有输出此类消息 那么说明该版本的svftp不支持ssl加密
[root@ftp user1]# ldd /usr/sbin/vsftpd |grep libssl
libssl.so. => /lib64/libssl.so. (0x00007f17c0622000) # 生成加密证书
[root@ftp ~]# openssl req -x509 -nodes -days -newkey rsa: \-keyout /etc/vsftpd/vsftpd.pem \-out /etc/vsftpd/vsftpd.pem
Generating a bit RSA private key
.....................................++++++
......++++++
writing new private key to '/etc/vsftpd/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name ( letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:haidian
Organization Name (eg, company) [Default Company Ltd]:ftpssl
Organizational Unit Name (eg, section) []:ftpssl
Common Name (eg, your name or your server's hostname) []:ftp
Email Address []:damowang.cn@gmail.com
# 修改配置文件
[root@ftp user1]# vim /etc/vsftpd/vsftpd.conf ssl_enable=YES # 是否启用ssl加密
allow_anon_ssl=NO # 是否允许匿名用户使用ssl加密
force_local_data_ssl=YES # 非匿名用户传输数据时是否加密
force_local_logins_ssl=NO # 匿名用户登录时是否加密
ssl_tlsv1=YES # 是否激活tls v1加密
ssl_sslv2=NO # 是否激活sslv2加密
ssl_sslv3=NO # 是否激活sslv3加密
rsa_cert_file=/etc/vsftpd/vsftpd.pem # rsa证书的位置

重启vsftpd服务

[root@ftp ~]# systemctl restart vsftpd

使用Filezilla连接查看是否为TSL加密

什么是SSL、TSL、HTTPS?

SSL 的全名是 Secure Sockets Layer,即安全套接字层,简而言之,這是一种标准技术,用于保持网际网络连接安全以及防止在两个系统之间发送的所有敏感资料被罪犯读取及修改任何传输的信息,包括潜在的个人详细信息 两个系統可以是伺服器与客户端 (例如购物网站与浏览器),或者伺服务器至伺服务器 (例如,含有个人身份信息或含有薪资信息的应用程序)

这样做是为了确保使用者与网站、或两个系统之间传输的任何信息保持无法被读取的状态  此技术可使用加密算法以混淆传输中的信息,防止骇客在信息公国连接发送时读取信息  此信息可能是任何敏感或个人细信息,包括信用卡号与其他财务信息、姓名与地址等等

TSL (Transport Layer Security,传输层安全协议) 是更新、更安全的 SSL 版本  我们仍将安全性凭证成为 SSL,因为这是比较常用的词

HTTPS (Hyper Text Transfer Protocol Secure,超文本传输协议安全) 会在网站受到 SSL 凭证保护时在网址中出现  该凭证的详细信息包括发行机构与网站拥有人的企业名称,可以通过点击浏览器网址栏上的锁定标记进行查看

CentOS 7 FTP环境部署的更多相关文章

  1. Centos下PPTP环境部署记录

    PPTP(点到点隧道协议)是一种用于让远程用户拨号连接到本地的ISP,通过因特网安全远程访问公司资源的新型技术.它能将PPP(点到点协议)帧封装成IP数据包,以便能够在基于IP的互联网上进行传输.PP ...

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

    在日常运维工作中,常部署到的FTP是vsftpd和proftd.之前写了Linux下FTP虚拟账号环境部署总结,下面简单说下本地用户下的FTP环境部署过程: 简单梳理下FTP主动和被动两种工作模式: ...

  3. Centos下SVN环境部署记录

    大多数情况下,我们日常工作中用的版本控制系统都会选择分布式的Git,它相比于集中式的SVN有很多优势.但是有些项目软件基于自身限制,可能只支持SVN做工程同步.废话就不多说了,下面记录下SVN的部署和 ...

  4. DotNet Core 1.0 集成 CentOS 开发与运行环境部署

    一.     DotNet Core 1.0 开发环境部署 操作系统安装 我们使用CentOS 7.2.1511版本. 安装libunwind库 执行:sudo yum install libunwi ...

  5. Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署

    运行环境 照例,先亮环境:软件的话我这里假设你已经批准好了.net core 运行环境,未配置可以看我的这篇[linux(centos)搭建.net core 运行环境] 腾讯云 centos:7.2 ...

  6. Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署

    运行环境 照例,先亮底 centos:7.2 cpu:1核 2G内存 1M带宽 辅助工具:xshell xftp 搭建.net core运行环境 .net core 的运行环境我单独写了一篇,请看我的 ...

  7. Linux下FTP虚拟账号环境部署总结

    vsftp的用户有三种类型:匿名用户.系统用户.虚拟用户.1)匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous.2)本地用户登录:使用系统用户登录,在/etc/passwd中 ...

  8. 在 CentOS 7上Virtualbox+phpVirtualBox完整虚拟化环境部署

    一.phpVirtualBox简介      VirtualBox是一套为不同操作系统而设的 x86 虚拟化产品.它是一个机器/硬件的虚拟化产品,功能上与 VMware Server.Parallel ...

  9. Web应用之LAMP源码环境部署

    一.LAMP环境的介绍 1.LAMP环境的重要性 思索许久,最终还是决定写一篇详细的LAMP的源码编译安装的实验文档,一来是为了给自己一个交代,把技术进行系统的归纳,将技术以极致的形式呈现出来,做为一 ...

随机推荐

  1. C# 默认访问修饰符

    c# 中类,成员,枚举,结构等默认访问修饰符是? 根据MSDN文档有: [MSDN] Classes and structs that are not nested within other clas ...

  2. 堡垒机jumpserver测试记录--使用

    快速入门 截图就不放了,官网都有,这里只是就遇到的一些问题做下记录 必备条件 一台安装好 Jumpserver 系统的可用主机(堡垒机) 一台或多台可用的 Linux.Windows资产设备(被管理的 ...

  3. Python 中的单例模式

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  4. js小笔记

    1.let ,const,var 区别 let:块级作用域,if,for,用完就不存在了. const:用来定义常量. var: 声明的变量在它所声明的整个函数都是可见的. 2.==和===的区别 1 ...

  5. mongodb配置问题

    1.安装好mongodb后需要在控制行输入很长的一窜很麻烦,可以新建一个.bat文件 cd F:\mongodb\Server\3.0\binmongod --dbpath "F:\mong ...

  6. Go九九乘法表

    package main import "fmt" func main(){ ; i < ; i ++ { k ++ ; j ++ { { fmt.Printf(" ...

  7. windows系统 phpstudy2018 配置阿里云https最简单的流程!

    一.从阿里去下载ssl文件放到C:\phpStudy\PHPTutorial\Apache\conf\cert 二.首先phpstudy开户php_openssl扩展,具体如下图 一般网上的教程,都要 ...

  8. elasticsearch之分词插件使用

    elasticsearch对英文会拆成单个单词,对中文会拆分成单个字.下面来看看是不是这样. 首先测试一下英文: GET /blog/_analyze { "text": &quo ...

  9. js判断设备是否为安卓

    var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...

  10. Python 学习笔记5 变量-列表

    列表是python常用的一种变量. 是由一些列按照特定顺序排列的元素组成的.你可以创建包含字母表中的所有字母,数字.可以将任何东西都加入到列表中. 通常情况下,列表中都包含多个元素,所以建议变量的名称 ...