一、FTP
FTP,文件传输协议(File Transfer Protocol)
1、FTP两种工作模式
1.1、主动模式
-
客户端产生一个大于1024的随机端口,与FTP服务器的21号端口连接,建立命令通道,连接成功后,客户端就通过这个连接向服务器下达命令,比如:查询、下载、上传等命令
-
当客户端需要数据的时候,客户端会再产生一个随机端口,通过上面的命令通道,向FTP服务器发送主动连接请求和这个随机端口,并等待服务器主动来连接
-
当FTP服务器接收消息后,会主动用自己的20号端口去和客户端后面产生的随机端口进行连接,建立数据通道
总结:
-
服务端使用端口:20、21
-
客户端主动连接FTP服务器的21端口,建立命令通道
-
FTP服务器通过20端口主动连接客户端,建立数据通道
问题:
-
如果客户端处于防火墙后端,去连接一个外部FTP服务器的21号端口没问题,但外部FTP服务器用20端口来主动连接客户端的随机端口时,防火墙就不好设置了。
解决办法:
-
改用被动模式
1.2、被动模式(默认工作模式)
-
和主动模式一样,先由客户端产生一个随机端口去连接FTP服务器的21端口,建立命令通道
-
当客户端需要数据时,先通过命令通道,向服务器发出被动连接的请求,并等待服务器的回应
-
服务器收到这个请求,如果服务器开启了被动模式,先产生一个随机端口,然后通过命令通道告诉客户端
-
客户端收到回应后,产生一个随机端口,去连接FTP服务器的随机端口,建立数据通道
总结:
-
服务端使用端口:21、随机
-
客户端主动连接FTP服务器的21端口,建立命令通道
-
FTP服务器产生随机端口,等待客户端来连接,建立数据通道
问题:
-
如果FTP服务器处于防火墙后端,当客户端通过被动模式连接FTP服务器的随机端口时,会有问题。
解决办法:
-
将FTP服务器放于防火墙的DMZ
-
指定FTP服务器随机端口范围
2、FTP用户类型
FTP 服务器在预设的情况下,依据使用者登入的情况而分为三种不同的身份,分别是 本地用户、虚拟用户、匿名用户这三种
本地用户
-
Linux系统本地用户,登录目录为自己的家目录
-
用户号信息和密码保存在passwd、shadow文件中
虚拟用户
-
FTP服务自己管理的用户,需要为FTP服务单独建立用户数据库文件。有两种方式:本地数据文件或数据库服务器。
-
使用虚拟用户登录FTP,只能访问FTP服务器提供的资源,大大增强了系统的安全。
匿名用户
-
不安全,任何人都可以无需密码验证而直接登陆
-
对应本地用户:anonymous或ftp
3、chroot
为了避免用户在Linux系统当中随意逛大街 (指用户离开自己的家目录而进入系统的其他目录),所以将使用者的工作范围局限在用户的家目录下面,这种环境称之为change root,简称chroot
4、安装FTP
#将包
yum install -y vsftpd
#启动服务
systemctl enable vsftpd
systemctl start vsftpd
注意:
-
这时,FTP服务就可以用了,只不过都是默认配置
-
匿名用户的根:/var/ftp/pub
-
系统用户的根:自己的家目录
5、配置文件
vim /etc/vsftpd/vsftpd.conf
5.1、全局配置
#开启日志记录功能
xferlog_enable=YES
#开启20端口数据传输
connect_from_port_20=YES
#只监听IPV4
listen=YES
#同时监听IPV4和IPV6
#listen_ipv6=NO
注意
-
上面两个选项,只能选一个,否则冲突
5.2、匿名用户
#禁止匿名用户登录
anonymous_enable=NO
#指定匿名用户的根
#注意,根目录不能有写权限
anon_root=/var/ftp
#匿名用户上传的文件,默认权限
anon_umask=022
-
注意,如果没有这条,匿名用户只能上传,不能下载。因为上传的权限默认是600,不能下载。
#允许匿名上传
anon_upload_enable=YES
#允许匿名用户新建目录
anon_mkdir_write_enable=YES
#允许匿名用户其它写权限,比如:重命名、删除等。
anon_other_write_enable=YES
#匿名用户不需要密码直接登陆
no_anon_password=YES
#限制匿名用户的流量,单位Bytes/秒
anon_max_rate=10000
5.3、本地用户
#开启本地系统用户登录
#默认已开始
local_enable=YES
#为所有系统用户指定一个统一的根,包括虚拟用户
#如果不指定,每个用户使用自己的家目录作为根
local_root=/var/ftp
#所有系统用户的活动范围,都限制在上面指定的目录
chroot_local_user=YES
#指定用户上传的文件的umask值
#用户上传的文件,默认权限为:666-022=644
#目录权限:777-022=755
local_umask=022
#允许写
write_enable=YES
5.4、用户过滤
#启用用户过滤
userlist_enable=YES
#指定过滤规则
#YES,默认允许所有,只有写入下面列表的才是禁止的用户
#NO,默认禁止所有,只有写入下面列表的才是允许的用户
#默认值为YES
userlist_deny=YES
#指定过滤用户列表文件
#将要过滤的用户名写入该文件,一行一个。
userlist_file=/etc/vsftpd/user_list
5.5、Chown
#开启上传后更改所有者的功能
chown_uploads=YES
#上传后文件所有者变为了user1,而匿名用户对文件的权限为0,无任何权限
chown_username=user1
5.6、被动模式
#开启被动模式
pasv_enable=YES
#被动模式下,指定数据通道随机端口范围
pasv_min_port=30000
pasv_max_port=31000
5.7、限制下载带宽
#限制下载带宽,单位Bytes/秒
local_max_rate=100000
5.8、连接限制
#限制最大连接人数
#0为不限制
max_clients=0
#限制单个IP,最多连接数
#0为不限制
max_per_ip=0
5.9、Chroot
#如果启用了限定用户在其家目录下需要添加这个配置
#允许对根目录执行写操作
allow_writeable_chroot=YES
两种方法:
1、默认所有用户都不chroot,只有指定的用户才chroot,限制在自己的家目录
#启用chroot列表
chroot_list_enable=YES
#指定chroot用户列表文件
chroot_list_file=/etc/vsftpd.chroot_list
2、默认所有本地用户都chroot,只有指定的用户不chroot
#所有本地用户都要chroot
chroot_local_user=YES
#启用chroot列表
chroot_list_enable=YES
#指定chroot用户列表文件
#此时,列表中写入的是不需要chroot的用户,也就是被信任的用户
chroot_list_file=/etc/vsftpd.chroot_list
5.10、设置欢迎信息
#指定欢迎信息在哪儿
banner_file=/etc/vsftpd/welcome.txt
#写入欢迎信息
vi /etc/vsftpd/welcome.txt
welcome
5.11、用户自定义配置
每个用户可以自定义自己的配置,覆盖全局配置
vi /etc/vsftpd/vsftpd.conf
#指定用户自定义配置文件存放的路径
#在此目录下,以每个用户的用户名作为文件名
user_config_dir=/etc/vsftpd/vuser_conf
#如果不存在,创建指定目录
mkdir /etc/vsftpd/vuser_conf
#以用户名作为文件名,创建用户自定义文件
#指定ftpuser1这个用户的根
vi /etc/vsftpd/vuser_conf/ftpuser1
local_root=/mnt/ftp
6、创建系统用户
#指定用户的家目录,当用这个用户登陆FTP的时候,默认就到它的家目录
#nologin或false,为了安全考虑,不允许这个用户登陆到系统
useradd -s /sbin/nologin vftpuser
注意:
-
vsftpd通过pam验证,默认会检查shell是否有效(是否在/etc/shells中),而nologin和false默认不在/etc/shells中,验证不能通过。
解决方法:
-
将/sbin/nologin和/bin/false添加到/etc/shells文件中,但是不建议。因为/etc/shells文件中记录的shell,表示valid login shells,更改后会对全局生效。
-
将/etc/pam.d/vsftpd中的auth required pam_shells.so这一行注释掉,不检查shell
#配置密码
passwd vftpuser
7、虚拟用户
所有的虚拟用户会被统一映射为一个指定的系统本地账号。如果不指定根,访问的共享位置就是该用户的家目录
虚拟用户存储方式:
-
文件,奇数行为用户名,偶数行为密码。需要用hash算法将明文信息转换成数据文件。
-
数据库,需要PAM模块:pam-mysql
7.1、启用虚拟用户
#创建一个虚拟用户对应的系统用户
#此用户不需要登陆到系统
useradd -s /sbin/nologin ftpuser
#修改配置文件
vi /etc/vsftpd/vsftpd.conf
#启用虚拟用户
guest_enable=YES
#指定FTP虚拟用户对应的系统用户
#默认,虚拟用户的根就是此用户的家目录,但没有任何权限,包括查看
guest_username=ftpuser
#YES,虚拟用户和系统用户有相同的权限
#NO,虚拟用户和匿名用户有相同的权限,默认是NO
virtual_use_local_privs=YES
#重启服务
systemctl restart vsftpd
7.2、创建用户文件
#创建两个用户:ftpuser1,ftpuser2
#密码都为redhat
vi /etc/vsftpd/vuser_passwd.txt
ftpuser1
redhat
ftpuser2
redhat
#将明文文件进行hash
cd /etc/vsftpd
db_load -T -t hash -f vuser_passwd.txt vuser_passwd.db
#设置权限
chmod 600 vuser_passwd.db
#删除明文文件
rm -f vuser_passwd.txt
7.3、PAM
虚拟用户的认证是通过pam方式去认证的,所以:
-
在FTP配置文件中,指定pam针对ftp的配置文件名称
-
在指定的pam配置文件里面指定认证的数据文件。
#指定vsftpd使用的pam配置文件名称
vi /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd
#配置PAM,指定账号密码存放位置
#注释其它内容
#注意:不用写文件后缀
vi /etc/pam.d/vsftpd
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd
8、防火墙
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 \
source address=172.24.0.0/24 \
port port=21 protocol=tcp accept'
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 \
source address=172.24.0.0/24 \
port port=30000-31000 protocol=tcp accept'
firewall-cmd --reload
9、FTP客户端
9.1、装包
#lftp客户端默认使用被动模式
#可登陆之后:set ftp:passive-mode off,设置成主动模式
yum install -y lftp
9.2、测试
#登陆
lftp -u vftpuser 172.24.0.2
ls
cd pub/
#刷新列表
rels
#下载文件
get f2
#指定下载目录
get -o /mnt/
#断点续传的方式下载多个文件
mget -c f2
#递归下载整个目录
mirror d/
#上传文件
put f1
#上传多个文件
mput f1 f2
#将本地目录递归上传
mirror -R localdir
#文件改名
mv f2 t1
#删除文件
rm -rf t1
注意:
-
下载文件,只需要该文件的other有r权限