原文鏈接:http://502245466.blog.51cto.com/7559397/1284707
iptables簡介
netfilter/iptables(簡稱爲iptables)組成Linux平臺下的包過濾防火牆,與大多數的Linux軟件一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案。它工作在網絡層,針對TCP/IP數據包實施過濾和限制,是典型的包過濾防火牆;它也可以實現網絡地址轉換(NAT)等功能
iptables的優點
netfilter/iptables的最大優點是它可以配置有狀態的防火牆。有狀態的防火牆能夠指定並記住爲發送或接收數據包所建立的連接狀態。防火牆可以從數據包的連接跟蹤狀態獲得該信息。在決定新的數據包過濾時,防火牆所使用的這些狀態信息可以增加其效率和速度。有四種有效狀態,分別爲:ESTABLISHED
(已建立的連接)、INVALID(非法或無法識別) 、NEW(已經或將啓動新的連接)和RELATED(正在啓動新連接)。另一個優點:用戶可以完全自己控制防火牆配置和數據包過濾,也可以定製自己的規則來滿足特定的需求,從而允許想要的網絡流量進入
iptables和netfilter有什麼關係呢?
netfilter和iptables通常都可以用來指的是Linux防火牆,但二者是有區別的,如:netfilter:是內核的一部分,指的是Linux內核中實現包過濾防火牆的內部結構,也稱爲"內核空間(kernelspace)",不以程序或文件的形式而存在;iptables:指的是管理Linux防火牆的命令工具,也被稱爲"用戶空間(userspace)",程序通常位於/sbin/iptables,由用戶直接使用,而我們經常使用的也就是iptables管理工具,而真正實現防火牆功能的是netfilter.
iptables基礎知識
規則(rules)也是就管理員定義的條件,規則一般的定義爲"如果數據包符合定義的條件,就按規則處理這個數據包",如果規則中沒有定義就匹配默認的策略。規則是存儲在內核空間的信息包過濾表中,這些規則分別定義了源地址、目標地址、傳輸協議(如TCP、ICMP、UDP)和服務類型(如HTTP、FTP、SMTP)等。當數據包與定義的規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如:允許(ACCEPT)、拒絕(REJECT)、丟棄(DROP)、目標地址轉換(DNAT)、源地址轉換(SNAT)、日誌(LOG)等
包過濾的工作層次:
主要是工作在網絡層,針對IP數據包,在對數據包內的IP地址、端口、內容等處理上,如下圖:
iptables傳輸數據包的過程
1、當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
2、如果數據包就是進入本機的,它會經過路由選擇到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。
3、如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。
數據流圖:PREROUTING -> INPUT -> OUTPUT -> POSTROUTING
iptables的規則鏈和表
規則表(tables):
iptables內置了4個表, 規則表之間的優先順序 RAW--MANGLE--NAT--FILTER
1).raw表:確定是否對數據包進行狀態跟蹤,些模塊用的不是太多;內核模塊:iptable_raw;包含兩個鏈:OUTPUT、PREROUTING
2).mangle表:爲數據包TOS(服務類型)、TTL(生命週期)值,或者爲數據包設置標記,以實現流量整形等高級應用,內核模塊:iptable_mangle;包含五個鏈:INPUT、OUTPUT、PREROUTING、POSTROUTING、FORWARD
3).nat表:實現網絡地址轉換(如:IP、端口),修改數據包中的源、目標IP地址或端口;內核模塊:iptable_nat;包含三個鏈:OUTPUT、POSTROUTING、PREROUTING
4).filter表:實現數據包過濾功能,內核模塊:iptable_filter;包含三個鏈:INPUT、OUTPUT、FORWARD
規則鏈(chains):
鏈是數據包傳播的路徑,每一條鏈其實就是衆多規則中的一個檢查列表,每一條鏈中可以有一條或多條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,檢查該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。默認有五種規則鏈:
INPUT: 處理進入的數據包
OUTPUT:處理出站的數據包
FORWARD:處理轉發數據包
POSTROUTING:路由選擇後處理數據包,做源地址轉換
PREROUTING:路由選擇前處理數據包,做目標地址轉換
規則鏈之間匹配順序分三種情況:
第一種情況:入站數據流向
從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),之後會進行路由選擇(判斷該數據包應該發往何處),如果數據包的目標主機是防火牆本機(比如說Internet用戶訪問防火牆主機中的web服務器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否允許通過等),通過以後再交給系統上層的應用程序(比如HTTPD服務器)進行響應。
第二衝情況:轉發數據流向
來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,之後會進行路由選擇,如果數據包的目標地址是其它外部地址(比如局域網用戶通過網關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然後再交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
第三種情況:出站數據流向
防火牆本機向外部地址發送的數據包(比如在防火牆主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,之後進行路由選擇,然後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
此處關鍵:Iptables採用“表”和“鏈”的分層結構。下面羅列一下這四張表和五個鏈。注意一定要明白這些表和鏈的關係及作用。
管理和設置iptables
iptables命令語法格式: iptables [-t 表名] 管理選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]
註釋:如果不指定表名,默認表示filter表;如果不指定鏈名,默認表示該表的所有鏈;除非設置規則鏈的缺少策略,否則都要指定匹配條件
目標:
DROP:丟棄
REJECT:拒絕
ACCEPT:允許
RETURN:返回跳轉
REDIRECT:端口重定向
DNAT:目標地址轉換
SNAT:源地址轉換
LOG:記錄日誌
MARK:打標記
iptables管理命令:
選擇表 |
-t |
指定表 |
添加新規則 |
-A |
在鏈的最後追加一條規則 |
|
-I |
在鏈的開頭或指定序號插入一條規則 |
|
-x |
顯示精確值,不做單位換算 |
替換規則 |
-R |
替換一條指定的規則 |
查看規則 |
-L |
列出所有規則 |
|
-n |
以數據形式顯示地址與端口信息 |
|
-v |
以更加詳細的方式顯示 |
|
--line-numbers |
查看規則時,顯示規則序號 |
刪除或清空規則 |
-D |
刪除指定序號的一條規則 |
|
-F |
清空指定表中的所有規則 |
設置默認策略 |
-P |
爲指定的鏈設置默認規則 |
新建規則鏈 |
-N |
新建自定義鏈 |
重命名鏈 |
-E |
重命名自定義鏈 |
刪除鏈 |
-X |
刪除自定義空鏈 |
|
-Z |
計數器清零 |
iptables的另外一機制:應用規則和刪除規則,具體操作和實現方法將在下一篇再詳細介紹。