2018-07-05 网络文件共享1 FTP服务

1、DAS、NAS、SAN

DAS(Direct-Attached Storage):直接连接存储,共享资源存储在本地磁盘上。
NAS(Network Attached Storage):网络连接存储,FTP就是这种存储方式,资源存储在远程主机的文件系统上,客户端通过网络连接只能访问这个存储资源,但不可以用文件系统管理这个资源,管理由别人来管理。
SAN(Storage Area Network):存储区域网络,远程的磁盘映射成为本机的一个块设备,相当于在本机又多了块磁盘,中间走的是以太网或者是光纤,你可以在这块磁盘上进行分区、创建文件系统,存储数据等,管理由自己管理,但NAS不能自己通过文件系统来管理。

2、文件传输协议(FTP)

File Transfer Protocol,简称FTP
基于C/S结构
双通道协议:数据和命令连接
两种模式:服务器角度
主动(PORT style):服务器主动连接
命令(控制):客户端:随机port ---服务器:tcp21
数据:客户端:随机port---服务器:tcp20
被动(PASV style):客户端主动连接
命令(控制):客户端:随机port ---服务器:tcp21
数据:客户端:随机port---服务器:随机port
服务器被动模式数据端口示例:
227 Entering Passive Mode (192,168,175,138,224,59)
服务器数据端口为:224*256+59
工作模型见下图


image.png

在FTP服务开启之后,命令通道端口就会打开,命令通道负责传输命令以及协商在主动和被动模式下数据通道服务器端的端口号,也就是客户端知道服务器端数据通道的端口号是通过命令通道得来的,数据通道服务器端口只有在传输数据的时候才会打开。客户端访问FTP服务器时(FTP 172.18.21.107),登录成功后,可以通过passive命令来开启和关闭被动模式,linux中默认是被动模式,windows中默认是主动模式。
数据传输格式:二进制(默认)和文本,一般情况下用二进制传输,因为以文本方式传输可能会丢失数据,比如windows中的文本文件上传到linux的ftp服务器时,因为文本文件格式不同,windows中的文本文件比linux中多了一个回车,这样就会造成上传后文件大小不同,如果是图片或者是二进制文件以文本方式传输的话就会丢失数据,所以不建议用文本方式传输。

3、FTP软件介绍

vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器
客户端软件:
ftp:支持匿名、系统用户、虚拟用户登录,当用匿名账号登录时,用户名要输入ftp或者anonymous,密码可以不用输入或者随便输入一个就可以
lftp:支持匿名登录,可以不用输入用户名和密码直接登录,并且登录后输入命令支持补全,十分方便
lftpget:lftpget ftp://172.18.0.1/pub/ks/CentOS-6.9-x86_64.cfg
可以直接下载
wget:wget ftp://172.18.0.1/pub/ks/CentOS-6.9-x86_64.cfg,也可以直接下载文件,并且显示下载的传输速率
curl:可以访问ftp服务器
ftp -A ftpserver port -A主动模式 –p被动模式
lftp –u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file
gftp: GUI centos5 最新版2.0.19 (11/30/2008)
filezilla,CuteFtp,FlashFXP,LeapFtp
IE ftp://username:password@ftpserver

4、FTP服务的状态码和用户认证

状态码:
1XX:信息,125:数据连接打开
2XX:成功类状态,200:命令OK ,230:登录成功
3XX:补充类,331:用户名OK
4XX:客户端错误,425:不能打开数据连接
5XX:服务器错误,530:不能登录
用户认证:
匿名用户:ftp,anonymous,对应Linux用户ftp,也就是虽然你是以匿名账号登录的,但实际上是ftp这个系统用户在访问磁盘上的数据。
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件,就像mysql数据库一样也有自己独立服务的用户名和密码,跟系统用户无关。

5、vsftpd服务

由vsftpd包提供
不再由xinetd管理
用户认证配置文件:/etc/pam.d/vsftpd
服务脚本:/usr/lib/systemd/system/vsftpd.service
/etc/rc.d/init.d/vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
man 5 vsftpd.conf
格式:option=value
注意:=前后不要有空格
匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
系统用户共享文件位置:用户家目录
虚拟用户共享文件位置:为其映射的系统用户的家目录

