FTP服务端: IP:172.17.120.50
FTP客户端: IP:172.17.120.51
FTP服务概述:
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。
FTP(File Transfer Protocol: 文件传输协议)作用:Internet 上用来传送文件的协议
常见FTP服务器:
windows:Serv-U FTP Server,filezilla_server
Linux:ProFTPD:(Professional FTP daemon)一个Unix平台上或是类Unix平台上(如Linux, FreeBSD等)的FTP服务器程序。
今天的主角:vsftp
VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。
特点:
它是一个安全、高速、稳定的FTP服务器;
模式:C/S 模式
端口:
[root@docker-01 vsftpd]# vim /etc/services
20 (传数据) 21 (传指令)
fsp(File Service Protocol):文件服务协议。
工作流程(原理):
##面试经常会遇到这样问题,大家需要注意下
这里的主动和被动,是相对于的FTP server 端来判断的
如果server 去连接client 开放的端口,说明是主动的,相反,如果client去连接server开放的端口,则是被动的。
安装vsftp服务器端、客户端
[root@docker-01 vsftpd]# yum -y install vsftpd lftp
安装客户端:
[root@docker-01 vsftpd]# yum install -y lftp
注:从RHEL6开始,系统镜像中默认没有ftp客户端命令。取而代之的是lftp命令
Linux客户端:
lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常好一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。
配置文件位置:
2.vsftpd 相关文档
/etc/vsftpd/vsftpd.conf:vsftpd 的核心配置文件
/etc/vsftpd/ftpusers:用于指定哪些用户不能访问FTP 服务器。 黑名单
/etc/vsftpd/user_list:指定允许使用vsftpd 的用户列表文件。 白名单
vim /etc/vsftpd/user_list
# 如果userlist_deny= YES(默认),绝不允许在这个文件中的用户登录ftp,甚至不提示输入密码
#prompt 提示
/etc/vsftpd/vsftpd_conf_migrate.sh:是vsftpd 操作的一些变量和设置脚本
/var/ftp/:默认情况下匿名用户的根目录
启动服务
[root@docker-01 ~]# systemctl start vsftpd
Job for vsftpd.service failed because the control process exited with error code. See "systemctl status vsftpd.service" and "journalctl -xe" for details.
如果报错:请关闭防火墙和selinux再次启动:
[root@docker-01 ~]# setenforce 0
[root@docker-01 ~]# systemctl stop firewalld.service
[root@docker-01 ~]# iptables -F
[root@docker-01 ~]# systemctl restart firewalld.service
如果还是无法启动:修改/etc/vsftpd/vsftpd.conf配置文件
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
ftpd_banner=Welcome to blah FTP service.
listen=YES
listen_port=21
#listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
use_localtime=YES
再次启动服务:
[root@docker-01 vsftpd]# systemctl enable vsftpd.service
[root@docker-01 vsftpd]# netstat -antup | grep ftp
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 17772/vsftpd
互动:为什么看不到20端口?。
因为没有数据通信。
客户端此服务的使用方法:
Linux:
[root@docker-02 ~]# lftp 172.17.120.50
lftp 172.17.120.50:~> ls
drwxr-xr-x 2 0 0 6 Oct 30 2018 pub
ftp的默认根目录:是/var/ftp/pub
修改ftp的根目录只要修改/etc/vsftpd/vsftpd.conf文件即可:
加入如下几行:
local_root=/var/www/html
chroot_local_user=YES
anon_root=/var/www/html
注:local_root 针对系统用户;anon_root 针对匿名用户。
重新启动服务:
systemctl restart vsftpd.service
任何一个用户ftp登录到这个服务器上都会chroot到/var/www/html目录下。
补充: 配置vsftpd,使用SSL证书加密数据传输
FTP与HTTP一样缺省状态都是基于明文传输,希望FTP服务器端与客户端传输保证安全,可以为FTP配置SSL
1, 使用OpenSSL生成自签证书
[root@docker-01 vsftpd]# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3560
Generating a 2048 bit RSA private key
..........................................................................................+++
.....................+++
writing new private key to '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]:ZH
State or Province Name (full name) []:JS
Locality Name (eg, city) [Default City]:NJ
Organization Name (eg, company) [Default Company Ltd]:XS
Organizational Unit Name (eg, p) []:XS
Common Name (eg, your name or your server's hostname) []:XS.COM
Email Address []:XS@QQ.COM
OpenSSL 简单参数解释:
req - 是X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。
x509 - X.509 证书数据管理。
days - 定义证书的有效日期。
newkey - 指定证书密钥处理器。
keyout - 设置密钥存储文件。
out - 设置证书存储文件,注意证书和密钥都保存在一个相同的文件
2、开VSFTPD 配置文件并在文件中指定SSL 的详细信息:
[root@docker-01 vsftpd]# vi /etc/vsftpd/vsftpd.conf
找到 ssl_enable 选项把它的值设置为 YES 激活使用SSL,另外,由于TSL 比SSL 更安全,我们会使用 ssl_tlsv1_2 选项让VSFTPD 使用更严格的TLS:
ssl_enable=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO
3、然后,添加下面的行来定义SSL 证书和密钥文件的位置:
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
4、下面,我们要阻止匿名用户使用SSL,然后强制所有非匿名用户登录使用安全的SSL 连接进行数据传输和登录过程中的密码发送:
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
5、另外,我们还可以添加下面的选项增强FTP 服务器的安全性。当选项 require_ssl_reuse 被设置为 YES 时,要求所有SSL 数据连接都会重用SSL 会话;这样它们会知道控制通道的主密码。
因此,我们需要把它关闭。
require_ssl_reuse=NO
另外,我们还要用 ssl_ciphers 选项选择VSFTPD 允许用于加密SSL 连接的SSL 算法。这可以极大地限制那些尝试发现使用存在缺陷的特定算法的攻击者:
ssl_ciphers=HIGH
6、现在,设置被动端口的端口范围(最小和最大端口)。
pasv_min_port=40000
pasv_max_port=50000
7、选择性启用 debug_ssl 选项以允许SSL 调试,这意味着OpenSSL 连接诊断会被记录到VSFTPD 日志文件:debug_ssl=YES
保存所有更改并关闭文件。然后让我们重启VSFTPD 服务:[root@docker-01 vsftpd]# systemctl restart vsftpd.service为了安全地连接到服务器,我们需要一个支持 SSL/TLS 连接的 FTP 客户端,例如 FileZilla。
8、FileZilla 是一个现代化、流行且重要的跨平台的FTP 客户端,它默认支持SSL/TLS 连接。
要在Linux 上安装FileZilla,可以运行下面的命令:
[root@docker-02 ~]# yum install epel-release filezilla
9、当安装完成后(或者你已经安装了该软件),打开它,选择File => Sites Manager 或者按 Ctrl + S 打开Site Manager 界面。
点击New Site 按钮添加一个新的站点/主机连接详细信息。
在 FileZilla 中添加新 FTP 站点
下一步,像下面这样设置主机/站点名称、添加IP 地址、定义使用的协议、加密和登录类型(使用你自己情况的值):
Host: 192.168.56.10
Protocol: FTP – FileTransferProtocol
Encryption: RequireexplicitFTP over #recommended
LogonType: Askforpassword #recommended
User: username
在 Filezilla 中添加 FTP 服务器详细信息
10、然后点击Connect,再次输入密码,然后验证用于SSL/TLS 连接的证书,再一次点击 OK 连接到FTP 服务器:
验证 FTP SSL 证书
到了这里,我们应该使用TLS 连接成功地登录到了FTP 服务器,在下面的界面中检查连接状态部分获取更多信息。
通过 TLS/SSL 连接到 FTP 服务器
11、最后,在文件目录尝试 从本地传输文件到FTP 服务器,看FileZilla 界面后面的部分查看文件传输相关的报告。
使用 FTP 安全地传输文件
就是这些。记住FTP 默认是不安全的,除非我们像上面介绍的那样配置它使用SSL/TLS 连接。