歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux防火牆之IPtables概念與用法

Linux防火牆之IPtables概念與用法

日期:2017/2/25 10:37:30   编辑:Linux教程

 防火牆典型的設置是有兩個網卡,一個流入,一個流出。iptables讀取流入和流出的數據包的報頭,然後將它們與規劃集(ruleset)相比較,然後將可接受的數據包從一個網卡轉發至另外一個網卡。對於被拒絕的數據包,可以被丟棄或者按照你所定義的方式來處理。

  通過向防火牆提供有關對來自某個源、到某個目的地或具有特定協議類型的信息包要做些什麼的指令的規則,控制信息包的過濾。通過使用iptables系統提供的特殊命令 iptables,建立這些規則,並將其添加到內核空間的特定信息包過濾表內的鏈中。關於添加、除去、編輯規則的命令的一般語法如下:

  iptables [-t table] command [match] [target]

  現實中,為了易讀,我們一般都用這種語法。大部分規則都是按這種語法寫的,因此,如果看到別人寫的規則,你很可能會發現用的也是這種語法。

  如果不想用標准的表,就要在[table]處指定表名。一般情況下沒有必要指定使用的表,因為iptables 默認使用filter表來執行所有的命令。也沒有必要非得在這裡指定表名,實際上幾乎可在規則的任何地方指定表名。當然,把表名放在開始處已經是約定俗成的標准。盡管命令總是放在開頭,或者是直接放在表名後面,我們也要考慮到底放在哪兒易讀。

  “command”告訴程序該做什麼,比如:插入一個規則,還是在鏈的末尾增加一個規則,還是刪除一個規則。下面會仔細地介紹。

  “match”細致地描述了包的某個特點,以使這個包區別於其它所有的包。在這裡,我們可以指定包的來源IP 地址、網絡接口、端口、協議類型,或者其他什麼。下面我們將會看到許多不同的match。

  最後是數據包的目標所在“target”。若數據包符合所有的match,內核就用target來處理它,或者說把包發往target。比如,我們可以讓內核把包發送到當前表中的其他鏈(可能是我們自己建立的),或者只是丟棄這個包而不做任何處理,或者向發送者返回某個特殊的應答。下面我們來逐個討論這些選項:

  表(table)

  [-t table]選項允許使用標准表之外的任何表。表是包含僅處理特定類型信息包的規則和鏈的信息包過濾表。有三種可用的表選項:filter、nat 和 mangle。該選項不是必需的,如果未指定,則filter用作缺省表。下面介紹各表實現的功能。

  filter

  filter 表用來過濾數據包,我們可以在任何時候匹配包並過濾它們。我們就是在這裡根據包的內容對包做DROP或ACCEPT的。當然,我們也可以預先在其他地方做些過濾,但是這個表才是設計用來過濾的。幾乎所有的target都可以在這兒使用。

  nat

  nat表的主要用處是網絡地址轉換,即Network Address Translation,縮寫為NAT。做過NAT操作的數據包的地址就被改變了,當然這種改變是根據我們的規則進行的。屬於一個流的包只會經過這個表一次。

  所有在內核中由netfilter的特定框架做的連接跟蹤稱作conntrack(就是connection tracking的首字母縮寫)。conntrack可以作為模塊安裝,也可以作為內核的一部分。大部分情況下,我們需要更詳細的連接跟蹤。因此,conntrack中有許多用來處理TCP、UDP或ICMP協議的部件。這些模塊從數據包中提取詳細的、唯一的信息,因此能保持對每一個數據流的跟蹤。這些信息也告知conntrack流當前的狀態。例如,UDP流一般由他們的目的地址、源地址、目的端口和源端口唯一確定。

  在以前的內核裡,我們可以打開或關閉重組功能。然而,自從iptables和netfilter,尤其是連接跟蹤被引入內核,這個選項就被取消了。因為沒有包的重組,連接跟蹤就不能正常工作。現在重組已經整合入conntrack,並且在conntrack啟動時自動啟動。不要關閉重組功能,除非你要關閉連接跟蹤。

  除了本地產生的包由OUTPUT鏈處理外,所有連接跟蹤都是在PREROUTING鏈裡進行處理的,意思就是說iptables會在PREROUTING鏈裡重新計算所有的狀態。如果我們發送一個流的初始化包,狀態就會在OUTPUT鏈裡被設置為NEW,當我們收到回應的包時,狀態就會在PREROUTING鏈裡被設置為ESTABLISHED。如果第一個包不是本地產生的,那就會在PREROUTING鏈裡被設置為NEW狀態。綜上所述,所有狀態的改變和計算都是在nat表中的PREROUTING鏈和OUTPUT鏈裡完成的。

  正如前面說的,包的狀態依據IP所包含的協議不同而不同,但在內核外部,也就是用戶空間裡,只有4種狀態:NEW、ESTABLISHED、RELATED和INVALID。它們主要是和狀態匹配一起使用。

  NEW

  NEW說明這個包是我們看到的第一個包。意思就是,這是conntrack模塊看到的某個連接第一個包,它即將被匹配了。比如,我們看到一個SYN包,是我們所留意的連接的第一個包,就要匹配它。第一個包也可能不是SYN包,但它仍會被認為是NEW狀態。

  ESTABLISHED

  ESTABLISHED已經注意到兩個方向上的數據傳輸,而且會繼續匹配這個連接的包。處於ESTABLISHED狀態的連接是非常容易理解的。只要發送並接到應答,連接就是ESTABLISHED的了。一個連接要從NEW變為ESTABLISHED,只需要接到應答包即可,不管這個包是發往防火牆的,還是要由防火牆轉發的。ICMP的錯誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我們所發出的信息的應答。

  RELATED

  RELATED是個比較麻煩的狀態。當一個連接和某個已處於ESTABLISHED狀態的連接有關系時,就被認為是RELATED的了。換句話說,一個連接要想是RELATED的,首先要有一個ESTABLISHED的連接。這個ESTABLISHED連接再產生一個主連接之外的連接,這個新的連接就是RELATED的了,當然前提是conntrack模塊要能理解RELATED。ftp是個很好的例子,FTP-data 連接就是和FTP-control有RELATED的。

  INVALID

  INVALID說明數據包不能被識別屬於哪個連接或沒有任何狀態。有幾個原因可以產生這種情況,比如,內存溢出,收到不知屬於哪個連接的ICMP錯誤信息。一般地,我們DROP這個狀態的任何東西。

  這些狀態可以一起使用,以便匹配數據包。這可以使我們的防火牆非常強壯和有效。以前,我們經常打開1024以上的所有端口來放行應答的數據。現在,有了狀態機制,就不需再這樣了。因為我們可以只開放那些有應答數據的端口,其他的都可以關閉。這樣就安全多了。


Copyright © Linux教程網 All Rights Reserved