6、vsftpd服务配置

1、命令端口
listen_port=21
2、主动模式端口
connect_from_port_20=YES 主动模式端口为20
ftp_data_port=20 指定主动模式的端口
如果要改主动模式的端口号,改此行的端口为别的,但上面的yes不要改成no,否则实现不了,这个设置很奇怪,按照常理应该改成no,但改成no就是不成功,保留yes才会成功
3、被动模式端口范围
linux客户端默认使用被动模式
windows 客户端默认使用主动模式
pasv_min_port=6000     0为随机分配
pasv_max_port=6010
注意:如果设置的端口范围较少,用户访问的时候就会受到限制,因为一个用户访问就要占用一个端口号,所以端口范围要根据访问量调整
4、使用当地时间
use_localtime=YES 使用当地时间(默认为NO,使用GMT即格林尼治时间)
注意:和操作系统的时间要配合使用,如果操作系统时间为格林尼治时间,加上yes这一条,就会往后推八小时,跟北京时间相同,但如果系统时间为北京时间,则会往后推八小时,所以这一项不要改,改了反而不对了
5、匿名用户
anonymous_enable=YES 支持匿名用户
no_anon_password=YES(默认NO) 匿名用户略过口令检查
anon_world_readable_only(默认YES)只能下载全部读的文件,也就是所有者、所属组和其他人都有读权限的文件才能下载
anon_upload_enable=YES 匿名上传,注意:文件系统权限,也就是匿名上传文件的时候除了要开启这个配置外,还要保证上传的目录对于ftp用户具有写权限才可以
注意:匿名账号登录后默认是在ftp这个系统账号的家目录里,也就是/var/ftp目录下,但这个目录不能对ftp这个用户具有写权限,否则匿名账号会登录不了,可以在这个目录下创建一个子目录,使ftp用户对这个子目录具有写权限,这样就可以上传文件了,也就是说匿名账号登录时根目录不能有写权限
anon_mkdir_write_enable=YES 可以创建文件
anon_other_write_enable=YES 可删除和修改上传的文件
anon_umask=077 指定匿名上传umask
指定上传文件的默认的所有者和权限
chown_uploads=YES(默认NO)
chown_username=wang
chown_upload_mode=0644
6、Linux系统用户
guest_enable=YES 所有系统和虚拟用户都映射成一个指定的系统用户
guest_username=ftp 配合上面选项才生效,指定为ftp用户,并且禁锢在自己的家目录里,不能切换到其他的目录,这样比较安全,不设置这一项时,普通用户登录后可以切换到其他目录
local_enable=YES 是否允许linux用户登录
write_enable=YES 允许linux用户上传文件,注释掉相当于默认,默认为no
local_umask=022 指定系统用户上传文件的默认权限
local_root=/ftproot非匿名用户登录后所在目录,但可以切换目录,只是映射成一个目录
注意:把系统账号的shell类型设置为/sbin/nologin后仍然可以登录ftp服务器,但不可以登录ssh服务器
7、禁锢所有系统用户在家目录中
chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户
8、禁锢或不禁锢特定的系统用户在家目录中
chroot_list_enable=YES 
chroot_list_file=/etc/vsftpd/chroot_list
当chroot_local_user=YES时,则/etc/vsftpd/chroot_list中用户不禁锢,和上面的正好相反
当chroot_local_user=NO时,则chroot_list中用户禁锢
9、wu-ftp日志:默认启用
xferlog_enable=YES (默认)启用记录上传下载日志
xferlog_std_format=YES (默认)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog(默认)/var/log/xferlog这个文件不用创建,可自动生成
10、vsftpd日志:默认不启用
dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log(默认)可自动生成
11、登录提示信息
ftpd_banner="welcometo mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt 一旦/etc/vsftpd/ftpbanner.txt文件里规定了登录提示信息,比如提示信息比较多时可以放到这个文件里,优先上面项生效
12、目录访问提示信息
dirmessage_enable=YES (默认)
message_file=.message(默认) 在要设置的目录下创建一个.message文件,文件里面写明提示信息就可以了
13、使用pam(Pluggable Authentication Modules)完成用户认证
pam_service_name=vsftpd ---在vsftpd的配置文件中规定了pam的配置文件的名字是vsftpd,pam配置文件为/etc/pam.d/vsftpd,vsftpd服务就会根据配置文件中的设置找到pam的配置文件,pam配置文件中规定了认证调用的模块,模块在/lib64/security目录下。
/etc/vsftpd/ftpusers ----默认在这个文件中的用户拒绝登录,默认root用户拒绝登录的
14、是否启用控制用户登录的列表文件
userlist_enable=YES 默认有此设置
userlist_deny=YES(默认值)如果是yes,相当于黑名单,都不给输入口令的机会,NO为白名单
userlist_file=/etc/vsftpd/users_list此为默认值
备注:根据13和14中的设置,发现使用/etc/vsftpd/ftpusers和/etc/vsftpd/users_list两个文件都可以定义黑名单和白名单,并且默认root是无法登陆的。
15、连接限制
max_clients=0 最大并发连接数,0表示不限制
max_per_ip=0 相同的ip地址同时发起的最大连接数
16、vsftpd服务指定用户身份运行
nopriv_user=nobody 指定以谁的身份运行vsftpd服务
17、传输速率:字节/秒
anon_max_rate=0 匿名用户的最大传输速率
local_max_rate=0 本地用户的最大传输速率
1024字节为1KB,1024位为1kb
18、连接时间:秒为单位
connect_timeout=60 主动模式数据连接超时时长
accept_timeout=60 被动模式数据连接超时时长
data_connection_timeout=300 数据连接无数据输超时时长
idle_session_timeout=60 无命令操作超时时长
优先以文本方式传输
ascii_upload_enable=YES
ascii_download_enable=YES
最好不要用这种方式,会丢数据,最好是以二进制方式传输数据,比如windos上的文本文件如果以文件方式上传给ftp服务器,则会自动将windows格式转换为linux格式,也可以用这个特性实现linux和windows格式互转

