iptables之一iptables-netfilter基礎

1、防火牆基本原理及網絡安全相關技術的引入

Firewall:防火牆,隔離工具;前端

   作一個不太正式但容易讓人理解的定義:防火牆是工做於主機或網絡的邊緣處,對於進出本主機或本地網絡的報文,根據事先定義好的檢查規則做匹配檢測,對於那些可以被檢查規則所匹配到的報文作出處理的組件;web

  須要注意的是:瀏覽器

  • 網絡攻擊當中的網絡的不安全潛在的危險因素一般都是一些攻擊報文,對於主動攻擊的無非就是發送一些通過特殊僞造的報文來對主機或網絡發起攻擊竊取資料。須要注意的是,防火牆和殺毒軟件是兩回事,防火牆主要是跟網絡攻擊相關,而對於本地的程序病毒是沒有太大的關聯性的或者嚴格意義上來說並非同一個東西;
  • 究竟是主機防火牆仍是網絡防火牆,這取決因而工做在主機邊緣爲一個主機提供服務仍是工做在網絡邊緣爲網絡提供服務的;

    防火牆分爲兩類:安全

      主機防火牆:服務器

      網絡防火牆:網絡

  

  防火牆工做在邊緣位置,這個邊緣必定是報文進出的地方纔能夠。對於Linux主機來說,TCP/IP協議棧是在內核中實現的,那防火牆對於一個主機來說應該工做在內核空間,由於全部進出本主機的報文都確定是經過TCP/IP協議棧來實現的。由於咱們如今互聯網上所用到的或者所用於實現通訊的組件無非就是TCP/IP協議的實現,而可以接受報文的硬件設備就是網卡而已,網卡做爲一個硬件設備來說也只有內核經過驅動程序能訪問到,因此說一個主機防火牆對於Linux而言應該放在內核空間的什麼地方呢?若是在網卡的驅動程序上的話那就簡單,但問題是網卡的驅動程序僅僅只能用來作驅動不能作防火牆,並且咱們也不該該讓驅動作防火牆,由於驅動自己只是讓硬件工做的,它對於報文自己沒有任何在協議層的理解。架構

  剛剛說過防火牆是對於進出本主機的報文根據事先定義好的規則作匹配檢測的,那麼這個規則是什麼呢?簡單來說,檢查一個報文的源IP、目標IP、源端口、目標端口等等。這些其實就是是咱們寫檢查規則基於的基本標準,那麼很顯然在驅動程序上它是沒法理解協議自己具有的意義的。由此,咱們這裏的防火牆應該在那些協議層次上可以理解協議的位置進行,所以在內核中TCP/IP協議棧上去放防火牆就能夠了。負載均衡

  可是TCP/IP協議棧不少,其中有TCP協議、IP協議等等,那咱們應該把防火牆放在哪一個對應的位置作檢測呢?首先咱們來分析一下,對於本機而言報文有幾種走向呢?對於一臺主機來說,咱們所能接受到的報文是別人發送過來進入到主機內部的報文,那麼接收進來的報文有兩種不一樣的走向。若是有報文發到本機上來了那就意味着目標地址多是本機,這是一種可能,目標地址是本機的全部報文本機的TCP/IP協議棧就應該拆封裝最終把這個請求根據對方所訪問到的目標端口送給註冊監聽在這個目標端口上的應用程序,因此這是第一種走勢;框架

    第二種走向,對方發送的報文的目標地址不是本機,但若是不是本機它爲何會把報文發送到本機上來呢?由於有可能一個主機把網關設爲了本機的網卡IP地址,這個時候主機把它的報文交給下一跳,由下一跳負責轉發,因此其目標地址不是本機,Linux網絡協議棧中有一個功能叫核心轉發(ipforward),若打開了核心轉發,那這個報文會根據咱們本機所理解的、所記錄的路由表選路之後有可能經過另一個網卡,也有可能經過本網卡從新發送出去了,這叫作轉發。收到之後只要本機打開了核心轉發功能並經過檢查本機路由表知道到達目標IP大概會通過下一個主機是誰,所以,他將轉發給下一跳,這就意味着有可能這個報文經過另一塊網卡出去了,那這個時候它並無進入本地的用戶空間所以跟本地用戶空間沒有關係。函數

    因此從上述分析咱們能夠知道,一個報文到達本機後可能有兩種不一樣的走向,一種是到本機內部來,另一種是經過本機的另一個接口甚至有多是本機的同一個接口(由於同一個接口上能夠配置n個IP地址)從新發送出去,在同一網絡中可能多個不一樣的網關或主機實現報文轉發的。這是報文到達本機的可能性。

    那考慮另一種情形,本機有沒有可能向外發送報文呢?像上述報文到達本機是別人訪問咱們或者通過咱們轉發的,那咱們做爲本機訪問別的主機是一種什麼樣的場景和情形呢?好比說本地打開瀏覽器訪問一個網站就是本機訪問別的主機的情形,這就是所謂的出去的報文,出去的報文不能直接經過用戶空間出去,而應該經過內核空間中的TCP/IP協議棧發出去。而發往TCP/IP協議棧後,這個主機發現本機有多個網絡接口,那就須要經過路由選擇一條通路最終決定從哪一個接口發出去。

    因此對於單個主機來說,報文就有這樣幾種流向,進入本主機的能夠到本地用戶空間的某個應用程序,也能夠經由本主機內核核心轉發通過其它接口發出去,還有一種情形就是本機內部的某個應用進程試圖跟外部的其它主機發起通訊時,它將經過本地的TCP/IP協議棧與其它主機通訊,那基於這幾種情形咱們應該把防火牆放在什麼位置呢?其實只放在一個位置是不能解決全部問題的,因此說咱們須要在整個TCP/IP協議棧上根據報文的不一樣流向分別進行不一樣情形下的檢查。例如:全部到達本機內部的就專門對這種報文作檢查、凡是從本機內部出去的咱們給它作檢查、凡是經由本機轉發的不會通過用戶空間這種狀況也須要在一個特定位置作檢查,因此雖然叫一個防火牆,但在TCP/IP協議棧內部咱們須要在三個報文不一樣流經的位置分別作檢查,這個咱們把它稱做防火牆框架,整個框架可能並不會由一個組件組成。

  因此所謂防火牆機制就是在內核由防火牆的設計者在TCP/IP協議棧上精心選擇了幾個卡點或者說報文必然流經的位置給它設置了多個鉤子函數,能夠想象一下鉤子函數就是一個吊鉤的意思,能夠想象成全部進出的人流都必然經由的這個位置,像咱們坐火車同樣要想進站和出站都得檢票。此處也有進口和出口的不一樣卡點,而鉤子函數就至關於一個檢票機或者檢票員,對任何一個經由此處的報文就由鉤子勾起來擋住,而後用規則一條一條比對檢查一下是否符合規則中定義的標準,若是符合某一個規則的標準,則通過那個規則後的處理方式作出相應處理便可

 

    對於Linux而言,咱們所提到的TCP/IP協議棧上對報文基於特定規則作處理時,不只僅須要防火有時候還須要額外的其它功能。由於防火牆未必能防火,在必定程度上來說,它可能對於某些特定規則或特定應用或特定報文給它假裝一下讓原本可以防着的卻又不防。因此有必要的時候,咱們有可能要對某些報文中的內容作一些修改,而不對其作防範檢查,僅僅是作一些額外處理等等。

    而nat(網絡地址轉換)其實就是轉換一個報文的源IP地址或者目標IP地址,另外pat(端口地址轉換)也就意味着還能夠改目標端口甚至是源端口的。那這種修改操做並非防火功能的。例如:若是檢查規則明確說明凡是來自於1.1.1.1的報文(報文源地址是1.1.1.1)都拒絕訪問本機,但這個規則應該是到本機內部時才能檢查,可是像這種報文若是咱們想悄無聲息的將源地址修改讓其繞過防火牆到達目的地,怎麼辦呢?是在規則檢查之後再改仍是規則檢查之前再改呢?報文對應相關內容的修改應該是在檢查發生之前更改,而報文的三種流向都不適合於進行更改,那麼應該放在哪進行更改呢?咱們應當知道的是無論報文是往哪去,在剛進入本機就進行匹配度檢測,事先作處理這是比較穩當的。此外還有一種情形,無論是從本機內部出來的仍是經由本機轉發的,任何報文要想經過本機,不管經由哪一塊網卡要離開本機了,都要進行攔截,那應該怎麼實現呢?

    所以,對於整個主機的防火牆來說,這裏所設置的卡哨或設置的規則檢查匹配度,爲了輔助這三個位置工做,須要在先後兩方設置兩個卡點,可以對那些剛剛進入本機或立刻要離開本機的報文進行處理。因此說對應一個本機的防火牆內部的實現構建是它大致上須要實現這麼一個框架纔可以完成咱們所描述的防火功能的。

 

    上述咱們描述主機防火牆所考慮的問題,那網絡防火牆呢?

  網絡防火牆就意味着卡點不能放在一個主機上了,主機防火牆只須要一個主機在內部的內核的TCP/IP協議棧內部去選擇5個卡點,從本機出來的、到達本機內部的、經由本機轉發的均可以作一些規則檢查,而那些剛剛進入本機或要從本機出去了須要實現作兩個卡點,這就是5個卡點。

  但問題是如今咱們面臨的防火牆不是單臺主機了,而是整個網絡,一個網絡內部有不少主機,而且有能力在單個主機上自行設定防火牆能力的人很少。因此咱們最好可以替它們作好防禦工做。那也就意味着咱們對整個網絡進出口的這個位置給它專門設置一個可以對進出本網絡的報文的防火牆,經由這個防火牆作一下檢測。這個防火牆首先它應該是一個獨立的硬件設備,固然它起到防火功能的有多是內部的硬件設定,也有多是在硬件設備上編寫的規則,這是必然的。可是這個設備它應該是什麼呢?是一個Linux主機可不能夠呢?此外還需考慮一個問題,若出現內網中的兩臺主機相互攻擊呢?此時防火牆是沒有起到做用的,因此防火牆在實現防火時,必定只能對那些經由本主機的報文作檢測。

    若是本地內網有一個服務器,而內網有一臺主機對發起了攻擊,此時防火牆是沒有用的,所以首先網絡上應該有一個端口防火牆,先過濾一部分報文防範外部攻擊。然而每一臺主機可能須要防範的規則和標準是不同的,所以每一臺主機須要有防火牆用來防範內部攻擊,固然也能達到防範外部攻擊。

    固然防火牆規則是死的,可是若是實現有些新奇的攻擊方式咱們實現未添加防範規則該怎麼辦呢?咱們不能對全部訪問本主機的報文都拒之門外,這樣做爲服務器的意義就不復存在了。所以咱們做爲主機來說填進去的防火規則必定是隻能防範那些已知的、事先可以理解到的、認爲可能存在的攻擊,寫的規則也是寫死的。而若是有些人通過巧妙假裝後,它讓本身的行爲看上去並不是攻擊行爲,將其放行到本地網絡或本機內部後當即原形畢露,竊取數據、攻擊服務,該怎麼辦呢?防火牆就一籌莫展了,由於設計的規則檢查沒辦法防範這個東西,因此對於任何一個進出的報文,咱們壓根檢測不了,可是它卻作出了破壞性的行爲。(須要注意的是,網絡攻擊跟毒是兩碼事,好比說訪問一個文件,跟殺毒沒有關係)

   因此沒有萬無一失的安全性,其實咱們也能夠這樣作,假如說一個用戶它潛入到網絡或主機中來,以Web服務器爲例,咱們對它的指望是僅僅是讓它訪問Web服務器下的頁面,可是它卻訪問了其它頁面,咱們就能夠認爲這是一個不軌行爲。由此說咱們能夠有事先定義好的有一些所謂的行爲偵測機制可以識別出所謂它作出了不軌行爲,這個時候當即進入防火牆,告訴它把這個報文擋在門外不要讓它再訪問了。所以咱們必需要有一套額外的系統能檢測或區辯出什麼樣的行爲叫做不軌行爲,而這種系統就叫做入侵檢測系統(IDS)。一個進程在本地主機內部訪問數據是根據咱們界定的正常範圍法則內它的正常訪問咱們都是容許的,但若是它一旦作出一些不軌行爲系統是都能當即探測的到的,可是須要注意的是,入侵檢測系統僅可以檢測到入侵

    而IDS若是說它可以發現偵測到所謂的攻擊行爲,並將這個攻擊行爲通告給Firewall,若是Firewall在這個條件觸發之後能自行再生成一條規則,把這種所謂有潛在攻擊行爲的報文給拒之門外,因而它就能實現叫入侵檢測和防火牆聯動所實現的功能,若是而這兩個能合起來的話,就稱爲IPS(入侵防護系統)。但不是全部的IDS都能跟Firewall聯動起來的通常來說,IDS若是沒有能力通知給Firewall並觸發Firewall添加規則直接可以自動的把那些攻擊行爲的報文擋在門外的話,那能夠有一個簡單的方式,就是IDS檢測攻擊後它可以觸發報警,怎麼觸發呢?一旦發現有攻擊行爲它趕忙發一封郵件給管理員,這是一個比較穩當的作法,可是這種作法有滯後性,因此若是它能通知給Firewall是最理想的狀態。

 

