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 2018pub
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, section) []:XS
Common Name (eg, your name or your server's hostname) []:XS.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连接。
关于运维学习、分享、交流,笔者开通了微信公众号【运维猫】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学运维知识。