总结:一个服务要想使用一个pam模块,首先要在它的配置文件中规定pam配置文件的名字,也就是在/etc/pam.d目录下有一个文件,这个文件的名字要和服务的配置文件中的名字对上,这样服务才能找到pam的配置文件,根据pam配置文件中的设置调用相应的pam模块,pam模块在/lib64/security目录下
注意:匿名账号登录时,根目录不允许对ftp用户具有写权限,如果想上传,可以在根目录下创建一个子目录,对这个子目录授权对ftp用户具有写权限。

7、在centos6.9上配置FTP服务以非独立服务方运行

1、安装xinetd服务
yum install telnet-server  ---安装telnet服务的时会依赖于xinetd服务,所以会把xinetd服务一起安装了
2、修改vsftpd的配置文件
vim /etc/vsftpd/vsftpd.conf 
listen=NO    --关闭监听
3、创建xinetd的配置文件来管理vsftpd服务
cd /etc/xinetd.d/
cp telnet vsftpd
vim vsftpd
# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service ftp     ---注意这里是个坑,不能写成vsftpd,否则实现不了
{
        flags           = REUSE
        socket_type     = stream    
        wait            = no
        user            = root
        server          = /usr/sbin/vsftpd   ---主程序文件
        log_on_failure  += USERID
        disable         = no    ---将yes改为no,表示启用
}
4、启动xinetd服务
service xinetd restart 
ss -ntlp

8、实现基于SSL的FTPS

查看vsftpd服务是否支持SSL
ldd `which vsftpd` 查看到libssl.so
1、创建自签名证书
cd /etc/pki/tls/certs/
make vsftpd.pem
openssl x509 -in vsftpd.pem -noout -text   ---可以查看一下这个证书
mv vsftpd.pem /etc/vsftpd/   ---最好把这个证书放到vsftpd的配置文件中,但不移动也可以,只要在配置文件中规定好就可以
2、修改vsftpd的配置文件
vim /etc/vsftpd/vsftpd.conf 
ssl_enable=YES
allow_anon_ssl=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/vsftpd/vsftpd.pem
这里一定要注意,配置文件中每一行的开头和结尾处都不能有任何空格,否则服务会启动不了,做实验的时候因为这个耽误了好长时间
systemctl restart vsftpd
3、用filezilla等工具测试如下图
image.png