IDS有兩種常見的實現:

  • HIDS:主機入侵檢測系統,工做在主機上,只須要在單臺主機上部署。
  • NIDS:網絡入侵檢測系統,工做在網絡通道上,一般須要在網絡中的多個位置部署傳感器。能夠在每個關鍵性的服務器以前的任何報文進出的位置給它部署一個傳感器等等。

 

蜜罐:

    可是對於IDS與IPS而言,它們也只是在用戶發出攻擊行爲之後才能作出反應的。那若是要想對某些疑似攻擊的報文進行處理的話,可經過「釣魚之法」,所以咱們未來也能夠在網絡內部部署一個honeypot(蜜罐)

 

2、iptables相關概念

  iptables防火牆一般稱爲包過濾型防火牆,即只是對包的TCP或IP或UDP首部作檢測、匹配等完成過濾的,因此被稱爲包過濾型防火牆。

 

  思考一下,iptables是什麼呢?咱們已經知道防火牆是工做在內核中的,即防火牆應該是內核中所實現的功能,而咱們在使用iptables時,使用的是它的命令,可是既然咱們能夠把它當命令使用,那它會是內核中的東西嗎?想象一下,咱們能夠將內核模塊當命令使用嗎?顯然是不可能將內核自己的某個模塊當作命令使用,所以iptables不是內核中的防火牆。那iptables是什麼呢?

    咱們說過,要想實如今主機上完成防火牆的功能,意味着須要在內核中的TCP/IP協議棧上的數據報文流經的位置設置幾個鉤子,可以把那個對應的報文勾起來經過規則來檢測,若是說沒有這麼一個鉤子的話,首先,何處放規則?其次,規則放上去也是沒用的。由此,咱們所說的iptables實際上是由兩個部分組成的:

  •   iptables
  •   netfilter

  其實,iptables的全稱叫作iptables/netfilter;

    而咱們說的內核中設置了5個鉤子,這5個位置所實現的叫一個框架(framework,內核中的網絡報文過濾或處理框架),而netfilter就是這麼一個內核TCP/IP協議棧內部所實現的網絡過濾器的框架,說白了就是由它來負責提供鉤子(hook),對於網絡中的功能,鉤子就是一些函數,稱爲鉤子函數(hook function)

  而iptables用來作什麼呢?有鉤子僅僅能把報文勾起來,但這個報文到底符不符合某個匹配規則、若是匹配之後對於它作什麼樣的處理呢,因此規則纔是真正負責檢查並完成過濾或完成防火功能的組件。可是這個規則必須可以放置在恰當位置才能發揮做用的,咱們能夠想象成iptables就是負責向這5個鉤子上添加、刪除、修改規則的。因此iptables是一個規則管理工具(rule utils)

    站在這個角度來想,iptables是工做在用戶空間的程序,netfilter纔是真正可以實現防火牆的框架,可是兩者誰離開誰都不能夠,由於這5個鉤子只是可以實現讓至少選擇這5個位置的任何一個報文經由、到達本機、從本機出發時必然會經由某一個位置,這幾個卡哨作好之後並無特別多的做用,由於最多隻是咱們已經界定報文應該流經什麼位置。而真正可以發揮所謂網絡防火牆或主機防火牆的功能的,是咱們須要在這個位置上添加許許多多的檢查規則,並一旦匹配到規則後作出相應處理,這纔是應該要完備的功能。因此咱們說netfilter是內核中自己就具有的框架,一旦咱們想讓它實現防火,那咱們就使用iptables寫一個規則把它扔到這個框架上去就能當即發揮做用了。

    可是內核的某個功能發揮做用和應用程序發揮做用實現方式其實還不同的,一個應用程序只有運行起來才能發揮做用,就像咱們啓動一個web服務,把httpd進程運行起來才能接收客戶端訪問,可是並無把內核啓動起來的概念,其實只要主機處於運行當中,內核就處於運行當中,因此iptables所寫的規則只要將其扔到這個規則netfilter中去,它就會當即發揮做用了。而運行中的內核是在內存中的,那咱們扔這個規則實際上是把它扔到內存中去了。那也就意味着一關機的話扔的規則就沒有了,因而爲了讓之後都有效就須要將iptables命令寫成腳本,開機的時候讓它自動運行這個腳本便可。

    所以咱們在開機的時候啓動防火牆並非將它啓動爲何服務的,而僅僅是讓這些規則從新生成一遍僅此而已。因此防火牆歷來都不是服務,它不會啓動進程,但爲了統一管理,在CentOS 6上咱們依然將它叫作iptables服務,但它真正發揮做用在開機啓動時無非就是把一個規則文件給它從新生效一次,它沒有運行任何進程由於它不須要進程,它是在內核上發揮做用的。

 

