一、NAS簡(jiǎn)介
???????網(wǎng)絡(luò)連接存儲(chǔ)(Network Attached Storage): 通過(guò)局域網(wǎng)在多個(gè)文件服務(wù)器之間實(shí)現(xiàn)了互聯(lián),基于文件的協(xié)議( FTP、NFS、SMB/CIFS等 ),實(shí)現(xiàn)文件共享。
特性:
- 集中管理數(shù)據(jù),從而釋放帶寬、提高性能
- 可提供跨平臺(tái)文件共享功能
- 可靠性較差,適用于局域網(wǎng)或較小的網(wǎng)絡(luò)
1.1 FTP服務(wù)介紹
???????FTP(File Transfer Protocol):文件傳輸協(xié)議?;贑/S結(jié)構(gòu),采用數(shù)據(jù)和命令連接雙通道協(xié)議,數(shù)據(jù)傳輸方式可選擇二進(jìn)制(默認(rèn))和文本。
兩種模式:服務(wù)器角度
主動(dòng)(PORT style):服務(wù)器主動(dòng)連接
命令(控制):客戶端:隨機(jī)port ---服務(wù)器:tcp21
數(shù)據(jù):客戶端:隨機(jī)port---服務(wù)器:tcp20
被動(dòng)(PASV style):客戶端主動(dòng)連接
命令(控制):客戶端:隨機(jī)port ---服務(wù)器:tcp21
數(shù)據(jù):客戶端:隨機(jī)port ---服務(wù)器:隨機(jī)port
服務(wù)器被動(dòng)模式數(shù)據(jù)端口計(jì)算方式示例:
227 Entering Passive Mode (172,16,0,1,224,59)
服務(wù)器數(shù)據(jù)端口為:224*256+59=57,403
狀態(tài)碼:
1XX:信息 125:數(shù)據(jù)連接打開
2XX:成功類狀態(tài) 200:命令OK 230:登錄成功
3XX:補(bǔ)充類 331:用戶名OK
4XX:客戶端錯(cuò)誤 425:不能打開數(shù)據(jù)連接
5XX:服務(wù)器錯(cuò)誤 530:不能登錄
用戶認(rèn)證類型:
匿名用戶:ftp,anonymous,對(duì)應(yīng)Linux用戶ftp
系統(tǒng)用戶:Linux用戶,用戶/etc/passwd,密碼/etc/shadow
虛擬用戶:特定服務(wù)的專用用戶,獨(dú)立的用戶/密碼文件
nsswitch:network service switch 名稱解析框架
pam:pluggable authentication module 用戶認(rèn)證
/lib64/security /etc/pam.d/ /etc/pam.conf
1.1.1 FTP軟件
服務(wù)器:
Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
vsftpd:Very Secure FTP Daemon,CentOS默認(rèn)FTP服務(wù)器,具備高速,穩(wěn)定的特點(diǎn),下載速度是WU-FTP的兩倍
ftp.redhat.com 數(shù)據(jù)傳輸單機(jī)最多可支持15000個(gè)并發(fā)
客戶端:
ftp,lftp,lftpget,wget,curl
示例:
ftp -A ftpserver port -A主動(dòng)模式 -p 被動(dòng)模式
lftp –u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file
filezilla,CuteFtp,F(xiàn)lashFXP,LeapFtp
IE ftp://username:password@ftpserver
1.1.2 vsftpd 服務(wù)配置
主配置文件:/etc/vsftpd/vsftpd.conf
幫助文檔:man 5 vsftpd.conf
格式:option=value
注:= 前后不能有空格
- 匿名用戶(映射為系統(tǒng)用戶ftp )共享文件位置:/var/ftp
- 系統(tǒng)用戶共享文件位置:用戶家目錄
- 虛擬用戶共享文件位置:為其映射的系統(tǒng)用戶的家目錄
虛擬用戶:
所有虛擬用戶會(huì)統(tǒng)一映射為一個(gè)指定的系統(tǒng)帳號(hào):訪問(wèn)共享位置,即為此系統(tǒng)帳號(hào)的家目錄
各虛擬用戶可被賦予不同的訪問(wèn)權(quán)限,通過(guò)匿名用戶的權(quán)限控制參數(shù)進(jìn)行指定
虛擬用戶帳號(hào)的存儲(chǔ)方式:
文件:編輯文本文件,此文件需要被編碼為hash格式
奇數(shù)行為用戶名,偶數(shù)行為密碼
db_load -T -t hash -f vusers.txt vusers.db ##生成數(shù)據(jù)庫(kù)文件
關(guān)系型數(shù)據(jù)庫(kù)中的表:實(shí)時(shí)查詢數(shù)據(jù)庫(kù)完成用戶認(rèn)證
mysql庫(kù):pam要依賴于pam-mysql
庫(kù)文件
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
示例:實(shí)現(xiàn)基于MYSQL驗(yàn)證的vsftpd虛擬用戶訪問(wèn)
使用1臺(tái)主機(jī)FTP + MySQL實(shí)現(xiàn):
1、關(guān)系型數(shù)據(jù)庫(kù)及驗(yàn)證模塊安裝配置
yum -y install mariadb mariadb-server ##安裝MySQL
systemctl start mariadb ##啟動(dòng)服務(wù)
mysql -uroot -p ##連接數(shù)據(jù)庫(kù)
create database vsftpd; ##創(chuàng)建數(shù)據(jù)庫(kù)
use vsftpd
CREATE TABLE users ( ##創(chuàng)建表結(jié)構(gòu)
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')); ##插入數(shù)據(jù)創(chuàng)建虛擬用戶
grant select on vsftpd.users to vsftpd@'localhost' identified by '000000'; ##賦予vsftpd用戶具備查詢權(quán)限
##編譯安裝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服務(wù)安裝配置
yum install vsftpd ##安裝vsftpd軟件
vi /etc/pam.d/vsftpd.mysql ##編輯pam模塊配置文件,添加如下內(nèi)容
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 ##創(chuàng)建虛擬用戶映射的系統(tǒng)賬號(hào)
mkdir -pv /data/ftproot/upload ##創(chuàng)建默認(rèn)登陸目錄
chmod 555 /data/ftproot ##賦予相應(yīng)權(quán)限
setfacl -m u:vuser:rwx /data/ftproot/upload ##設(shè)置基于賬號(hào)的訪問(wèn)控制權(quán)限
vim /etc/vsftpd/vsftpd.conf ##編輯主配置文件,追加如下內(nèi)容
pam_service_name=vsftpd.mysql ##指定pam模塊服務(wù)文件
guest_enable=YES
guest_username=vuser
user_config_dir=/etc/vsftpd/vusers.d/ ##定義用戶配置文件目錄
mkdir /etc/vsftpd/vusers.d/
vi /etc/vsftpd/vusers.d/ftpuser1 ##添加如下內(nèi)容
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
systemctl restart vsftpd ##重啟服務(wù),使其更改生效
3、測(cè)試
[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
從以上輸出結(jié)果可以發(fā)現(xiàn),基于MySQL虛擬用戶vsftpd虛擬用戶連接測(cè)試正常
1.2 NFS服務(wù)介紹
???????NFS(Network File System )網(wǎng)絡(luò)文件系統(tǒng),基于內(nèi)核的文件系統(tǒng)。通過(guò)使用NFS,用戶和程序可以像訪問(wèn)本地文件一樣訪問(wèn)遠(yuǎn)端系統(tǒng)上的文件,基于RPC(Remote Procedure Call Protocol遠(yuǎn)程過(guò)程調(diào)用)實(shí)現(xiàn)。
???????RPC采用C/S模式,客戶機(jī)請(qǐng)求程序調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。
特點(diǎn):
- 節(jié)省本地存儲(chǔ)空間
- 將常用的數(shù)據(jù),如home目錄,存放在NFS服務(wù)器上且可以通過(guò)網(wǎng)絡(luò)訪問(wèn),本地終端將可減少自身存儲(chǔ)空間的使用
1.2.1 NFS工作原理

1.2.2 NFS 服務(wù)配置
NFS服務(wù)主要進(jìn)程:
rpc.nfsd 最主要的NFS進(jìn)程,管理客戶端是否可登錄
rpc.mountd 掛載和卸載NFS文件系統(tǒng),包括權(quán)限管理
rpc.lockd 非必要,管理文件鎖,避免同時(shí)寫出錯(cuò)
rpc.statd 非必要,檢查文件一致性,可修復(fù)文件
通信端口:2049(nfsd), 其它端口由portmap(111)分配
主配置文件:/etc/exports
語(yǔ)法:
/dir 主機(jī)1(opt1,opt2) 主機(jī)2(opt1,opt2)
主機(jī)格式:
- 單個(gè)主機(jī):ipv4,ipv6,F(xiàn)QDN
- IP networks:兩種掩碼格式均支持
172.18.0.0/255.255.0.0
172.18.0.0/16 - wildcards:主機(jī)名通配,例如*.magedu.com,IP不支持
- netgroups:NIS域的主機(jī)組,@group_name
- anonymous:表示使用*通配所有客戶端
相關(guān)的權(quán)限和選項(xiàng):
- 默認(rèn)選項(xiàng):(ro,sync,root_squash,no_all_squash)
- ro,rw 只讀和讀寫
- async 異步,數(shù)據(jù)變化后不立即寫磁盤,性能高
- sync(1.0.0后為默認(rèn))同步,數(shù)據(jù)在請(qǐng)求時(shí)立即寫入共享
- no_all_squash (默認(rèn))保留共享文件的UID和GID
- all_squash 所有遠(yuǎn)程用戶(包括root)都變成nfsnobody
- root_squash (默認(rèn))遠(yuǎn)程root映射為nfsnobody,UID為65534,早期版本是4294967294 (nfsnobody)
- no_root_squash 遠(yuǎn)程root映射成root用戶
- anonuid和anongid 指明匿名用戶映射為特定用戶UID和組GID,而非nfsnobody,可配合all_squash使用
示例:通過(guò)NFS實(shí)現(xiàn)服務(wù)器/www共享訪問(wèn)
通過(guò)2臺(tái)主機(jī)實(shí)現(xiàn),一臺(tái)作為NFS服務(wù)端,另外一臺(tái)作為NFS客戶端
NFS服務(wù)端:
vi /etc/exports ##編輯導(dǎo)出配置文件,添加如下內(nèi)容
/data/nfsshare *(rw,all_squash)
mkdir /data/nfsshare ##創(chuàng)建共享文件夾
setfacl -m u:nfsnobody:rwx /data/nfsshare ##為nfsnobody匿名用戶設(shè)置相應(yīng)訪問(wèn)控制權(quán)限
exportfs -arv ##重新加載配置文件并輸出本機(jī)所有共享
NFS客戶端:
showmount -e 172.16.77.132 ##查看遠(yuǎn)程主機(jī)共享的目錄
Export list for localhost:
/home/user1 *
mount.nfs 172.16.77.132:/data/nfsshare /www ##掛載遠(yuǎn)程主機(jī)共享的目錄
[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
測(cè)試:
touch /www/index.html ##在客戶端主機(jī)上測(cè)試能否在共享目錄創(chuàng)建文件
ls -l /www
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug 23 21:30 index.html
1.3 SMB服務(wù)介紹
???????SMB(Server Message Block服務(wù)器消息塊),IBM發(fā)布,最早是DOS網(wǎng)絡(luò)文件共享協(xié)議。CIFS(common internet file system),微軟基于SMB發(fā)布。
功能:
- 共享文件和打印服務(wù),實(shí)現(xiàn)在線編輯
- 實(shí)現(xiàn)登錄SAMBA用戶的身份認(rèn)證
- 可以進(jìn)行NetBIOS名稱解析
- 外圍設(shè)備共享
1.3.1 SMB軟件
???????SAMBA:1991年Andrew Tridgell,實(shí)現(xiàn)windows和UNIX相通。
???????計(jì)算機(jī)網(wǎng)絡(luò)管理模式:
???????工作組WORKGROUP:計(jì)算機(jī)對(duì)等關(guān)系,帳號(hào)信息各自管理
???????域DOMAIN:C/S結(jié)構(gòu),帳號(hào)信息集中管理,DC,AD
1.3.2 SMB 服務(wù)配置
smbd:提供smb(cifs)服務(wù) TCP:139,445
nmbd:NetBIOS名稱解析 UDP:137,138
示例:配置samba共享,實(shí)現(xiàn)/www目錄共享
通過(guò)2臺(tái)主機(jī)實(shí)現(xiàn),一臺(tái)作為NFS服務(wù)端,另外一臺(tái)作為NFS客戶端
NFS服務(wù)端:
yum -y install samba ##安裝基本組件包
vi /etc/samba/smb.conf ##編輯主配置文件,追加如下內(nèi)容
[www]
comment = www
path = /data/wwwshare
writeable = yes
public = yes
mkdir /data/wwwshare ##創(chuàng)建共享目錄
useradd -s /sbin/nologin smbuser2 ##創(chuàng)建普通賬號(hào)
smbpasswd -a smbuser2 ##創(chuàng)建SMB訪問(wèn)用戶
New SMB password:
Retype new SMB password:
systemctl restart smb ##重啟服務(wù),使其更改生效
NFS客戶端:
yum -y install samba-client cifs-utils ##安裝客戶端工具包
smbclient -L 172.16.77.132 ##匿名訪問(wèn)SMB服務(wù)器,無(wú)需輸入密碼。直接按下回車鍵
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 ##創(chuàng)建SMB共享掛載點(diǎn)
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 ##在客戶端主機(jī)上測(cè)試能否在共享目錄創(chuàng)建文件
ls -l /www
total 0
-rwxr-xr-x. 1 root root 0 Aug 23 22:07 index.html
1.4 數(shù)據(jù)同步工具介紹
???????rsync:基于ssh和rsh服務(wù)實(shí)現(xiàn)高效率的遠(yuǎn)程系統(tǒng)之間復(fù)制文件
???????inotify:異步的文件系統(tǒng)事件監(jiān)控機(jī)制,利用事件驅(qū)動(dòng)機(jī)制,而無(wú)須通過(guò)諸如cron等的輪詢機(jī)制來(lái)獲取事件,linux內(nèi)核從2.6.13起支持 inotify,通過(guò)inotify可以監(jiān)控文件系統(tǒng)中添加、刪除,修改、移動(dòng)等各種事件。相關(guān)軟件:inotify-tools,sersync,lrsyncd
1.4.1 文件監(jiān)控服務(wù)工具
???????inotifywait: 在被監(jiān)控的文件或目錄上等待特定文件系統(tǒng)事件(open close delete等)發(fā)生,常用于實(shí)時(shí)同步的目錄監(jiān)控
???????inotifywatch:收集被監(jiān)控的文件系統(tǒng)使用的統(tǒng)計(jì)數(shù)據(jù),指文件系統(tǒng)事件發(fā)生的次數(shù)統(tǒng)計(jì)
inotifywait常見選項(xiàng):
-m, --monitor 始終保持事件監(jiān)聽
-d, --daemon 以守護(hù)進(jìn)程方式執(zhí)行,和-m相似,配合-o使用
-r, --recursive 遞歸監(jiān)控目錄數(shù)據(jù)信息變化
-q, --quiet 輸出少量事件信息
--exclude <pattern> 指定排除文件或目錄,使用擴(kuò)展的正則表達(dá)式匹配的模式實(shí)現(xiàn)
--excludei <pattern> 和exclude相似,不區(qū)分大小寫
-o, --outfile <file>打印事件到文件中,相當(dāng)于標(biāo)準(zhǔn)正確輸出
-s, --syslogOutput 發(fā)送錯(cuò)誤到syslog相當(dāng)于標(biāo)準(zhǔn)錯(cuò)誤輸出
--timefmt <fmt> 指定時(shí)間輸出格式
--format <fmt> 指定的輸出格式;即實(shí)際監(jiān)控輸出內(nèi)容
-e 指定監(jiān)聽指定的事件,如果省略,表示所有事件都進(jìn)行監(jiān)聽
--timefmt <fmt>時(shí)間格式,參考 man 3 strftime
- %Y 年份信息,包含世紀(jì)信息
- %y 年份信息,不包括世紀(jì)信息
- %m 顯示月份,范圍 01-12
- %d 每月的第幾天,范圍是 01-31
- %H 小時(shí)信息,使用 24小時(shí)制,范圍 00-23
- %M 分鐘,范圍 00-59
例如:--timefmt "%Y-%m-%d %H:%M"
--format <fmt> 格式定義
- %T 輸出時(shí)間格式中定義的時(shí)間格式信息,通過(guò) --timefmt option 語(yǔ)法格式指定時(shí)間信息
- %w 事件出現(xiàn)時(shí),監(jiān)控文件或目錄的名稱信息
- %f 事件出現(xiàn)時(shí),將顯示監(jiān)控目錄下觸發(fā)事件的文件或目錄信息,否則為空
- %e 顯示發(fā)生的事件信息,不同的事件默認(rèn)用逗號(hào)分隔
- %Xe顯示發(fā)生的事件信息,不同的事件指定用X進(jìn)行分隔
例:
--format "%T %w%f event: %;e"
--format '%T %w %f'
-e 選項(xiàng)指定的事件類型
- create 文件或目錄創(chuàng)建
- delete 文件或目錄被刪除
- modify 文件或目錄內(nèi)容被寫入
- attrib 文件或目錄屬性改變
- close_write 文件或目錄關(guān)閉,在寫入模式打開之后關(guān)閉的
- close_nowrite 文件或目錄關(guān)閉,在只讀模式打開之后關(guān)閉的
- close 文件或目錄關(guān)閉,不管讀或是寫模式
- open 文件或目錄被打開
- moved_to 文件或目錄被移動(dòng)到監(jiān)控的目錄中
- moved_from 文件或目錄從監(jiān)控的目錄中被移動(dòng)
- move 文件或目錄不管移動(dòng)到或是移出監(jiān)控目錄都觸發(fā)事件
- access 文件或目錄內(nèi)容被讀取
- delete_self 文件或目錄被刪除,目錄本身被刪除
- unmount 取消掛載
例: -e create,delete,moved_to,close_write, attrib
1.3.2 數(shù)據(jù)實(shí)時(shí)同步
實(shí)現(xiàn)實(shí)時(shí)同步思路
1、要利用監(jiān)控服務(wù)(inotify),監(jiān)控同步數(shù)據(jù)服務(wù)器目錄中信息的變化
2、發(fā)現(xiàn)目錄中數(shù)據(jù)產(chǎn)生變化,利用rsync服務(wù)推送到備份服務(wù)器上
3、利用腳本進(jìn)行結(jié)合實(shí)現(xiàn)實(shí)時(shí)同步方法
inotify+rsync 方式實(shí)現(xiàn)數(shù)據(jù)同步
示例:使用rsync+inotify實(shí)現(xiàn)/www目錄實(shí)時(shí)同步
通過(guò)2臺(tái)主機(jī)實(shí)現(xiàn),一臺(tái)作為同步服務(wù)器,另外一臺(tái)作為同步客戶端
同步服務(wù)器:
vi /etc/rsyncd.conf ## 編輯rsync 服務(wù)器端主配置文件,添加或修改如下內(nèi)容
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 ##允許同步連接的主機(jī)列表
[www]
path = /www
comment = backup
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pass ##指定驗(yàn)證文件
echo "rsyncuser:bza" > /etc/rsync.pass ##生成驗(yàn)證文件
chmod 600 /etc/rsync.pass
mkdir /www ##創(chuàng)建同步目錄
systemctl start rsyncd ##啟動(dòng)服務(wù),使更改生效
同步客戶端:
yum -y install inotify-tools ##安裝監(jiān)控服務(wù)工具包
echo "bza" > /etc/rsync.pass ##生成密碼文件
chmod 600 /etc/rsync.pass
vi /etc/inotify_rsync.sh ##創(chuàng)建實(shí)時(shí)同步腳本,添加如下內(nèi)容
#!/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 ##賦予可執(zhí)行權(quán)限
二、iptables介紹
???????核心:Netfilter組件
???????位于內(nèi)核空間,集成在linux內(nèi)核中,擴(kuò)展各種網(wǎng)絡(luò)服務(wù)的結(jié)構(gòu)化底層框架
???????實(shí)現(xiàn)原理:內(nèi)核中選取五個(gè)位置放了五個(gè)hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個(gè)hook function向用戶開放,用戶可以通過(guò)一個(gè)命令工具(iptables)向其寫入規(guī)則由信息過(guò)濾表(table)組成,包含控制IP包處理的規(guī)則集(rules),規(guī)則被分組放在鏈(chain)上。
???????三種報(bào)文流向:
???????流入本機(jī):PREROUTING --> INPUT-->用戶空間進(jìn)程
???????流出本機(jī):用戶空間進(jìn)程 -->OUTPUT--> POSTROUTING
???????轉(zhuǎn)發(fā):PREROUTING --> FORWARD --> POSTROUTING
2.1 iptables 基本結(jié)構(gòu)
五個(gè)表table:
filter表:過(guò)濾規(guī)則表,根據(jù)預(yù)定義的規(guī)則過(guò)濾符合條件的數(shù)據(jù)包
nat表:network address translation 地址轉(zhuǎn)換規(guī)則表
mangle:修改數(shù)據(jù)標(biāo)記位規(guī)則表
raw:關(guān)閉NAT表上啟用的連接跟蹤機(jī)制,加快封包穿越防火墻速度
security:用于強(qiáng)制訪問(wèn)控制(MAC)網(wǎng)絡(luò)規(guī)則,由Linux安全模塊(如SELinux)實(shí)現(xiàn)
優(yōu)先級(jí)由高到低的順序?yàn)椋簊ecurity -->raw-->mangle-->nat-->filter
五個(gè)內(nèi)置鏈chain:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
2.2 iptables 工作過(guò)程
???????當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),數(shù)據(jù)包首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要轉(zhuǎn)送出去
???????如果數(shù)據(jù)包就是進(jìn)入本機(jī)的,數(shù)據(jù)包就會(huì)向下移動(dòng),到達(dá)INPUT鏈。數(shù)據(jù)包到達(dá)INPUT鏈后,任何進(jìn)程都會(huì)收到它。本機(jī)上運(yùn)行的程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包經(jīng)過(guò)OUTPUT鏈,然后到達(dá)POSTROUTING鏈輸出
???????如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會(huì)向右移動(dòng),經(jīng)過(guò)FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出
2.3 iptables 規(guī)則
2.3.1 iptables 規(guī)則組成
規(guī)則rule:根據(jù)規(guī)則的匹配條件嘗試匹配報(bào)文,對(duì)匹配成功的報(bào)文根據(jù)規(guī)則定義的處理動(dòng)作作出處理
匹配條件:默認(rèn)為與條件,同時(shí)滿足
基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
擴(kuò)展匹配:通過(guò)復(fù)雜高級(jí)功能匹配
處理動(dòng)作:稱為target,跳轉(zhuǎn)目標(biāo)
內(nèi)建處理動(dòng)作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...
自定義處理動(dòng)作:
自定義chain,利用分類管理復(fù)雜情形
規(guī)則要添加在鏈上,才生效;添加在自定義上不會(huì)自動(dòng)生效
鏈chain:
內(nèi)置鏈:每個(gè)內(nèi)置鏈對(duì)應(yīng)于一個(gè)鉤子函數(shù)
自定義鏈:用于對(duì)內(nèi)置鏈進(jìn)行擴(kuò)展或補(bǔ)充,可實(shí)現(xiàn)更靈活的規(guī)則組織管理機(jī)制;只有Hook鉤子調(diào)用自定義鏈時(shí),才生效
iptables規(guī)則注意事項(xiàng)
- 要實(shí)現(xiàn)哪種功能:判斷添加在哪張表上
- 報(bào)文流經(jīng)的路徑:判斷添加在哪個(gè)鏈上
- 報(bào)文的流向:判斷源和目的
- 匹配規(guī)則:業(yè)務(wù)需要
2.3.1 iptables 命令
語(yǔ)法:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
選項(xiàng):
-t table: 指定表名
raw, mangle, nat, filter(默認(rèn))
-P:設(shè)置默認(rèn)策略;對(duì)filter表中的鏈而言,其默認(rèn)策略有:
ACCEPT 接受
DROP 丟棄
-s:指定源IP地址或范圍
-p, --protocol protocol:指定協(xié)議,可使用數(shù)字如0(all),可使用如下:
tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh
--dport:指定目標(biāo)服務(wù)端口,可設(shè)置范圍:
port[:port]
-j:處理動(dòng)作,可使用如下:
ACCEPT(允許),DROP(丟棄),REJECT(拒絕),RETURN(返回調(diào)用鏈),REDIRECT(端口重定向),LOG(記錄日志),MARK(做防火墻標(biāo)記),DNAT(目標(biāo)地址轉(zhuǎn)換),SNAT(源地址轉(zhuǎn)換),MASQUERADE(地址偽裝)
-L:list, 列出指定鏈的所有規(guī)則,本選項(xiàng)須置后
-n:numberic,以數(shù)字格式顯示地址和端口號(hào)
-v:verbose,詳細(xì)信息
--line-numbers:顯示規(guī)則的序號(hào)
2.3.2 iptables 常見擴(kuò)展
multiport擴(kuò)展:以離散方式定義多端口匹配,最多指定15個(gè)端口
格式:--dports port[,port|,port:port]... 指定多個(gè)目標(biāo)端口
iprange擴(kuò)展:指明連續(xù)但一般不是整個(gè)網(wǎng)絡(luò)的ip地址范圍
格式:--src-range from[-to] 源IP地址范圍
state擴(kuò)展:根據(jù)“連接追蹤機(jī)制”去檢查連接的狀態(tài),較耗資源
conntrack機(jī)制:追蹤本機(jī)上的請(qǐng)求和響應(yīng)之間的關(guān)系
- 狀態(tài)有如下幾種:
NEW:新發(fā)出請(qǐng)求;連接追蹤信息庫(kù)中不存在此連接的相關(guān)信息條目,因此,將其識(shí)別為第一次發(fā)出的請(qǐng)求
ESTABLISHED:NEW狀態(tài)之后,連接追蹤信息庫(kù)中為其建立的條目失效之前期間內(nèi)所進(jìn)行的通信狀態(tài)
RELATED:新發(fā)起的但與已有連接相關(guān)聯(lián)的連接,如:ftp協(xié)議中的數(shù)據(jù)連接與命令連接之間的關(guān)系
INVALID:無(wú)效的連接,如flag標(biāo)記不正確
UNTRACKED:未進(jìn)行追蹤的連接,如raw表中關(guān)閉追蹤
示例:放行telnet, ftp, web服務(wù),放行samba服務(wù),其他端口服務(wù)全部拒絕
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 ##查看入站規(guī)則列表
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