一术吝、防火墻原理
- 防火墻一種位于內(nèi)部網(wǎng)絡(luò)與外部網(wǎng)絡(luò)之間的網(wǎng)絡(luò)安全系統(tǒng)弄痹。一項(xiàng)信息安全的防護(hù)系統(tǒng)。按照給定的規(guī)則哀蘑,允許或者限制網(wǎng)絡(luò)報(bào)文通過诚卸。
- 防火墻根據(jù)其管理的范圍來分可以將其劃分為主機(jī)防火墻和網(wǎng)絡(luò)防火墻;根據(jù)其工作機(jī)制來區(qū)分又可分為包過濾型防火墻(netfilter)和代理服務(wù)器(Proxy)绘迁。
- 主要工作在網(wǎng)絡(luò)層合溺,針對(duì) TCP/IP 數(shù)據(jù)包實(shí)施過濾和限制,屬于典型的包過濾防火墻(或稱為網(wǎng)絡(luò)層防火墻)缀台。
- 在這里主要通過iptables工具添加“規(guī)則”棠赛,Linux主機(jī)防火墻由用戶態(tài)iptables工具和內(nèi)核態(tài)netfilter模塊來實(shí)現(xiàn)。
二、包過濾型防火墻的工作原理
包過濾型防火墻主要依賴于Linux內(nèi)核軟件netfilter睛约,它是一個(gè)Linux內(nèi)核“安全框架”鼎俘,而iptables是內(nèi)核軟件netfilter的配置工具,工作于用戶空間辩涝。iptables/netfilter組合就是Linux平臺(tái)下的過濾型防火墻贸伐,并且這個(gè)防火墻軟件是免費(fèi)的,可以用來替代商業(yè)防火墻軟件怔揩,來完成網(wǎng)絡(luò)數(shù)據(jù)包的過濾捉邢,修改,重定向以及網(wǎng)絡(luò)地址轉(zhuǎn)換(nat)等功能商膊。
Linux網(wǎng)絡(luò)管理員通過配置iptables規(guī)則以及對(duì)應(yīng)的網(wǎng)路數(shù)據(jù)包處理邏輯伏伐,當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包符合這樣的規(guī)則時(shí),就做執(zhí)行預(yù)先定義好的相應(yīng)的處理邏輯晕拆∶牯幔可以簡單的總結(jié)為:
IF network_pkg match rule; THEN
handler
FI
- 其中規(guī)則可以包括匹配數(shù)據(jù)報(bào)文的源地址,目的地址实幕,傳輸層協(xié)議(TCP/UDP/ICMP/..)以及應(yīng)用層協(xié)議(HTTP/FTP/SMTP/..)等吝镣,處理邏輯就是根據(jù)規(guī)則所定義的方法來處理這些數(shù)據(jù)包,如放行(accept)茬缩,拒絕(reject)赤惊,丟棄(drop)等。
三凰锡、關(guān)卡與鏈
-
一個(gè)客戶端的數(shù)據(jù)報(bào)文和服務(wù)器的交互流程就如下圖所示:
所以為了使防火墻達(dá)到包過濾的目的,我們需要在數(shù)據(jù)報(bào)文流經(jīng)的路徑上圈暗,設(shè)置一些關(guān)卡: 只有讓所有進(jìn)出的報(bào)文都流經(jīng)這些關(guān)卡中掂为, 同時(shí)我們?cè)陉P(guān)卡上設(shè)置一些條件, 報(bào)文經(jīng)過檢查后员串,符合放行條件的才給放行, 而那些不符合不達(dá)標(biāo)的條件的報(bào)文則會(huì)被阻止勇哗,不能夠放行。 在Linux主機(jī)中的防火墻“iptables”中寸齐,**關(guān)卡就稱之為【鏈】**欲诺,所謂的 **條件就稱之為【規(guī)則】**,**配置使用防火墻渺鹦,其實(shí)就是在相應(yīng)的鏈中添加規(guī)則**扰法。
Linux主機(jī)防火墻中設(shè)置了有5道關(guān)卡,即【5鏈】:
netfilter是工作于內(nèi)核空間當(dāng)中的一系列網(wǎng)絡(luò)(TCP/IP)協(xié)議棧的鉤子(hook)毅厚,為內(nèi)核模塊在網(wǎng)絡(luò)協(xié)議棧中的不同位置注冊(cè)回調(diào)函數(shù)(callback)塞颁。也就是說,在數(shù)據(jù)包經(jīng)過網(wǎng)絡(luò)協(xié)議棧的不同位置時(shí)做相應(yīng)的由iptables配置好的處理邏輯。netfilter中的五個(gè)鉤子(這里也稱為五個(gè)關(guān)卡)PRE_ROUTING祠锣,INPUT酷窥,F(xiàn)ORWARD,OUTPUT伴网,POST_ROUTING蓬推,網(wǎng)絡(luò)數(shù)據(jù)包的流向圖如下圖所示:
- 當(dāng)主機(jī)/網(wǎng)絡(luò)服務(wù)器網(wǎng)卡收到一個(gè)數(shù)據(jù)包之后進(jìn)入內(nèi)核空間的TCP/IP協(xié)議棧進(jìn)行層層解封裝
- PRE_ROUTING: 剛剛進(jìn)入網(wǎng)絡(luò)層的數(shù)據(jù)包通過PRE_ROUTING關(guān)卡時(shí),要進(jìn)行一次路由選擇澡腾,當(dāng)目標(biāo)地址為本機(jī)地址時(shí)沸伏,數(shù)據(jù)進(jìn)入INPUT,非本地的目標(biāo)地址進(jìn)入FORWARD(需要本機(jī)內(nèi)核支持IP_FORWARD)蛋铆,所以目標(biāo)地址轉(zhuǎn)換通常在這個(gè)關(guān)卡進(jìn)行
- INPUT:經(jīng)過路由之后送往本地的數(shù)據(jù)包經(jīng)過此關(guān)卡馋评,所以過濾INPUT包在此點(diǎn)關(guān)卡進(jìn)行
- FORWARD:經(jīng)過路由選擇之后要轉(zhuǎn)發(fā)的數(shù)據(jù)包經(jīng)過此關(guān)卡,所以網(wǎng)絡(luò)防火墻通常在此關(guān)卡配置
- OUTPUT:由本地用戶空間應(yīng)用進(jìn)程產(chǎn)生的數(shù)據(jù)包過此關(guān)卡刺啦,所以O(shè)UTPUT包過濾在此關(guān)卡進(jìn)行
- POST_ROUTING:剛剛通過FORWARD和OUTPUT關(guān)卡的數(shù)據(jù)包要通過一次路由選擇由哪個(gè)接口送往網(wǎng)絡(luò)中留特,經(jīng)過路由之后的數(shù)據(jù)包要通過POST_ROUTING此關(guān)卡,源地址轉(zhuǎn)換通常在此點(diǎn)進(jìn)行
除input 和 output 兩個(gè)鏈玛瘸,其他三個(gè)鏈?zhǔn)亲鳛橐恍┚W(wǎng)關(guān)路由器設(shè)備時(shí)才會(huì)使用蜕青。
根據(jù)實(shí)際的場(chǎng)景,數(shù)據(jù)報(bào)文的流向:
- PREROUTING -> INPUT -> Process -> OUTPUT -> POSTROUTING(外網(wǎng) 到本機(jī)的報(bào)文)
- PREROUTING -> FORWARD -> POSTROUTING(由本機(jī)路由器 轉(zhuǎn)發(fā)的報(bào)文)
- OUTPUT -> POSTROUTING(本機(jī)進(jìn)程發(fā)出的報(bào)文)
四糊渊、4表5鏈N規(guī)則
-
鏈和規(guī)則之間的關(guān)系:
當(dāng)報(bào)文經(jīng)過某一個(gè)關(guān)卡時(shí)右核,這個(gè)關(guān)卡上的“規(guī)則”不止一條,很多條規(guī)則會(huì)按照順序逐條匹配渺绒,將在此關(guān)卡的所有規(guī)則組織稱“鏈”就很適合贺喝,對(duì)于經(jīng)過的數(shù)據(jù)包按照順序逐條匹配“規(guī)則”。如下圖所示:
規(guī)則:就是是滿足某個(gè)條件宗兼,就做什么事情躏鱼,由條件+操作組合而成。其操作: -j ACCEPT|DROP(允許/不允許)來表示殷绍。
每個(gè)關(guān)卡中可以設(shè)置多條“規(guī)則”染苛, 每一個(gè)關(guān)卡中由多條規(guī)則串在一起的就叫“鏈”。每一條“鏈”上的一串規(guī)則里面有些功能是相似的主到,比如茶行,A類規(guī)則都是對(duì)IP或者端口進(jìn)行過濾,B類規(guī)則都是修改報(bào)文登钥,我們考慮能否將這些功能相似的規(guī)則放到一起畔师,這樣管理iptables規(guī)則會(huì)更方便。iptables把具有相同功能的規(guī)則集合叫做“表”怔鳖,并且定一個(gè)四種表:
1. filter表: 數(shù)據(jù)包過濾茉唉;與之對(duì)應(yīng)的內(nèi)核模塊是iptables_filter固蛾。包含三個(gè)規(guī)則鏈:INPUT、FORWARD度陆、OUTPUT艾凯;
2. nat表:負(fù)責(zé)網(wǎng)絡(luò)地址轉(zhuǎn)換,用來修改數(shù)據(jù)包中的源懂傀、目標(biāo)IP地址或端口趾诗;與之對(duì)應(yīng)的內(nèi)核模塊是iptables_nat。包含四個(gè)規(guī)則鏈:PREROUTING蹬蚁、INPUT恃泪、OUTPUT、POSTROUTING犀斋;
3. mangle表:修改數(shù)據(jù)包內(nèi)容贝乎,用來做流量整形的,給數(shù)據(jù)包設(shè)置標(biāo)記; 與之對(duì)應(yīng)的內(nèi)核模塊是iptables_mangle叽粹。包含五個(gè)規(guī)則鏈:PREROUTING览效、INPUT、FORWARD虫几、OUTPUT锤灿、POSTROUTING;
4. raw表:確定是否對(duì)該數(shù)據(jù)包進(jìn)行狀態(tài)跟蹤辆脸;與之對(duì)應(yīng)的內(nèi)核模塊是iptables_raw但校。包含兩個(gè)規(guī)則鏈,OUTPUT啡氢、PREROUTING状囱。
-
4表5鏈N規(guī)則的之間構(gòu)成的關(guān)系如下圖所示:
還需要注意的一點(diǎn)兒是,因?yàn)閿?shù)據(jù)包經(jīng)過一個(gè)關(guān)卡的時(shí)候倘是,會(huì)將“鏈”中所有的“規(guī)則”都按照順序逐條匹配浪箭,為相同功能的“規(guī)則”屬于同一個(gè)“表”。那么辨绊,哪些“表”中的規(guī)則會(huì)放到“鏈”的最前面執(zhí)行呢?這時(shí)候就涉及一個(gè)優(yōu)先級(jí)的問題匹表。iptables為我們提供了四張“表”门坷,當(dāng)它們處于同一條“鏈”的時(shí)候,它們的執(zhí)行優(yōu)先級(jí)關(guān)系如下: raw -> mangle -> nat -> filter
五袍镀、數(shù)據(jù)包經(jīng)過過濾型防火墻的流程
六默蚌、ipables規(guī)則
iptables規(guī)則由兩部分組成,報(bào)文的匹配條件和匹配到之后的處理動(dòng)作苇羡。
- 匹配條件:根據(jù)協(xié)議報(bào)文特征指定匹配條件绸吸,基本匹配條件和擴(kuò)展匹配條件
- 處理動(dòng)作:內(nèi)建處理機(jī)制由iptables自身提供的一些處理動(dòng)作
設(shè)置iptables規(guī)則時(shí)需要考量的要點(diǎn):
根據(jù)要實(shí)現(xiàn)哪種功能,判斷添加在那張“表”上
根據(jù)報(bào)文流經(jīng)的路徑,判斷添加在那個(gè)“鏈”上
- 到本主機(jī)某進(jìn)程的報(bào)文:PreRouting -> Input -> Process -> Output -> PostRouting
- 由本主機(jī)轉(zhuǎn)發(fā)的報(bào)文:PreRouting -> Forward -> PostRouting
對(duì)于每一條“鏈”上其“規(guī)則”的匹配順序锦茁,排列好檢查順序能有效的提高性能攘轩,因此隱含一定的法則:
- 同類規(guī)則(訪問同一應(yīng)用),匹配范圍小的放上面
- 不同類規(guī)則(訪問不同應(yīng)用)码俩,匹配到報(bào)文頻率大的放上面
- 將那些可由一條規(guī)則描述的多個(gè)規(guī)則合并為一個(gè)
- 設(shè)置默認(rèn)策略
同時(shí),也一定要注意稿存,在遠(yuǎn)程連接主機(jī)配置防火墻時(shí)注意:
- 不要把“鏈”的默認(rèn)策略修改為拒絕笨篷,因?yàn)橛锌赡芘渲檬』蛘咔宄胁呗院鬅o法遠(yuǎn)程到服務(wù)器,而是盡量使用規(guī)則條目配置默認(rèn)策略
- 為防止配置失誤策略把自己也拒掉瓣履,可在配置策略時(shí)設(shè)置計(jì)劃任務(wù)定時(shí)清除策略率翅,當(dāng)確定無誤后,關(guān)閉該計(jì)劃任務(wù)
七袖迎、iptables基本語法:iptables(選項(xiàng))(參數(shù))
- 選項(xiàng)
# 通用匹配:源地址目標(biāo)地址的匹配
-p:指定要匹配的數(shù)據(jù)包協(xié)議類型冕臭;
-s, --source [!] address[/mask] :把指定的一個(gè)/一組地址作為源地址,按此規(guī)則進(jìn)行過濾瓢棒。當(dāng)后面沒有 mask 時(shí)浴韭,address 是一個(gè)地址,比如:192.168.1.1脯宿;當(dāng) mask 指定時(shí)念颈,可以表示一組范圍內(nèi)的地址,比如:192.168.1.0/255.255.255.0连霉。
-d, --destination [!] address[/mask] :地址格式同上榴芳,但這里是指定地址為目的地址,按此進(jìn)行過濾跺撼。
-i, --in-interface [!] <網(wǎng)絡(luò)接口name> :指定數(shù)據(jù)包的來自來自網(wǎng)絡(luò)接口窟感,比如最常見的 eth0 。注意:它只對(duì) INPUT歉井,F(xiàn)ORWARD柿祈,PREROUTING 這三個(gè)鏈起作用。如果沒有指定此選項(xiàng)哩至, 說明可以來自任何一個(gè)網(wǎng)絡(luò)接口躏嚎。同前面類似,"!" 表示取反菩貌。
-o, --out-interface [!] <網(wǎng)絡(luò)接口name> :指定數(shù)據(jù)包出去的網(wǎng)絡(luò)接口卢佣。只對(duì) OUTPUT,F(xiàn)ORWARD箭阶,POSTROUTING 三個(gè)鏈起作用虚茶。
# 查看管理命令
-L, --list [chain] 列出鏈 chain 上面的所有規(guī)則戈鲁,如果沒有指定鏈,列出表上所有鏈的所有規(guī)則嘹叫。
# 規(guī)則管理命令
-A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規(guī)則婆殿,也就是說,這條規(guī)則會(huì)被放到最后待笑,最后才會(huì)被執(zhí)行鸣皂。規(guī)則是由后面的匹配來指定。
-I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規(guī)則暮蹂。如果指定的規(guī)則號(hào)是1寞缝,則在鏈的頭部插入。這也是默認(rèn)的情況仰泻,如果沒有指定規(guī)則號(hào)荆陆。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個(gè)或多個(gè)指定規(guī)則。
-R num:Replays替換/修改第幾條規(guī)則
# 鏈管理命令(這都是立即生效的)
-P, --policy chain target :為指定的鏈 chain 設(shè)置策略 target集侯。注意被啼,只有內(nèi)置的鏈才允許有策略,用戶自定義的是不允許的棠枉。
-F, --flush [chain] 清空指定鏈 chain 上面的所有規(guī)則浓体。如果沒有指定鏈,清空該表上所有鏈的所有規(guī)則辈讶。
-N, --new-chain chain 用指定的名字創(chuàng)建一個(gè)新的鏈命浴。
-X, --delete-chain [chain] :刪除指定的鏈,這個(gè)鏈必須沒有被其它任何規(guī)則引用贱除,而且這條上必須沒有任何規(guī)則生闲。如果沒有指定鏈名,則會(huì)刪除該表中所有非內(nèi)置的鏈月幌。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鏈碍讯。這并不會(huì)對(duì)鏈內(nèi)部照成任何影響。
-Z, --zero [chain] :把指定鏈扯躺,或者表中的所有鏈上的所有計(jì)數(shù)器清零捉兴。
-j, --jump target <指定目標(biāo)> :即滿足某條件時(shí)該執(zhí)行什么樣的動(dòng)作。target 可以是內(nèi)置的目標(biāo)录语,比如 ACCEPT轴术,也可以是用戶自定義的鏈。
-h:顯示幫助信息钦无;
- iptables參數(shù)說明:
參數(shù) | 作用 |
---|---|
-P | 設(shè)置默認(rèn)策略:iptables -P INPUT (DROP) |
-F | 清空規(guī)則鏈 |
-L | 查看規(guī)則鏈 |
-A | 在規(guī)則鏈的末尾加入新規(guī)則 |
-I | num 在規(guī)則鏈的頭部加入新規(guī)則 |
-D | num 刪除某一條規(guī)則 |
-s | 匹配來源地址IP/MASK,加嘆號(hào)”!“表示除這個(gè)IP外 |
-d | 匹配目標(biāo)地址 |
-i | 網(wǎng)卡名稱 匹配從這塊網(wǎng)卡流入的數(shù)據(jù) |
-o | 網(wǎng)卡名稱 匹配從這塊網(wǎng)卡流出的數(shù)據(jù) |
-p | 匹配協(xié)議,如tcp,udp,icmp |
–dport num | 匹配目標(biāo)端口號(hào) |
–sport num | 匹配來源端口號(hào) |
- 命令選項(xiàng)輸入順序:
iptables -t 表名 <-A/I/D/R> 規(guī)則鏈名 [規(guī)則號(hào)] <-i/o 網(wǎng)卡名> -p 協(xié)議名 <-s 源IP/源子網(wǎng)> --sport 源端口 <-d 目標(biāo)IP/目標(biāo)子網(wǎng)> --dport 目標(biāo)端口 -j 動(dòng)作