鏈:

  5個鉤子函數有特定的學術稱呼,咱們在添加規則時,要想扔一條規則到防火牆上,應該扔在什麼位置,這5個的哪一個位置呢?這須要看目的,是打算去限制本機訪問別人、仍是限制別人訪問本機、仍是限制那些報文經由本機轉發時能不能轉發,所以咱們扔的位置應該是不一樣的,這也就意味着咱們在寫iptables規則時應該寫明這個規則將其放在這5個鉤子函數的哪一個鉤子上。因此就須要利用某一個名稱來引用這個鉤子以至於未來規則添加到哪一個鉤子上,因此在iptables的名稱上下文或名稱空間中,這5個鉤子函數各有一個名稱,它們被稱爲一個

  可是爲何被稱爲鏈呢?咱們須要瞭解一下iptables的前身。

    其實早些時候,Linux上是沒有內核中的軟件防火牆的,而著名的Unix發行版BSD系統中有一項叫作Open BSD,它的主要着眼點爲安全,被稱爲最安全的BSD發行版,Open BSD中各類安全體系作的很是完善。那個時候Linux剛誕生不就尚未防火牆,因此Linux就借鑑了Open BSD內部防火牆實現機制,模仿它們在內核中也實現了一個,早些時候叫ipfw,固然它也有本身內核中的框架,那個時候框架很簡單,尚未成體系。那個時候仍是在Linux2.0左右,而過一段時間,人們發現ipfw這種實現機制太粗淺,因而就把這個在內核中實現的這種防火牆經過添加規則的方式來完成防火功能,規則多了,穿起來就像鏈了,這個時候叫作ipchains。後來人們又發現,爲了可以充分擴展防火牆的功能,所以使得防火牆在上,首先咱們設了5個卡哨,其次每一個卡哨上面它所實現的功能還不止一個,如在由本機內部報文發出的這個位置能夠對其作過濾,即檢查規則是否符合條件,若是符合,容許訪問與不容許訪問這叫過濾,或者是檢查報文符不符合規則,若是符合規則把它的地址改一改這叫作地址轉換,而過濾和地址轉換是兩種大相徑庭甚至是相去甚遠的功能。所以這兩種功能的鏈不能放在一塊兒發揮做用,它們雖然都放在一個鉤子上,但它們都屬於兩種不一樣的功能。這就意味着結果就成了在一個鉤子上就有了兩個鏈,每個功能用一個鏈。而這兩個功能到底誰先誰後呢?所以它們也應該有優先級關係,不過怎麼講,每一種功能都要單獨的發揮完做用後才能讓另一個功能發揮做用。而每個功能均可能有多條規則,那最終就是每個鉤子上就實現了多個行和多個列組成的表,ipchains就發展成了iptables,這就是iptables的由來。

    因此從這個角度來說,iptables之因此叫tables是由於它所實現的功能有不少。

 

