一、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权限