(1)Netfilter是由Rusty Russell提出的Linux 2.4內(nèi)核防火墻框架,該框架既簡(jiǎn)潔又靈活,可實(shí)現(xiàn)安全策略應(yīng)用中的許多功能,如數(shù)據(jù)包過濾、數(shù)據(jù)包處理、地址偽裝、透明代理、動(dòng)態(tài)網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation,NAT),以及基于用戶及媒體訪問控制(Media Access Control,MAC)地址的過濾和基于狀態(tài)的過濾、包速率限制等。Iptables/Netfilter的這些規(guī)則可以通過靈活組合,形成非常多的功能、涵蓋各個(gè)方面,這一切都得益于它的優(yōu)秀設(shè)計(jì)思想。
Netfilter是Linux操作系統(tǒng)核心層內(nèi)部的一個(gè)數(shù)據(jù)包處理模塊,它具有如下功能:
網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translate)
數(shù)據(jù)包內(nèi)容修改
數(shù)據(jù)包過濾防火墻
(2)Netfilter 平臺(tái)中制定了數(shù)據(jù)包的五個(gè)掛載點(diǎn)(Hook Point,我們可以理解為回調(diào)函數(shù)點(diǎn),數(shù)據(jù)包到達(dá)這些位置的時(shí)候會(huì)主動(dòng)調(diào)用我們的函數(shù),使我們有機(jī)會(huì)能在數(shù)據(jù)包路由的時(shí)候改變它們的方向、內(nèi)容),這5個(gè)掛載點(diǎn)分別是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。
(3)Netfilter 所設(shè)置的規(guī)則是存放在內(nèi)核內(nèi)存中的,而 iptables 是一個(gè)應(yīng)用層的應(yīng)用程序,它通過 Netfilter 放出的接口來對(duì)存放在內(nèi)核內(nèi)存中的 XXtables(Netfilter的配置表)進(jìn)行修改。這個(gè)XXtables由表tables、鏈chains、規(guī)則rules組成,iptables在應(yīng)用層負(fù)責(zé)修改這個(gè)規(guī)則文件。類似的應(yīng)用程序還有 firewalld 。
二、filter、nat、mangle等規(guī)則四表
(1)table有?filter、nat、mangle等規(guī)則表;
filter表
主要用于對(duì)數(shù)據(jù)包進(jìn)行過濾,根據(jù)具體的規(guī)則決定是否放行該數(shù)據(jù)包(如DROP、ACCEPT、REJECT、LOG)。filter 表對(duì)應(yīng)的內(nèi)核模塊為iptable_filter,包含三個(gè)規(guī)則鏈:
INPUT鏈:INPUT針對(duì)那些目的地是本地的包
FORWARD鏈:FORWARD過濾所有不是本地產(chǎn)生的并且目的地不是本地(即本機(jī)只是負(fù)責(zé)轉(zhuǎn)發(fā))的
OUTPUT鏈:OUTPUT是用來過濾所有本地生成的包 ? ?
nat表
主要用于修改數(shù)據(jù)包的IP地址、端口號(hào)等信息(網(wǎng)絡(luò)地址轉(zhuǎn)換,如SNAT、DNAT、MASQUERADE、REDIRECT)。屬于一個(gè)流的包(因?yàn)榘拇笮∠拗茖?dǎo)致數(shù)據(jù)可能會(huì)被分成多個(gè)數(shù)據(jù)包)只會(huì)經(jīng)過
這個(gè)表一次。如果第一個(gè)包被允許做NAT或Masqueraded,那么余下的包都會(huì)自動(dòng)地被做相同的操作,也就是說,余下的包不會(huì)再通過這個(gè)表。表對(duì)應(yīng)的內(nèi)核模塊為 iptable_nat,包含三個(gè)鏈
PREROUTING鏈:作用是在包剛剛到達(dá)防火墻時(shí)改變它的目的地址
OUTPUT鏈:改變本地產(chǎn)生的包的目的地址
POSTROUTING鏈:在包就要離開防火墻之前改變其源地址
mangle表
主要用于修改數(shù)據(jù)包的TOS(Type Of Service,服務(wù)類型)、TTL(Time To Live,生存周期)指以及為數(shù)據(jù)包設(shè)置Mark標(biāo)記,以實(shí)現(xiàn)Qos(Quality Of Service,服務(wù)質(zhì)量)調(diào)整以及策略路由等
應(yīng)用,由于需要相應(yīng)的路由設(shè)備支持,因此應(yīng)用并不廣泛。包含五個(gè)規(guī)則鏈——PREROUTING,POSTROUTING,INPUT,OUTPUT,F(xiàn)ORWARD。
raw表
是自1.2.9以后版本的iptables新增的表,主要用于決定數(shù)據(jù)包是否被狀態(tài)跟蹤機(jī)制處理。在匹配數(shù)據(jù)包時(shí),raw表的規(guī)則要優(yōu)先于其他表。包含兩條規(guī)則鏈——OUTPUT、PREROUTING
(2)iptables中數(shù)據(jù)包和4種被跟蹤連接的4種不同狀態(tài):
NEW:該包想要開始一個(gè)連接(重新連接或?qū)⑦B接重定向)
RELATED:該包是屬于某個(gè)已經(jīng)建立的連接所建立的新連接。例如:FTP的數(shù)據(jù)傳輸連接就是控制連接所 RELATED出來的連接。--icmp-type 0?( ping 應(yīng)答) 就是--icmp-type 8?(ping 請(qǐng)求)所RELATED出來的。
ESTABLISHED?:只要發(fā)送并接到應(yīng)答,一個(gè)數(shù)據(jù)連接從NEW變?yōu)镋STABLISHED,而且該狀態(tài)會(huì)繼續(xù)匹配這個(gè)連接的后續(xù)數(shù)據(jù)包。
INVALID:數(shù)據(jù)包不能被識(shí)別屬于哪個(gè)連接或沒有任何狀態(tài)比如內(nèi)存溢出,收到不知屬于哪個(gè)連接的ICMP錯(cuò)誤信息,一般應(yīng)該DROP這個(gè)狀態(tài)的任何數(shù)據(jù)。
三、INPUT、FORWARD等規(guī)則五鏈和規(guī)則
(1)在處理各種數(shù)據(jù)包時(shí),根據(jù)防火墻規(guī)則的不同介入時(shí)機(jī),iptables供涉及5種默認(rèn)規(guī)則鏈,從應(yīng)用時(shí)間點(diǎn)的角度理解這些鏈:
INPUT鏈:當(dāng)接收到防火墻本機(jī)地址的數(shù)據(jù)包(入站)時(shí),應(yīng)用此鏈中的規(guī)則。
OUTPUT鏈:當(dāng)防火墻本機(jī)向外發(fā)送數(shù)據(jù)包(出站)時(shí),應(yīng)用此鏈中的規(guī)則。
FORWARD鏈:當(dāng)接收到需要通過防火墻發(fā)送給其他地址的數(shù)據(jù)包(轉(zhuǎn)發(fā))時(shí),應(yīng)用此鏈中的規(guī)則。
PREROUTING鏈:在對(duì)數(shù)據(jù)包作路由選擇之前,應(yīng)用此鏈中的規(guī)則,如DNAT。
POSTROUTING鏈:在對(duì)數(shù)據(jù)包作路由選擇之后,應(yīng)用此鏈中的規(guī)則,如SNAT。
(2)其中中INPUT、OUTPUT鏈更多的應(yīng)用在“主機(jī)防火墻”中,即主要針對(duì)服務(wù)器本機(jī)進(jìn)出數(shù)據(jù)的安全控制;而FORWARD、PREROUTING、POSTROUTING鏈更多的應(yīng)用在“網(wǎng)絡(luò)防火 墻”中,特別是防火墻服務(wù)器作為網(wǎng)關(guān)使用時(shí)的情況。
四、Linux數(shù)據(jù)包路由原理
(1)理解了Netfilter和Iptables的架構(gòu)和作用,并且學(xué)習(xí)了控制Netfilter行為的Xtables表的結(jié)構(gòu),那么這個(gè)Xtables表是怎么在內(nèi)核協(xié)議棧的數(shù)據(jù)包路由中起作用的呢?
工作流程:網(wǎng)口數(shù)據(jù)包由底層的網(wǎng)卡NIC接收,通過數(shù)據(jù)鏈路層的解包之后(去除數(shù)據(jù)鏈路幀頭),就進(jìn)入了TCP/IP協(xié)議棧(本質(zhì)就是一個(gè)處理網(wǎng)絡(luò)數(shù)據(jù)包的內(nèi)核驅(qū)動(dòng))和Netfilter混合的數(shù)據(jù)包處理流程中了。數(shù)據(jù)包的接收、處理、轉(zhuǎn)發(fā)流程構(gòu)成一個(gè)有限狀態(tài)向量機(jī),經(jīng)過一些列的內(nèi)核處理函數(shù)、以及Netfilter Hook點(diǎn),最后被轉(zhuǎn)發(fā)、或者本次上層的應(yīng)用程序消化掉。
如圖:
從上圖中,我們可以總結(jié)出以下規(guī)律:
當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),數(shù)據(jù)包首先進(jìn)入PREROUTING鏈,在PREROUTING鏈中我們有機(jī)會(huì)修改數(shù)據(jù)包的DestIP(目的IP),然后內(nèi)核的"路由模塊"根據(jù)"數(shù)據(jù)包目的IP"以及"內(nèi)核中的路由表"判斷是否需要轉(zhuǎn)送出去(注意,這個(gè)時(shí)候數(shù)據(jù)包的DestIP有可能已經(jīng)被我們修改過了)
如果數(shù)據(jù)包就是進(jìn)入本機(jī)的(即數(shù)據(jù)包的目的IP是本機(jī)的網(wǎng)口IP),數(shù)據(jù)包就會(huì)沿著圖向下移動(dòng),到達(dá)INPUT鏈。數(shù)據(jù)包到達(dá)INPUT鏈后,任何進(jìn)程都會(huì)-收到它
本機(jī)上運(yùn)行的程序也可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包經(jīng)過OUTPUT鏈,然后到達(dá)POSTROTING鏈輸出(注意,這個(gè)時(shí)候數(shù)據(jù)包的SrcIP有可能已經(jīng)被我們修改過了)
如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的(即目的IP地址不再當(dāng)前子網(wǎng)中),且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會(huì)向右移動(dòng),經(jīng)過FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出(選擇對(duì)應(yīng)子網(wǎng)的網(wǎng)口發(fā)送出去)
在寫iptables規(guī)則的時(shí)候,要時(shí)刻牢記這張路由次序圖,根據(jù)所在Hook點(diǎn)的不同,靈活配置規(guī)則
五、iptables編寫規(guī)則
命令格式:
示例:
1?iptables -I INPUT -s 0/0 -d 192.168.42.153 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT?
1?iptables -t filter -I INPUT -d 192.168.42.153 -p tcp --dport 80 -j ACCEPT?
1.[-t 表名]:該規(guī)則所操作的哪個(gè)表,可以使用filter、nat等,如果沒有指定則默認(rèn)為filter
-A:新增一條規(guī)則,到該規(guī)則鏈列表的最后一行
-I:插入一條規(guī)則,原本該位置上的規(guī)則會(huì)往后順序移動(dòng),沒有指定編號(hào)則為1
-D:從規(guī)則鏈中刪除一條規(guī)則,要么輸入完整的規(guī)則,或者指定規(guī)則編號(hào)加以刪除
-R:替換某條規(guī)則,規(guī)則替換不會(huì)改變順序,而且必須指定編號(hào)。
-P:設(shè)置某條規(guī)則鏈的默認(rèn)動(dòng)作
-nL:-L、-n,查看當(dāng)前運(yùn)行的防火墻規(guī)則列表
2.chain名:指定規(guī)則表的哪個(gè)鏈,如INPUT、OUPUT、FORWARD、PREROUTING等
[規(guī)則編號(hào)]:插入、刪除、替換規(guī)則時(shí)用,--line-numbers顯示號(hào)碼
[-i|o 網(wǎng)卡名稱]:i是指定數(shù)據(jù)包從哪塊網(wǎng)卡進(jìn)入,o是指定數(shù)據(jù)包從哪塊網(wǎng)卡輸出
[-p 協(xié)議類型]:可以指定規(guī)則應(yīng)用的協(xié)議,包含tcp、udp和icmp等
[-s 源IP地址]:源主機(jī)的IP地址或子網(wǎng)地址
[--sport 源端口號(hào)]:數(shù)據(jù)包的IP的源端口號(hào)
[-d目標(biāo)IP地址]:目標(biāo)主機(jī)的IP地址或子網(wǎng)地址
[--dport目標(biāo)端口號(hào)]:數(shù)據(jù)包的IP的目標(biāo)端口號(hào)
3.-m:extend matches,這個(gè)選項(xiàng)用于提供更多的匹配參數(shù),如:
-m state --state ESTABLISHED,RELATED
-m tcp --dport 22
-m multiport --dports 80,8080
-m icmp --icmp-type 8
4.<-j 動(dòng)作>:處理數(shù)據(jù)包的動(dòng)作,包括ACCEPT、DROP、REJECT等
ACCEPT:允許數(shù)據(jù)包通過
DROP:直接丟棄數(shù)據(jù)包,不給任何回應(yīng)信息
REJECT:拒絕數(shù)據(jù)包通過,必要時(shí)會(huì)給數(shù)據(jù)發(fā)送端一個(gè)響應(yīng)的信息。
SNAT:源地址轉(zhuǎn)換。在進(jìn)入路由層面的route之后,出本地的網(wǎng)絡(luò)棧之前,改寫源地址,目標(biāo)地址不變,并在本機(jī)建立NAT表項(xiàng),當(dāng)數(shù)據(jù)返回時(shí),根據(jù)NAT表將目的地址數(shù)據(jù)改寫為數(shù)據(jù)發(fā)送出去時(shí)候的源地址,并發(fā)送給主機(jī)。解決內(nèi)網(wǎng)用戶用同一個(gè)公網(wǎng)地址上網(wǎng)的問題。
MASQUERADE,是SNAT的一種特殊形式,適用于像adsl這種臨時(shí)會(huì)變的ip上
DNAT:目標(biāo)地址轉(zhuǎn)換。和SNAT相反,IP包經(jīng)過route之前,重新修改目標(biāo)地址,源地址不變,在本機(jī)建立NAT表項(xiàng),當(dāng)數(shù)據(jù)返回時(shí),根據(jù)NAT表將源地址修改為數(shù)據(jù)發(fā)送過來時(shí)的目標(biāo)地址,并發(fā)給遠(yuǎn)程主機(jī)??梢噪[藏后端服務(wù)器的真實(shí)地址。(感謝網(wǎng)友提出之前這個(gè)地方與SNAT寫反了)
REDIRECT:是DNAT的一種特殊形式,將網(wǎng)絡(luò)包轉(zhuǎn)發(fā)到本地host上(不管IP頭部指定的目標(biāo)地址是啥),方便在本機(jī)做端口轉(zhuǎn)發(fā)。
LOG:在/var/log/messages文件中記錄日志信息,然后將數(shù)據(jù)包傳遞給下一條規(guī)則
除去最后一個(gè)LOG,前3條規(guī)則匹配數(shù)據(jù)包后,該數(shù)據(jù)包不會(huì)再往下繼續(xù)匹配了,所以編寫的規(guī)則順序極其關(guān)鍵。
?
評(píng)論