Linux防火墻實際指的是Linux下的Netfilter/Iptables。Netfilter/Iptables是2.4.x/2.6.x版本Linux內核集成的IP信息包過濾系統。
查看Linux內核版本
Netfilter/Iptables 信息包過濾系統可以當成一個整體,netfilter是內核的模塊實現,iptables是對上層操作工具。
Netfilter是Linux核心中的一個通用架構,工作于內核空間。
Netfilter支持一下方式對數據包進行分類:
其提供了一系列的表(tables),每個表由若干個鏈(chains)組成,每條鏈可以由一條或若干條規則(rules)組成,其規則由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
chain的本質是Netfilter定義的不同過濾點??偣捕x了5個過濾點。INPUT,FORWARDING,OUTPUT,PREROUTING,POSTROUTIONG。
Table的本質是Netfilter定義的不同功能的劃分。
filter用于執行基本過濾。
nat是對數據IP進行修改。
mangle是對數據包進行高級修改。
不同的Table只能用于特定的Chain。
Iptables 是一個管理內核包過濾的工具,可以用來配置核心包過濾表格中的規則。運行于用戶空間。
Linux防火墻在企業應用中非常有用,舉例如下:
綜述,Iptables有兩種應用模式:主機防火墻,NAT路由器。
規則(rules)是管理員預定義的條件,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作就是添加、修改和刪除這些規則。
鏈(chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。
每個鏈上都有默認的規則。
表(tables)提供特定的功能,iptables有4個表,即raw表、filter表、nat表和mangle表,分別用于實現包過濾,網絡地址轉換和包重構的功能。表中的規則寫在鏈上。
filter表
主要用于數據報文過濾。該表根據系統管理員預定義的一組規則過濾符合條件的數據包。對于防火墻而言,主要利用在filter表中指定的規則來實現對數據包的過濾。filter表是默認的表,如果沒有指定哪個表,iptables 就默認使用filter表來執行所有命令,filter表包含了INPUT鏈,RORWARD鏈,OUTPUT鏈。在filter表中只能允許對數據包進行接受,丟棄的操作,而無法對數據包進行更改。
nat表
主要用于網絡地址轉換NAT,該表可以實現一對一,一對多,多對多等NAT工作(SNAT,DNAT,PNAT),iptables就是使用該表實現共享上網的,NAT表包含了PREROUTING鏈,POSTROUTING鏈,OUTPUT鏈。
nat規則表擁有 prerouting 和 postrouting 兩個規則鏈,主要功能為進行一對一、一對多、多對多等網址轉換工作(SNAT,DNAT),由于轉換的特性,需進行目的地網址轉換的數據包,就不需要進行來源網址轉換,反之亦然,因此為了提升改寫封包的效率,在防火墻運作時,每個封包只會經過這個規則表一次。如果我們把數據包過濾的規則定義在這個數據表里,將會造成無法對同一包進行多次比對,因此這個規則表除了作網址轉換外,請不要做其它用途。
mangle表
主要用作功能修改數據報文的屬性。比如TCP報文的6個標志位。在內核版本2.4.18 后的linux版本中該表包含的鏈為:INPUT鏈(處理進入的數據包),RORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)POSTROUTING鏈(修改即將出去的數據包),PREROUTING鏈(修改即將到來的數據包)
mangle表主要用于對指定數據包進行更改,在內核版本2.4.18 后的linux版本中該表包含的鏈為:INPUT鏈(處理進入的數據包),RORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)POSTROUTING鏈(修改即將出去的數據包),PREROUTING鏈(修改即將到來的數據包)。
raw表
只使用在PREROUTING鏈和OUTPUT鏈上,優先級最高,可以對收到的數據包在連接跟蹤前進行處理。一但用戶使用了RAW表,在某個鏈上RAW表處理完后,將跳過NAT表和 ip_conntrack處理,即不再做地址轉換和數據包的鏈接跟蹤處理了。
規則表之間的優先順序:
raw > mangle > nat > filter
Linux防火墻的原理主要是對數據包的控制,看下圖(以下圖片均來自互聯網):netfilter五條鏈相互關系,即iptables數據包轉發流程圖。
(1)數據包進入網卡時,先進入PREROUTING(路由前)鏈,之后做路由判斷數據包應發往何處,本機或其他機器。
(2)若數據包原目標地址是本機的,數據包會前往INPUT鏈。到達INPUT鏈后,任何進程都會收到它。
(3)本機程序發送出數據包,數據包會經過OUTPUT鏈,然后到達POSTROUTING鏈輸出。
(4)若數據包原目標地址非本機,則需要轉發出去的,且內核允許轉發,數據包前往 FORWARD鏈,然后到達POSTROUTING(路由后)鏈輸出。
Netfilter在五個鏈上,使用HOOK技術做規則檢查。
iptables執行規則時,是從規則表中從上至下順序執行的。
若沒遇到匹配的規則,就一條一條往下匹配;
若完全沒有匹配的規則,則執行該鏈上的默認規則;
若遇到匹配的規則,則執行規則,執行后根據本規則的動作(accept,reject,log,drop等),決定下一步執行的情況,后續執行一般有三種情況:
透過這種機制所帶來的好處是,可以進行復雜、多重的封包過濾,簡單的說,iptables可以進行縱橫交錯式的過濾(tables)而非鏈狀過濾(chains)。
包的狀態依據IP所包含的協議不同而不同,但在內核外部,也就是用戶空間里,只有4種 狀態:NEW,ESTABLISHED,RELATED 和INVALID。它們主要是和狀態匹配一起使用。
數據包在用戶空間的狀態:
這些狀態可以一起使用,以便匹配數據包。這可以使防火墻非常強壯和有效。
iptables的實驗請盡量在虛擬機或非遠程的系統中操作,避免不小心的誤操作可能導致ssh無法使用。
一般來講,iptables防火墻已經內置于CentOS 6及其他Linux版本中,而且iptables服務默認都是啟動的。 iptables應用于IPv4, 如果要用IPv6,需要使用ip6tables。
iptables和ip6_tables、arp_tables一同都是建構在Xtables的架構下,這個方案讓系統管理員定義“表(tables)”、“鏈(chain)”、“規則(rules)”三個數據來處理數據包的運送。每一個“表”都和不同的數據包處理有關、決定數據包是否可以穿越的是“鏈”、而一條“規則”在鍵里面則可以決定是否送往下一條鏈(或其它的動作),這個處理可以在嵌套的結構里面重復使用。每一個網絡數據包從抵達到離開該計算機至少會經過一個鏈(亦即轉送或本機路由)。
查看有沒有安裝iptables:rpm -qa | grep iptables
若機器上安裝了man命令。則使用man iptables查看iptables的幫助文檔。
service iptables start #或 /etc/init.d/iptables start