iptables的功能:(能夠理解成規則的分類)

  注意:每一種功能它們都有可能須要在這5個鉤子函數的某一個位置發揮做用;

  • filter過濾;最根本的功能,這是被稱爲防火牆的賴以生存的根本。
  • nat:network address translation,網絡地址轉換;若是工做在網絡地址轉換這種模式的話,從這個角度講,iptables這個主機更像是一個nat服務器。(nat是用來改源IP、源端口、目標IP、目標端口的)
  • mangle拆解報文,作出修改,封裝報文;把一個報文拆開後,除了地址轉換外,其它可轉換的部分均可以拿來作修改。
  • raw:關閉nat表上啓用的鏈接追蹤機制;是nat功能的一種補充;要想完成nat功能須要啓動鏈接追蹤功能才能進行作nat地址轉換,而若是關閉了nat追蹤機制的話,接下來可能在有些地方就會產生一些問題,因此raw功能用的並非特別的多。

    另外對於網絡防火牆來說,鏈接追蹤功能是很是有用的功能。鏈接追蹤就是可以去識別曾經訪問過本主機或本網絡的主機或報文的這樣一種機制,即識別此前訪問過本機或本網絡的報文,對於咱們的主機來講,若是要想能追蹤每個鏈接,那就須要創建一個很是龐大的追蹤表才能夠,對於一個很是繁忙的前端負載均衡服務器若是每個鏈接都要作追蹤的話,要想追蹤鏈接就要將其記下來,記下來就須要內存空間,結果可能會致使內存空間溢出,一旦溢出,新的鏈接就不能進來了。所以爲了追蹤就須要記錄,而新鏈接來了,記錄下來了,那第一次訪問都不容許了。因此對於很是繁忙的前端負載均衡服務器,鏈接追蹤功能是萬萬不能開啓的,若是不得不啓用,準備好足夠大的內存而且將鏈接追蹤功能的所可以承受功能的調到足夠大才能夠。

 