image.png

9、vsftpd虚拟用户

虚拟用户:所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录,也就是说所有的虚拟用户最后都会被映射成为一个系统账号,通过这个系统账号来访问磁盘文件,虚拟用户访问的共享位置为系统账号的家目录。
各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
虚拟用户帐号的存储方式:
①Berkeley DB格式的数据库中

文件:编辑文本文件vusers.txt,此文件需要被编码为hash格式
奇数行为用户名,偶数行为密码
通过下面命令将这个文本文件转化为Berkeley DB格式,注意转化后的文件后缀必须为.db
db_load -T -t hash -f vusers.txt vusers.db

②关系型数据库的表中
实时查询数据库完成用户认证
mysql库:pam要依赖于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README

10、实现基于DB的FTP虚拟用户

此方式是将虚拟用户的账号和密码存放在Berkeley DB格式的数据库文件中。
实现步骤如下:

1、创建Berkeley DB格式的数据库文件
vim /etc/vsftpd/vusers.txt   ---奇数行为用户名,偶数行为密码
ftp1
centos
ftp2
centos
cd /etc/vsftpd/
db_load -T -t hash -f vusers.txt vusers.db   ---生成db格式的数据库文件
chmod 600 vusers.db    ---为了安全修改一下权限
2、创建一个系统账号,用于代替虚拟账号去访问磁盘的资源
useradd -d /var/ftpvuser -s /sbin/nologin ftpvuser
getent passwd ftpvuser
chmod 555 /var/ftpvuser/   ---匿名登录和虚拟用户登录的根目录不能具有写权限
mkdir /var/ftpvuser/upload
setfacl -m u:ftpvuser:rwx /var/ftpvuser/upload/
3、修改vsftpd的配置文件
vim /etc/vsftpd/vsftpd.conf 
pam_service_name=vsftpd.vusers   ---指明pam配置文件,不用写/etc/pam.d,会自动找到这个目录,pam配置文件都是在这个目录下
guest_enable=YES
guest_username=ftpvuser  ---设置将所有虚拟用户映射成一个系统账号
user_config_dir=/etc/vsftpd/vusers.d/   ---指明虚拟用户的配置文件的目录
4、创建pam配置文件
vim /etc/pam.d/vsftpd.vusers
auth required pam_userdb.so db=/etc/vsftpd/vusers   ---调用pam_userdb.so这个模块,并指明db数据库文件的路径,注意这里不写vusers.db,直接简写成 vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
5、SELinux设置
禁用SELinux或者setsebool-P ftpd_full_access1
6、 建立虚拟用户各自的配置文件
cd /etc/vsftpd/vusers.d/
vim ftp1  ---注意配置文件的名字要和虚拟用户的名字对应
anon_upload_enable=YES    ---设置具有上传权限
anon_mkdir_write_enable=YES  ---设置具有创建文件的权限
vim ftp2
local_root=/app/ftp2   ---更改根目录
anon_upload_enable=YES  
anon_mkdir_write_enable=YES
7、准备ftp2的目录
mkdir -p /app/ftp2/upload
chown ftpvuser /app/ftp2/upload  ---使虚拟用户映射后的系统用户对这个目录具有写权限,因为是这个系统用户代替虚拟用户去访问磁盘上资源,可以设置acl权限
8、测试
在另外一台主机上做为客户端访问 ftp 172.18.21.106
通过登录虚拟账号的用户名和密码来登录到服务器上访问响应的资源

总结:vsftpd服务和httpd服务相似,匿名账号访问的时候都会映射为服务器的一个系统账号,vsftpd映射为ftp用户,httpd映射为apache用户,通过系统账号才能访问自己磁盘上的资源,如果无法访问可能是文件系统的权限限制ftp或者apache用户去访问,或者配置文件中的限制。

11、实现基于MYSQL验证的vsftpd虚拟用户

