目录
FTP协议是什么
FTP协议的端口号20和21的区别
vsftpd服务程序
匿名开放模式
本地用户模式
虚拟用户模式
TFTP 简单文件传输协议
FTP(File Transfer Protocol) ,是一种处于应用层的,用于文件传输的协议。是基于TCP协议的应用层协议,用于在网络上传输文件。
ftp端口号20和21的区别是21端口用于连接,20端口用于传输数据。进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,要传输文件时,服务器会开一个端口为20来进行传输数据文件。
默认情况下FTP协议使用TCP端口中的20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。
vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux系统上的FTP服务程序,不仅开源而且免费,还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP服务程序不具备的特点。
vsftpd 作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到FTP服务器上。
匿名开放模式
本地用户模式
虚拟用户模式
# 安装vsftpd服务
[root@localhost ~]# yum install vsftpd -y
# 清空iptables防火墙的默认策略
iptables防火墙默认禁止了FTP传输协议的端口号,因此在正式配置vsftpd服务程序之前,需要清空iptables防火墙的默认策略
[root@localhost ~]# iptables -F
# 主配置文件:/etc/vsftpd/vsftpd.conf
由于主配置文件中大部分内容是注释信息,我们可以通过grep命令加上-v参数,过滤出没有包含井号的参数行(即过滤出所有的注释信息),然后将过滤后的参数行通过输出重定向写回原始的主配置文件中
[root@localhost vsftpd]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
[root@localhost vsftpd]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
[root@localhost ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
在vsftpd服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都可以无需密码而直接登录到FTP服务器。
vsftpd服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。
# 可以向匿名用户开放的权限参数以及作用
anonymous_enable=YES 允许匿名用户访问模式
anon_umask=022 匿名用户上传文件的umask值
anon_upload_enable=YES 允许匿名用户上传文件
anon_mkdir_write_enable=YES 允许匿名用户创建目录
anon_other_write_enable=YES 允许匿名用户修改目录名称或删除目录
# 在主配置文件/etc/vsftpd/vsftpd.conf中正确填写参数
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
相较于匿名开放模式,本地用户模式要更安全,而且配置起来也更简单。
# 本地用户模式使用的权限参数以及作用
anonymous_enable=NO 禁止匿名访问模式
local_enable=YES 允许本地用户模式
write_enable=YES 设置可写权限
local_umask=022 本地用户模式创建文件的umask值
userlist_enable=YES 启用“禁止用户名单”,名单文件为ftpusers和user_list
userlist_deny=YES 开启用户作用名单文件功能
# 在主配置文件/etc/vsftpd/vsftpd.conf中正确填写参数
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
# 重启服务并且设置开机自启
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# systemctl enable vsftpd
使用本地用户的身份登录FTP服务器
[root@localhost vsftpd]# ftp 192.168.58.165
Connected to 192.168.58.165 (192.168.58.165).
220 (vsFTPd 3.0.3)
Name (192.168.58.165:root): root
530 Permission denied.
Login failed.
ftp>
然而使用root管理员用户登录却被系统拒绝访问了!
主要是因为vsftpd服务的目录中有两个“用户名单”文件(ftpusers和user_list),vsftpd服务程序为了保证服务器的安全性而默认禁止了root管理员和大多数系统用户的登录行为,这样可以邮箱地避免黑客通过FTP服务对root管理员密码进行暴力破解
如果确定在生产环境中使用root管理员不会对系统安全造成影响,只需在两个“用户名单”文件中删除root用户名即可
# 我们可以选择这两个文件中没有的一个普通用户 suda 来尝试登录FTP服务器
[root@localhost vsftpd]# echo "123456"|passwd suda --stdin
更改用户 suda 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost vsftpd]# ftp 192.168.58.165
Connected to 192.168.58.165 (192.168.58.165).
220 (vsFTPd 3.0.3)
Name (192.168.58.165:root): suda
331 Please specify the password.
Password: # 此处输入123456
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Create directory operation failed.
# 新建文件夹的操作被拒绝,此时需要开启SELinux域中对FTP服务的允许策略
[root@localhost ~]# getsebool -a|grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off # 要设置该行
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@localhost ~]# setsebool -P ftpd_full_access=on
# 再次登录FTP服务器,分别执行文件的创建、重命名和删除操作,发现操作均被允许了
[root@localhost vsftpd]# ftp 192.168.58.165
Connected to 192.168.58.165 (192.168.58.165).
220 (vsFTPd 3.0.3)
Name (192.168.58.165:root): suda
331 Please specify the password.
Password: # 此处输入123456
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/home/suda/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
虚拟用户模式是这三种模式中最安全的一种认证模式。
虚拟用户模式通过创建独立的FTP用户数据库文件来进行认证并登录到FTP服务器的认证方式,所以相比较来说它是最安全的认证模式。
TFTP是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议。它提供不复杂、开销不大的文件传输服务,可将其当作FTP协议的简化版本。
TFTP的命令功能不如FTP强大,在安全性方面也弱于FTP服务,文件传输过程也不像FTP那样可靠。但是TFTP不需要客户端的权限认证,所以在传输琐碎(trivial)不大的文件时,效率很高。
TFTP的安装与配置
# 安装tftp相关软件包
[root@localhost ~]# yum install tftp-server tftp -y
TFTP服务是使用xinetd服务程序来管理的,xinetd服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能。
# 在xinetd服务程序中开启tftp服务
[root@localhost ~]# vim /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
# 重启xinetd服务,并且添加开机自启
[root@localhost xinetd.d]# systemctl restart xinetd
[root@localhost xinetd.d]# systemctl enable xinetd
[root@localhost xinetd.d]# ps -ef|grep xinetd
root 2417 1 0 23:00 ? 00:00:00 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
root 2430 1893 0 23:01 pts/1 00:00:00 grep --color=auto xinetd
使用TFTP服务
TFTP的根目录为/var/lib/tftpboot,可以使用 tftp 命令尝试访问其中的文件。
tftp命令中可用的参数
? 帮助信息
put 上传文件
get 下载文件
verbose 显示详细的处理信息
status 显示当前的状态信息
binary 使用二进制进行传输
ascii 使用ASCII码进行传输
timeout 设置重传的超时时间
quit 退出
举例
[root@localhost ~]# echo "i love linux" > /var/lib/tftpboot/test.txt
[root@localhost ~]# tftp 192.168.58.165
tftp> get test.txt
tftp> quit
[root@localhost ~]# ls
test.txt
[root@localhost ~]# cat test.txt
i love linux