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=022 # 本地用户文件掩码 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=22226 # pasv模式使用的最小端口号 pasv_max_port=22228 # 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------. 2 user1 user1 62 10月 12 16:52 /var/ftp/pub/user1/ # 添加防火墙策略 [root@ftp ~]#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT [root@ftp ~]#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22226:22228 -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.10 => /lib64/libssl.so.10 (0x00007f17c0622000) # 生成加密证书 [root@ftp ~]# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem Generating a 1024 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 (2 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 凭证保护时在网址中出现 该凭证的详细信息包括发行机构与网站拥有人的企业名称,可以通过点击浏览器网址栏上的锁定标记进行查看