DAS:Direct Attached Storage
# 接口类型:“block”,只有块接口能分区和格式化,挂载使用
# 设备:SATA,SAS;IDE,SCSI;USB
NAS:Network Attached Storage
# 接口类型:"file"
# 协议:CIFS(samba), NFS(Network File System)
# RPC: Remote Procedure Call(重要概念)
SAN:Storage Area Network
# 接口类型:"block"
# 协议:iSCSI(IP-SAN), FCSAN, FCoE, ...
应用层:
# ftp, ...
直接存储时,存储设备与主机的紧密相连。
通过局域网在多个文件服务器之间实现了互联,基于文件的协议( FTP、NFS、SMB/CIFS等 ),实现文件共享。
利用高速的光纤网络链接服务器与存储设备,基于SCSI,IP,ATM等多种高级协议,实现存储共享。
简单来说就是文件或存储块设备可以共享给大家使用。
ftp:file transfer protocol
,文件传输协议。
Server: 20/tcp连接客户端的命令连接使用的端口向后的第一个可用端口
命令连接 # 客户端:随机port ---> 服务器:tcp21
数据连接 # 客户端:随机port <--- 服务器:tcp20
主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始 监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
Server:打开一个随机端口,并等待客户端连接
# Server 通过 21 号端口告诉客户端,服务器端打开另外一个端口,你可以来进行连接,进行数据传输
命令连接 # 客户端:随机port ---> 服务器:tcp21
数据连接 # 客户端:随机port ---> 服务器:随机port
被动访问示例:
# 服务器会传递两个数字给客户端,可通过计算得出其服务器端口:
227 Entering Passive Mode (172,16,0,1,224,59)
# 服务器数据端口为:
224*256+59
示例:
03:16:54.409764 IP 172.16.141.252.21 > 172.16.141.99.63582: Flags [P.], seq 354:407, ack 97, win 227, options [nop,nop,TS val 610401588 ecr 2070474], length 53: FTP: 227 Entering Passive Mode (172,16,141,252,169,111).
0x0000: 28d2 4470 abbe e43a 6e0a 9b88 0800 4500 (.Dp...:n.....E.
0x0010: 0069 ec34 4000 4006 dad9 ac10 8dfc ac10 .i.4@.@.........
0x0020: 8d63 0015 f85e 8edd 20b0 83b5 cea2 8018 .c...^..........
0x0030: 00e3 5c9b 0000 0101 080a 2461 fd34 001f ..\.......$a.4..
0x0040: 97ca 3232 3720 456e 7465 7269 6e67 2050 ..227.Entering.P
0x0050: 6173 7369 7665 204d 6f64 6520 2831 3732 assive.Mode.(172
0x0060: 2c31 362c 3134 312c 3235 322c 3136 392c ,16,141,252,169,
0x0070: 3131 3129 2e0d 0a 111)...
[root@neo vsftpd]# ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 248 172.16.141.252:ssh 172.16.141.99:55025
ESTAB 0 0 ::ffff:172.16.141.252:ftp ::ffff:172.16.141.189:50701
ESTAB 0 0 ::ffff:172.16.141.252:ftp ::ffff:172.16.141.99:64168
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
PAM:Pluggable Authenticate Module
插入式认证模块,大多数应用程序都能来调用PAM实现认证。
此模块是认证框架,是库,高度模块化。
PAM的一些信息查看:
[root@neo ~]# rpm -ql pam | less
[root@neo ~]# ls /etc/pam.d/
chfn fingerprint-auth passwd postlogin runuser-l smtp.postfix sudo-i systemd-user
chsh fingerprint-auth-ac password-auth postlogin-ac smartcard-auth sshd su-l vlock
config-util login password-auth-ac remote smartcard-auth-ac su system-auth
crond other polkit-1 runuser smtp sudo system-auth-ac
[root@neo ~]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
[root@neo ~]# which login
/usr/bin/login
[root@neo ~]# rpm -qf /usr/bin/login
util-linux-2.23.2-59.el7.x86_64
[root@neo ~]# rpm -ql pam | less
Serv-U, IIS, Filezilla
wuftpd, proftpd, pureftpd, vsftpd(Very Secure FTP daemon), ...
# Very Secure FTP Daemon,CentOS默认FTP服务器
# 高速,稳定,下载速度是WU-FTP的两倍
# ftp.redhat.com,数据:单机最多可支持15000个并发
ftp, Filezilla, CuteFTP, FlashFXP, ...
lftp, ftp, Filezilla, gftp, ...
# ftp,lftp,lftpget,wget,curl
# 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
vsftpd is a Very Secure FTP daemon. It was written completely from scratch.
SCHEME://username:password@HOST:PORT/PATH/TO/FILE
路径映射:用户家目录,每个用户的URL的 / 映射到当前用户的家目录
vsftpd以ftp用户的身份运行进程,默认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp
(ftp, anonymous
)
安装完 vsftpd 后# yum -y install vsftpd
,可直接进行 ftp 访问。
一个用户通过文件共享服务访问文件系统上的文件的生效权限为此二者的交集。首先确认文件系统上对文件或目录的权限,再确认共享的权限。
以下三种方法都可以对安装情况进行查看:
[root@neo ~]# rpm -q vsftpd
vsftpd-3.0.2-25.el7.x86_64
[root@neo ~]# vsftpd -v
vsftpd: version 3.0.2
[root@neo ~]# yum info vsftpd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.bit.edu.cn
* extras: mirror.bit.edu.cn
* updates: mirror.lzu.edu.cn
Installed Packages
Name : vsftpd
Arch : x86_64
Version : 3.0.2
Release : 25.el7
Size : 353 k
Repo : installed
From repo : base
Summary : Very Secure Ftp Daemon
URL : https://security.appspot.com/vsftpd.html
License : GPLv2 with exceptions
Description : vsftpd is a Very Secure FTP daemon. It was written completely from
: scratch.
安装:
[root@neo ~]# yum -y install vsftpd
启动:
[root@neo ~]# systemctl start vsftpd.service
[root@neo ~]# systemctl status vsftpd.service
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2019-08-13 01:31:23 EDT; 4h 51min ago
Process: 10711 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 10712 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─10712 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
Aug 13 01:31:23 neo systemd[1]: Starting Vsftpd ftp daemon...
Aug 13 01:31:23 neo systemd[1]: Started Vsftpd ftp daemon.
查看: 有21监听端口代表 vsftpd 启动成功
[root@neo ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 32 :::21 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
1、直接通过命令进行关闭:
setenforce 0 # 设置SELinux 成为permissive模式 (关闭SELinux)
setenforce 1 # 设置SELinux 成为enforcing模式 (开启SELinux)
2、再或者修改配置文件,重启后依旧生效:
# vim /etc/selinux/config # 修改配置文件
# SELINUX=enforcing # 进行注释
# SELINUXTYPE=targeted # 进行注释
SELINUX=disabled # 增加此条命令
3、通过命令设置 SELinux :
getsebool -a | grep ftp
setsebool -P ftpd_full_access on
1、关闭防火墙:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
2、如果不愿意关闭防火墙,需要防火墙添加FTP服务:
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload
在不进行 vsftpd 配置文件修改的情况,可使用匿名用户登陆,如下:
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
数据根目录:/var/ftp
服务脚本文件: /usr/lib/systemd/system/vsftpd.service
/etc/rc.d/init.d/vsftpd
anonymous --> ftp, /var/ftp
(/var/ftp
属主和属组、读写权限均不能修改,否则无法启动)/etc/vsftpd/ftpusers
,PAM(/etc/pam.d/vsftpd
)/etc/passwd
)用户通过vsftpd服务访问到的默认路径,是用户自己的家目录;默认可以自己有权限访问的所有路径间切换;禁锢用户于其家目录中。
1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类说明 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录
匿名用户:ftp,anonymous
,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd
,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件
nsswitch:network service switch # 名称解析框架
pam:pluggable authentication module # 用户认证
/lib64/security
/etc/pam.d/
/etc/pam.conf
主配置文件:/etc/vsftpd/vsftpd.conf
directive value
# 注意:directive之前不能有多余字符
格式:option=value
# 注意:= 前后不要有空格
# man 5 vsftpd.conf
anonymous_enable=YES # 只有下载权限
anon_upload_enable=YES # 上传权限,仅能上传文件
anon_mkdir_write_enable=YES # 创建目录
anon_other_write_enable=YES # 删除目录/文件
anon_umask=077
详细:
anonymous_enable=YES # 支持匿名用户
no_anon_password=YES # (默认N0),匿名用户略过口令检查
anon_world_readable_only # (默认YES)只能下载全部读的文件
anon_upload_enable=YES # 匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES # 匿名建目录
anon_umask=077 # 指定匿名上传文件的umask,默认077
anon_other_write_enable=YES # 可删除和修改上传的文件
指定上传文件的默认的所有者和权限:
chown_uploads=YES(默认NO)
chown_username=wang
chown_upload_mode=0644
local_enable=YES # 是否允许linux用户登录
write_enable=YES # 允许linux用户上传文件
local_umask=022 # 指定系统用户上传文件的默认权限
guest_enable=YES # 所有系统用户都映射成guest用户
guest_username=ftp # 配合上面选项才生效,指定guest用户
local_root=/ftproot # guest 用户登录所在目录
辅助配置文件/etc/vsftpd/ftpusers
:
列在此文件中的用户 均禁止使用ftp服务
对配置文件进行修改后,都需要进行服务重启才能生效
[root@neo ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
禁锢所有本地用户于其家目录;需要事先去除用户对家目录的写权限:
chroot_local_user=YES(默认NO,不禁锢)
禁锢列表中文件存在的用户于其家目录中;需要事先去除用户对家目录的写权限;(chmod a-w /home/user
)
禁锢在列表中的用户,ftp 登陆后,pwd 只会显示 /
,且切换不到其它目录下,与未禁锢在列表中的用户显示不一样
禁锢或不禁锢特定的系统用户在家目录中
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
当chroot_local_user=YES时,则chroot_list中用户不禁锢
当chroot_local_user=NO时,则chroot_list中用户禁锢
因FTP是明文传输的,通过以下命令可抓取FTP的登陆密码。所以系统用户是禁止用于登陆FTP的。
[root@neo ~]# tcpdump -i enp1s0 -nn -XX tcp port 21
wu-ftp日志:默认启用
xferlog_enable=YES (默认) # 启用记录上传下载日志
xferlog_std_format=YES (默认) # 使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默认) # 可自动生成
vsftpd日志:默认不启用
dual_log_enable=YES # 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log(默认)# 可自动生成
standalone
:独立守护进程;由服务进程自行监听套按字,并接收用户访问请求
transient
:瞬时守护进程;由受托管方代为监听套按字,服务进程没有访问请求时不启动;当托管方收到访问请求时,才启动服务进程
CentOS 6:xinetd独立守护进程, /etc/xinetd.d/
CentOS 7:由systemd代为监听
userlist_enable=YES # 启用/etc/vsftpd/user_list文件来控制可登录用户
userlist_deny=YES # YES:意味着此为黑名单
# NO:白名单
anon_max_rate=0 # 匿名用户的上传下载速率,0代表无限制
local_max_rate=0 # 本地用户的上传下载速率,0代表无限制
max_clients=2000 # 最大并发连接数
max_per_ip=50 # 每个IP同时发起的最大连接数
命令端口
# listen_port=21
主动模式端口
# connect_from_port_20=YES # 主动模式端口为20
# ftp_data_port=20 (默认) # 指定主动模式的端口
被动模式端口范围
linux # 客户端默认使用被动模式
windows # 客户端默认使用主动模式
pasv_min_port=6000 # 0为随机分配
pasv_max_port=6010 # 0为随机分配
使用当地时间
# use_localtime=YES # 使用当地时间(默认为NO,使用GMT)
ftpd_banner=“welcome to mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt # 优先上面项生效
dirmessage_enable=YES (默认)
message_file=.message(默认) # 信息存放在指定目录下.message
nopriv_user=nobody (默认值)
pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers # 默认文件中用户拒绝登录
connect_timeout=60 # 主动模式数据连接超时时长
accept_timeout=60 # 被动模式数据连接超时时长
data_connection_timeout=300 # 数据连接无数据输超时时长
idle_session_timeout=60 # 无命令操作超时时长
ascii_upload_enable=YES
ascii_download_enable=YES
配置FTP服务以非独立服务方运行:
vim /etc/vsftpd/vsftpd.conf/
listen=NO,默认为独立方式
vim /etc/xinetd.d/vsftpd
service ftp
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_failure += USERID
disable = no
}
# ldd `which vsftpd` # 看是否能看到libssl.so
cd /etc/pki/tls/certs/
make vsftpd.pem
openssl x509 -in vsftpd.pem -noout –text
ssl_enable=YES # 启用SSL
allow_anon_ssl=NO # 匿名不支持SSL
force_local_logins_ssl=YES # 本地用户登录加密
force_local_data_ssl=YES # 本地用户数据传输加密
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
文件:编辑文本文件,此文件需要被编码为hash格式(奇数行为用户名,偶数行为密码)
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
ftp> ascii # 设定以ASCII方式传送文件(缺省值)
ftp> bell # 每完成一次文件传送,报警提示
ftp> binary # 设定以二进制方式传送文件
ftp> bye # 终止主机FTP进程,并退出FTP管理方式
ftp> case # 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母
ftp> cd # 同UNIX的CD命令
ftp> cdup # 返回上一级目录
ftp> chmod # 改变远端主机的文件权限
ftp> close # 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除
ftp> delete # 删除远端主机中的文件
ftp> dir [remote-directory] [local-file] # 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件
ftp> get [remote-file] [local-file] # 从远端主机中传送至本地主机中
ftp> help [command] # 输出命令的解释
ftp> lcd # 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录
ftp> ls [remote-directory] [local-file] # 同DIR
ftp> macdef # 定义宏命令
ftp> mdelete [remote-files] # 删除一批文件
ftp> mget [remote-files] # 从远端主机接收一批文件至本地主机
ftp> mkdir directory-name # 在远端主机中建立目录
ftp> mput local-files # 将本地主机中一批文件传送至远端主机
ftp> open host [port] # 重新建立一个新的连接
ftp> prompt # 交互提示模式
ftp> put local-file [remote-file] # 将本地一个文件传送至远端主机中
ftp> pwd # 列出当前远端主机目录
ftp> quit # 同BYE
ftp> recv remote-file [local-file] # 同GET
ftp> rename [from] [to] # 改变远端主机中的文件名
ftp> rmdir directory-name # 删除远端主机中的目录
ftp> send local-file [remote-file] # 同PUT
ftp> status # 显示当前FTP的状态.
ftp> system # 显示远端主机系统类型.
ftp> user user-name [password] [account] # 重新以别的用户名登录远端主机.
ftp> ? [command] # 同HELP. [command]指定需要帮助的命令名称。
# 如果没有指定 command,ftp 将显示全部命令的列表。
ftp> ! # 从 ftp 子系统退出到shell
bye
exit
quit
ftp> get readme.txt # 下载 readme.txt 文件
ftp> mget *.txt # 下载所又以 .txt 结尾的文件
ftp> put /path/readme.txt # 上传 readme.txt 文件
ftp> mput *.txt # 可以上传多个文件