5個鉤子函數在iptables的名稱空間當中,它有一種稱呼分別是:(被稱爲5個內置

  •    PREROUTING
  •    INPUT
  •    FORWARD
  •    OUTPUT
  •    POSTROUTING

  報文剛剛到達本機後是發往本機內部仍是經由本機轉發的,須要做出判斷,能夠根據目標地址檢查路由表來判斷,這也就意味着接下來有一個路由功能要實現,即有一個路由選擇的過程。而這個位置在路由選擇發生以前就要完成,因此稱爲PREROUTING

    一旦PREROUTING結束了,報文就有兩個走向,第一,要麼是到本機內部,第二要麼是通過本機轉發。這兩種情形,到本機內部有一個專門的鉤子叫INPUT,經由本機轉發稱爲FORWARD

    而對於一個網卡來說,若將其看成是報文流出的接口,那報文要經過這個網卡流出時的來源有兩種可能,第一種是轉發然後出去的,第二種是由本機內部發出的。而本機內部發出的稱爲OUTPUT

    不管是由本地轉發的仍是經由本機內部發出的,未來它在離開本機以前須要再作一次路由選擇,那就意味着路由選擇發生之後要走哪條路就肯定了。那第二次路由決策發生之後咱們要對其作一些即將離開本機以前最後那一關再給它作一些處理,這就叫POSTROUTING,這是第二次路由決策發生之後用於作出處理的。

    其實無論是PREROUTING也好,仍是POSTROUTING也罷,其實它們跟網卡無關,從哪一個網卡進來在路由發生以前都叫PREROUTING,不管即將經過哪一個網卡離開,在路由決策發生之後都叫POSTROUTING。因此它們跟網卡是沒有什麼關係的,它們只是TCP/IP協議棧上的功能,能夠從任意一個網卡離開,從任意一個網卡進來。

 

    咱們再想一個問題,若是說在這個FORWARD上,它既然是轉發的,那麼在這裏添加規則的目的是什麼呢?定義哪些能夠轉發,哪些不能夠轉發,那爲何轉發時要作限制呢?這其實就是網絡防火牆的意義了,iptables也能夠用來扮演網絡防火牆的角色,怎麼扮演呢?把它的規則定義在FORWARD上,若是這個時候公司裏只有一個主機或一根網線可以跟外部網絡通訊,而後把這個網線接到Linux主機上。內網全部主機都把這個Linux主機的內網網卡當網關,那就意味着全部的報文只要跟非本地網絡的通訊都要通過它,那咱們就能夠在它上面的訪問列表上作好規則了,好比能訪問或者不能訪問QQ等等這一系列規則均可以在上面進行定義,並且咱們對應哪些容許經過的主機都給它放行,哪些不容許經過的通通拒絕掉,那就能實現所謂的網絡防火牆的功能了。

    所以iptables能夠扮演本地主機防火牆利用INPUT鏈、OUTPUT鏈便可,而又能扮演網絡防火牆利用FORWARD鏈便可

    那麼爲何須要硬件防火牆呢?全部內網的主機任何一個報文都通過本機跟非本地主機通訊時就意味着每個報文本機都要轉發,所以轉發的過程它要進行檢測,效率會很是低,尤爲是規則很是多時。還有一點就是iptables它的防火牆功能是在純軟件的基礎上實現的,即使是內核級別實現它也是軟件,有不少硬件防火牆它們的CPU在設計上在硬件級別就能夠完成報文的拆分和封裝。能讓軟件實現的好處在於能夠改軟件到達靈活修改的目的,可是硬件級別能實現的防火牆功能不須要軟件參與,它的性能要好不少,因此有些硬件防火牆它可以將網絡協議棧的原本是軟件實現的某些功能基於硬件實現,從而大大提升了工做效率,而這個CPU一般都是專門設計的並且有特定架構,跟X86平臺不是同一種架構。那既然是特定定製的又用於特殊目的的話一般代價很是昂貴,固然並非硬件能完成全部功能,不少硬件防火牆同樣須要在裏面寫規則,有些較高級的應用啓動規則檢查而且須要本身編輯添加規則了,不過它在較底層次上的某些報文處理功能的確在硬件層次上實現了,因此性能會很是高。

 

    netfilter在內核中設置了5個參考點,而iptables爲了能引用這5個參考點,咱們能夠經過PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING來引用它們,而引用時用到的引用機制分爲了4種不一樣的功能,每個功能均可能會在這些鏈上來實現,如:filter會用到INPUT、FORWARD、OUTPUT,而mangle則會用到這5個。這就是爲何每個鏈最終會成爲iptables的緣由,由於每個鏈上都有可能添加n種功能的規則,每一種功能都叫作一個鏈,那多個鏈結合起來就至關於一個TABLE了。

 

總結報文流向以此來看如何寫規則來完成真正防火牆的功能:

  首先,全部報文大概就分爲三種:

  •     流入(當作進入本機內部的):全部流入的報文只要到了本機內部先經過PREROUTING,那PREROUTING發出後,隨後但凡到達本機內部的會經由INPUT。PREROUTING --> INPUT
  •     流出(當作本機發出的):OUTPUT --> POSTROUTING
  •     轉發(屬於流出、流出的一種,由本機進來又由本機出去的):PREROUTING --> FORWARD --> POSTROUTING

    因此流入、流出、轉發它們所經由的位置不同,這一點相當重要,由於咱們添加規則時要打算對哪種報文作檢測那就在在它流經的位置上添加規則,如咱們想不讓某個報文出去在INPUT上沒有任何做用,因此對於報文流入流出所通過的路徑必定要作到心中有數,而且還須要在功能上對其做區分。

 

各功能的分別實現的位置:

   filter:INPUT、FORWARD、OUTPUT

   nat:PREROUTING(DNAT,目標地址轉換)、OUTPUT(SNAT,源地址轉換)、POSTROUTING(SNAT,源地址轉換),在其它地方實現nat是沒有必要也是不該該的並且就連OUTPUT都不多用,對咱們來說,實現地址轉換一般只有兩個鏈PREROUTING和POSTROUTING。

   mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

   raw:PREROUTING、OUTPUT

  這樣一來就意味着咱們寫規則時,第一既要先想明白使用的是什麼功能,而後決定放在哪張表上,每一個功能要有一張表,filter叫filter表,nat叫nat表,mangle叫mangle表;第二,還要明確的定義好咱們應該放在對應表的哪一個鏈(位置)上,要根據報文流經的方向來肯定。

 

路由發生的時刻:

  •     報文進入本機後:

       判斷目標主機(是否爲本機);

  •     報文發出以前:

       判斷經由哪一個接口送往下一跳;

 

小結:

iptables一共有四表五鏈

    添加規則的考量點:

(1)  要實現哪一種功能(說白了就是作什麼,是作過濾呢,仍是作地址轉換):判斷添加在哪張表上;

(2)  報文流經的路徑:判斷添加在哪一個鏈上;

 

    咱們說過在一個鏈上有n條規則,不然不能稱之爲鏈,那這些規則檢查時自上而下進行檢查,若是說某一規則匹配到了或生效了怎麼辦?其它還要不要作檢查?咱們如何重啓這種檢查機制?因此還需注意對於鏈而言,鏈上的規則次序即爲檢查的次序(因此這個次序就相當重要了);所以它內部隱含必定法則:

    (1)同類規則(訪問統一應用),匹配範圍小的放上面;規則檢查時自上而下的,並且有些規則是一旦被第一條規則處理了,日後就再也不檢查了,這就意味着效率提高了,若是每一次檢查都是檢查到最後,被最後一條規則匹配了,那前面的檢查就白費了,那咱們能夠認爲讓那些儘量越優先應該被匹配到的規則越往前放或者越有可能被匹配到的規則越往前放;

    (2)不一樣類規則(訪問不一樣應用),匹配到報文頻率較大的放上面;

    (3)將那些可由一條規則描述的多個規則合併爲一個;

    (4)設置默認策略;

       白名單:默認爲拒絕,只容許咱們指定的訪問;

       黑名單:默認爲容許,只拒絕那些咱們明確指定的訪問;

           這兩種名單中,白名單相對要安全的多,因此建議使用白名單

 

    再考慮一個問題,在同一個鉤子上有可能設置了多種不一樣功能的多個規則,因而造成了多個鏈,這多個鏈誰先發揮做用誰後發揮做用呢?是先作filter後作nat仍是先作nat後作filter,這實際上是由既定法則在裏頭的,規則生效是有既定次序的:

  功能的優先級次序:raw --> mangle --> nat --> filter

 

規則:

  報文匹配規則,真正發揮做用的既不是iptables自己也不是netfilter自己,而是咱們添加進去的規則在發揮做用;

  規則的組成部分(主要有兩類):

  •   報文的匹配條件(只有對那些能匹配到指定的規則條件的才能作處理)
  •   匹配到以後的處理機制或動做

   匹配條件:根據協議報文特徵指定匹配條件

    匹配條件的機制或編寫格式:

    •   基本匹配條件(只檢查最根本的幾項源IP、源端口之類的)
    •   擴展匹配條件(想檢查更嚴格一些,如:作鏈接追蹤、轉態追蹤、甚至根據Mac地址作追蹤、甚至能檢查一些應用層的特性等等)

   處理動做:(兩種方式)

  •   內建處理機制(如:以過濾功能爲例,匹配到的就丟棄或拒絕)
  •   自定義處理機制(自定義處理機制僅僅可以指明跳轉目標,說白了就是能夠自定義鏈匹配到後轉到自定義的鏈上去。自定義的鏈不可能跟整個netfilter的某個鉤子函數相對應,如PREROUTING就跟鉤子函數PRETOUTING相對應,但自定義的鏈沒辦法對應,不對應的話報文就不可能流經指定的位置,那怎麼辦呢?沒有辦法,就只能在它必然流經的位置調用自定義的鏈)

  注意:報文不會通過自定義鏈,所以自定義鏈要想發揮做用,只能在內置鏈上經過規則引用後生效;說白了就是經過自定義處理機制進行引用;

相關文章
相關標籤/搜索