环境:两台centos7主机,一台ftp服务器,一台mysql服务器
1 、在ftp服务器
yum groupinstall "development tools"
yum install vsftpd mariadb-devel pam-devel openssl-devel mariadb
2 、在ftp服务器编译pam_mysql
tar xvf pam_mysql-0.7RC1.tar.gz 
cd pam_mysql-0.7RC1/
./configure --with-mysql=/usr --with-pam=/usr  --with-pam-mods-dir=/lib64/security
/lib64/security/pam_mysql.so
3、 在ftp服务器,准备虚拟用户映射的系统用户
useradd -s /sbin/nologin -d /app/ftpsite ftpvuser 
chmod 555 /app/ftpsite/
cd /app/ftpsite/
mkdir upload
chown ftpvuser upload
4、 在mysql 服务器,准备用户和数据表
yum install mariadb-server
systemctl start mariadb
mysql 
>create database ftpdb; --创建数据库
>create table ftpvusers (id int unsigned  auto_increment primary key,username char(30),password char(48));   ---创建表
>insert ftpvusers (username,password) values ('ftpuser1',password('centos')),('ftpuser2',password('centos'));    ---在表中插入用户名和密码,将来为ftp服务用的虚拟用户的账号和密码
>grant all on ftpdb.* to ftpuser@'192.168.25.107' identified by 'centos';   ---授权一个远程的用户去管理这个数据库
5 、在ftp服务器上创建PAM配置文件
vim /etc/pam.d/ftp.mysql
auth required pam_mysql.so user=ftpuser passwd=centos host=192.168.25.108 db=ftpdb table=ftpvusers usercolumn=username passwdcolumn=password crypt=2
account required pam_mysql.so user=ftpuser passwd=centos host=192.168.25.108 db=ftpdb table=ftpvusers usercolumn=username passwdcolumn=password crypt=2
注:crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示使用mysql password()函数加密,3表示md5加密,4表示sha1加密
•auth 表示认证
•account 验证账号密码正常使用
•required 表示认证要通过
•pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
•user=vsftpd为登录mysql的用户
•passwd=magedu 登录mysql的的密码
•host=mysqlserver mysql服务器的主机名或ip地址
•db=vsftpd 指定连接msyql的数据库名称
•table=users 指定连接数据库中的表名
•usercolumn=name 当做用户名的字段
•passwdcolumn=password 当做用户名字段的密码
•crypt=2 密码的加密方式为mysql password()函数加密
6、 vim /etc/vsftpd/vsftpd.conf
pam_service_name=ftp.mysql  ---指明pam的配置文件
guest_enable=YES
guest_username=ftpvuser   ---将虚拟用户映射为一个系统账号
user_config_dir=/etc/vsftpd/vusers.conf.d/  ---指明每个虚拟用户的配置的目录
7、 mkdir /etc/vsftpd/vusers.conf.d/
vim /etc/vsftpd/vusers.conf.d/ftpuser1   ---创建每个虚拟用户的配置文件
anon_upload_enable=YES
vim /etc/vsftpd/vusers.conf.d/ftpuser2
local_root=/app/ftpsite2/   ---改变虚拟用户的根目录
anon_upload_enable=YES
mkdir -pv /app/ftpsite2/upload   ---创建这个根目录
chown ftpvuser /app/ftpsite2/upload   ---使系统账号对这个目录有控制权限
备注:如果Selinux是开启的,相关设置在FTP服务器上执行
restorecon -R /lib64/security   ---从seliux数据库中恢复这个目录的安全上下文
setsebool -P ftpd_connect_db 1  
setsebool -P ftp_home_dir 1   ---设置bool值,此项在centos7中没有,centos7中只有上面那一项
chcon -R -t public_content_rw_t /app/ftpsite  ---改变根目录的安全标签

12、Axel:网络客户端工具

下载安装axel,在centos6中yum源里面是没有的,可以在ftp共享里面下载,因为是rpm包,所以直接用yum安装即可
ftp://172.16.0.1/pub/Sources/6.x86_64/axel/axel-2.4-1.el6.rf.x86_64.rpm
centos7中直接yum安装即可

axel -n 3 -o /root ftp://172.18.0.1/pub/ISOs/CentOS-7-x86_64-Everything-1511.iso  -n 3表示并行三个连接同时下载,-o指定下载到哪个目录下

你可能感兴趣的:(2018-07-05 网络文件共享1 FTP服务)