一、NAS简介
网络连接存储(Network Attached Storage): 通过局域网在多个文件服务器之间实现了互联,基于文件的协议( FTP、NFS、SMB/CIFS等 ),实现文件共享。
特性:
- 集中管理数据,从而释放带宽、提高性能
- 可提供跨平台文件共享功能
- 可靠性较差,适用于局域网或较小的网络
1.1 FTP服务介绍
FTP(File Transfer Protocol):文件传输协议。基于C/S结构,采用数据和命令连接双通道协议,数据传输方式可选择二进制(默认)和文本。
两种模式:服务器角度
主动(PORT style):服务器主动连接
命令(控制):客户端:随机port ---服务器:tcp21
数据:客户端:随机port---服务器:tcp20
被动(PASV style):客户端主动连接
命令(控制):客户端:随机port ---服务器:tcp21
数据:客户端:随机port ---服务器:随机port
服务器被动模式数据端口计算方式示例:
227 Entering Passive Mode (172,16,0,1,224,59)
服务器数据端口为:224*256+59=57,403
状态码:
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
1.1.1 FTP软件
服务器:
Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器,具备高速,稳定的特点,下载速度是WU-FTP的两倍
ftp.redhat.com 数据传输单机最多可支持15000个并发
客户端:
ftp,lftp,lftpget,wget,curl
示例:
ftp -A ftpserver port -A主动模式 -p 被动模式
lftp –u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file
filezilla,CuteFtp,FlashFXP,LeapFtp
IE ftp://username:password@ftpserver
1.1.2 vsftpd 服务配置
主配置文件:/etc/vsftpd/vsftpd.conf
帮助文档:man 5 vsftpd.conf
格式:option=value
注:= 前后不能有空格
- 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
- 系统用户共享文件位置:用户家目录
- 虚拟用户共享文件位置:为其映射的系统用户的家目录
虚拟用户:
所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
虚拟用户帐号的存储方式:
文件:编辑文本文件,此文件需要被编码为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
示例:实现基于MYSQL验证的vsftpd虚拟用户访问
使用1台主机FTP + MySQL实现:
1、关系型数据库及验证模块安装配置
yum -y install mariadb mariadb-server ##安装MySQL
systemctl start mariadb ##启动服务
mysql -uroot -p ##连接数据库
create database vsftpd; ##创建数据库
use vsftpd
CREATE TABLE users ( ##创建表结构
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL
);
insert users (name,password) value('ftpuser1',password('000000')); ##插入数据创建虚拟用户
grant select on vsftpd.users to vsftpd@'localhost' identified by '000000'; ##赋予vsftpd用户具备查询权限
##编译安装pam_mysql
tar zxvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
yum install gcc gcc-c++ pam-devel mariadb-devel ##安装依赖软件包
./configure --with-pam-mods-dir=/lib64/security/
make && make install
2、FTP服务安装配置
yum install vsftpd ##安装vsftpd软件
vi /etc/pam.d/vsftpd.mysql ##编辑pam模块配置文件,添加如下内容
auth required pam_mysql.so user=vsftpd passwd=000000 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=000000 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
useradd -d /data/ftproot -s /sbin/nologin vuser ##创建虚拟用户映射的系统账号
mkdir -pv /data/ftproot/upload ##创建默认登陆目录
chmod 555 /data/ftproot ##赋予相应权限
setfacl -m u:vuser:rwx /data/ftproot/upload ##设置基于账号的访问控制权限
vim /etc/vsftpd/vsftpd.conf ##编辑主配置文件,追加如下内容
pam_service_name=vsftpd.mysql ##指定pam模块服务文件
guest_enable=YES
guest_username=vuser
user_config_dir=/etc/vsftpd/vusers.d/ ##定义用户配置文件目录
mkdir /etc/vsftpd/vusers.d/
vi /etc/vsftpd/vusers.d/ftpuser1 ##添加如下内容
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
systemctl restart vsftpd ##重启服务,使其更改生效
3、测试
[root@localhost ~]# ftp localhost
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.2)
Name (localhost:root): ftpuser1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> cd upload
250 Directory successfully changed.
ftp> dir
229 Entering Extended Passive Mode (|||25687|).
150 Here comes the directory listing.
-rw------- 1 1007 1007 7946 Aug 15 03:12 config.h
-rw------- 1 1007 1007 156 Aug 15 01:10 yesorno.sh
226 Directory send OK.
ftp> put b.sh
local: b.sh remote: b.sh
229 Entering Extended Passive Mode (|||10424|).
150 Ok to send data.
226 Transfer complete.
10 bytes sent in 0.0216 secs (0.46 Kbytes/sec)
ftp> dir
229 Entering Extended Passive Mode (|||7318|).
150 Here comes the directory listing.
-rw------- 1 1007 1007 10 Aug 23 12:56 b.sh
-rw------- 1 1007 1007 7946 Aug 15 03:12 config.h
-rw------- 1 1007 1007 156 Aug 15 01:10 yesorno.sh
226 Directory send OK.
ftp
从以上输出结果可以发现,基于MySQL虚拟用户vsftpd虚拟用户连接测试正常
1.2 NFS服务介绍
NFS(Network File System )网络文件系统,基于内核的文件系统。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure Call Protocol远程过程调用)实现。
RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
特点:
- 节省本地存储空间
- 将常用的数据,如home目录,存放在NFS服务器上且可以通过网络访问,本地终端将可减少自身存储空间的使用
1.2.1 NFS工作原理
1.2.2 NFS 服务配置
NFS服务主要进程:
rpc.nfsd 最主要的NFS进程,管理客户端是否可登录
rpc.mountd 挂载和卸载NFS文件系统,包括权限管理
rpc.lockd 非必要,管理文件锁,避免同时写出错
rpc.statd 非必要,检查文件一致性,可修复文件
通信端口:2049(nfsd), 其它端口由portmap(111)分配
主配置文件:/etc/exports
语法:
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)
主机格式:
- 单个主机:ipv4,ipv6,FQDN
- IP networks:两种掩码格式均支持
172.18.0.0/255.255.0.0
172.18.0.0/16 - wildcards:主机名通配,例如*.magedu.com,IP不支持
- netgroups:NIS域的主机组,@group_name
- anonymous:表示使用*通配所有客户端
相关的权限和选项:
- 默认选项:(ro,sync,root_squash,no_all_squash)
- ro,rw 只读和读写
- async 异步,数据变化后不立即写磁盘,性能高
- sync(1.0.0后为默认)同步,数据在请求时立即写入共享
- no_all_squash (默认)保留共享文件的UID和GID
- all_squash 所有远程用户(包括root)都变成nfsnobody
- root_squash (默认)远程root映射为nfsnobody,UID为65534,早期版本是4294967294 (nfsnobody)
- no_root_squash 远程root映射成root用户
- anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非nfsnobody,可配合all_squash使用
示例:通过NFS实现服务器/www共享访问
通过2台主机实现,一台作为NFS服务端,另外一台作为NFS客户端
NFS服务端:
vi /etc/exports ##编辑导出配置文件,添加如下内容
/data/nfsshare *(rw,all_squash)
mkdir /data/nfsshare ##创建共享文件夹
setfacl -m u:nfsnobody:rwx /data/nfsshare ##为nfsnobody匿名用户设置相应访问控制权限
exportfs -arv ##重新加载配置文件并输出本机所有共享
NFS客户端:
showmount -e 172.16.77.132 ##查看远程主机共享的目录
Export list for localhost:
/home/user1 *
mount.nfs 172.16.77.132:/data/nfsshare /www ##挂载远程主机共享的目录
[root@localhost ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
……
172.16.77.132:/data/nfsshare nfs4 18G 14G 4.4G 76% /www
测试:
touch /www/index.html ##在客户端主机上测试能否在共享目录创建文件
ls -l /www
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug 23 21:30 index.html
1.3 SMB服务介绍
SMB(Server Message Block服务器消息块),IBM发布,最早是DOS网络文件共享协议。CIFS(common internet file system),微软基于SMB发布。
功能:
- 共享文件和打印服务,实现在线编辑
- 实现登录SAMBA用户的身份认证
- 可以进行NetBIOS名称解析
- 外围设备共享
1.3.1 SMB软件
SAMBA:1991年Andrew Tridgell,实现windows和UNIX相通。
计算机网络管理模式:
工作组WORKGROUP:计算机对等关系,帐号信息各自管理
域DOMAIN:C/S结构,帐号信息集中管理,DC,AD
1.3.2 SMB 服务配置
smbd:提供smb(cifs)服务 TCP:139,445
nmbd:NetBIOS名称解析 UDP:137,138
示例:配置samba共享,实现/www目录共享
通过2台主机实现,一台作为NFS服务端,另外一台作为NFS客户端
NFS服务端:
yum -y install samba ##安装基本组件包
vi /etc/samba/smb.conf ##编辑主配置文件,追加如下内容
[www]
comment = www
path = /data/wwwshare
writeable = yes
public = yes
mkdir /data/wwwshare ##创建共享目录
useradd -s /sbin/nologin smbuser2 ##创建普通账号
smbpasswd -a smbuser2 ##创建SMB访问用户
New SMB password:
Retype new SMB password:
systemctl restart smb ##重启服务,使其更改生效
NFS客户端:
yum -y install samba-client cifs-utils ##安装客户端工具包
smbclient -L 172.16.77.132 ##匿名访问SMB服务器,无需输入密码。直接按下回车键
Enter WOAKGROUP\root's password:
Anonymous login successful
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
share Disk public share
www Disk www
IPC$ IPC IPC Service (Samba 4.9.1)
Reconnecting with SMB1 for workgroup listing.
Anonymous login successful
Server Comment
--------- -------
Workgroup Master
--------- -------
SAMBA LOCALHOST
mkdir /www ##创建SMB共享挂载点
mount.cifs -o username=smbuser2,password=000000 //172.16.77.132/www /www ##挂载SMB共享目录
df -hT
Filesystem Type Size Used Avail Use% Mounted on
……
//172.16.77.132/www cifs 18G 14G 4.3G 76% /www
touch /www/index.html ##在客户端主机上测试能否在共享目录创建文件
ls -l /www
total 0
-rwxr-xr-x. 1 root root 0 Aug 23 22:07 index.html
1.4 数据同步工具介绍
rsync:基于ssh和rsh服务实现高效率的远程系统之间复制文件
inotify:异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件。相关软件:inotify-tools,sersync,lrsyncd
1.4.1 文件监控服务工具
inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
inotifywait常见选项:
-m, --monitor 始终保持事件监听
-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive 递归监控目录数据信息变化
-q, --quiet 输出少量事件信息
--exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
--excludei <pattern> 和exclude相似,不区分大小写
-o, --outfile <file>打印事件到文件中,相当于标准正确输出
-s, --syslogOutput 发送错误到syslog相当于标准错误输出
--timefmt <fmt> 指定时间输出格式
--format <fmt> 指定的输出格式;即实际监控输出内容
-e 指定监听指定的事件,如果省略,表示所有事件都进行监听
--timefmt <fmt>时间格式,参考 man 3 strftime
- %Y 年份信息,包含世纪信息
- %y 年份信息,不包括世纪信息
- %m 显示月份,范围 01-12
- %d 每月的第几天,范围是 01-31
- %H 小时信息,使用 24小时制,范围 00-23
- %M 分钟,范围 00-59
例如:--timefmt "%Y-%m-%d %H:%M"
--format <fmt> 格式定义
- %T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
- %w 事件出现时,监控文件或目录的名称信息
- %f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
- %e 显示发生的事件信息,不同的事件默认用逗号分隔
- %Xe显示发生的事件信息,不同的事件指定用X进行分隔
例:
--format "%T %w%f event: %;e"
--format '%T %w %f'
-e 选项指定的事件类型
- create 文件或目录创建
- delete 文件或目录被删除
- modify 文件或目录内容被写入
- attrib 文件或目录属性改变
- close_write 文件或目录关闭,在写入模式打开之后关闭的
- close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
- close 文件或目录关闭,不管读或是写模式
- open 文件或目录被打开
- moved_to 文件或目录被移动到监控的目录中
- moved_from 文件或目录从监控的目录中被移动
- move 文件或目录不管移动到或是移出监控目录都触发事件
- access 文件或目录内容被读取
- delete_self 文件或目录被删除,目录本身被删除
- unmount 取消挂载
例: -e create,delete,moved_to,close_write, attrib
1.3.2 数据实时同步
实现实时同步思路
1、要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
2、发现目录中数据产生变化,利用rsync服务推送到备份服务器上
3、利用脚本进行结合实现实时同步方法
inotify+rsync 方式实现数据同步
示例:使用rsync+inotify实现/www目录实时同步
通过2台主机实现,一台作为同步服务器,另外一台作为同步客户端
同步服务器:
vi /etc/rsyncd.conf ## 编辑rsync 服务器端主配置文件,添加或修改如下内容
uid = root
gid = root
use chroot = no
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
hosts allow = 172.16.77.0/24 ##允许同步连接的主机列表
[www]
path = /www
comment = backup
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pass ##指定验证文件
echo "rsyncuser:bza" > /etc/rsync.pass ##生成验证文件
chmod 600 /etc/rsync.pass
mkdir /www ##创建同步目录
systemctl start rsyncd ##启动服务,使更改生效
同步客户端:
yum -y install inotify-tools ##安装监控服务工具包
echo "bza" > /etc/rsync.pass ##生成密码文件
chmod 600 /etc/rsync.pass
vi /etc/inotify_rsync.sh ##创建实时同步脚本,添加如下内容
#!/bin/bash
SRC='/data/nfsshare'
DEST='rsyncuser@172.16.77.132::www'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -az --delete --password-file=/etc/rsync.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
chmod +x inotify_rsync.sh ##赋予可执行权限
二、iptables介绍
核心:Netfilter组件
位于内核空间,集成在linux内核中,扩展各种网络服务的结构化底层框架
实现原理:内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上。
三种报文流向:
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
2.1 iptables 基本结构
五个表table:
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
五个内置链chain:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
2.2 iptables 工作过程
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
如果数据包就是进入本机的,数据包就会向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
2.3 iptables 规则
2.3.1 iptables 规则组成
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
扩展匹配:通过复杂高级功能匹配
处理动作:称为target,跳转目标
内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...
自定义处理动作:
自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效;添加在自定义上不会自动生效
链chain:
内置链:每个内置链对应于一个钩子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效
iptables规则注意事项
- 要实现哪种功能:判断添加在哪张表上
- 报文流经的路径:判断添加在哪个链上
- 报文的流向:判断源和目的
- 匹配规则:业务需要
2.3.1 iptables 命令
语法:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
选项:
-t table: 指定表名
raw, mangle, nat, filter(默认)
-P:设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT 接受
DROP 丢弃
-s:指定源IP地址或范围
-p, --protocol protocol:指定协议,可使用数字如0(all),可使用如下:
tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh
--dport:指定目标服务端口,可设置范围:
port[:port]
-j:处理动作,可使用如下:
ACCEPT(允许),DROP(丢弃),REJECT(拒绝),RETURN(返回调用链),REDIRECT(端口重定向),LOG(记录日志),MARK(做防火墙标记),DNAT(目标地址转换),SNAT(源地址转换),MASQUERADE(地址伪装)
-L:list, 列出指定链的所有规则,本选项须置后
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息
--line-numbers:显示规则的序号
2.3.2 iptables 常见扩展
multiport扩展:以离散方式定义多端口匹配,最多指定15个端口
格式:--dports port[,port|,port:port]... 指定多个目标端口
iprange扩展:指明连续但一般不是整个网络的ip地址范围
格式:--src-range from[-to] 源IP地址范围
state扩展:根据“连接追踪机制”去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系
- 状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
示例:放行telnet, ftp, web服务,放行samba服务,其他端口服务全部拒绝
modprobe nf_conntrack_ftp ##装载ftp连接追踪的专用模块
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m multiport --dports 21,23,80,139,445 -j ACCEPT
iptables -A INPUT -j REJECT
iptables -nL ##查看入站规则列表
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 21,23,80,139,445
REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable