iptables入門篇

一、 iptables簡介
1.1 什麼是iptables?
iptables是Linux防火牆工作在用戶空間的管理工具,是netfilter/iptables IP 信息包過濾系統是一部分,用來設置、維護和檢查Linux內核的IP數據包過濾規則。
1.2主要特點
1)列出數據包過濾器規則集的內容
2)添加/刪除/修改數據包過濾器規則集中的規則
3)列出/清零數據包過濾器規則集的每個規則計數器

二、 基本概念
iptables 可以檢測、修改、轉發、重定向和丟棄 IP 數據包。其代碼已經內置於內核中,並且按照不同的目的被組織成表(table)的集合。表由一組預先定義的鏈(chain)組成,鏈包含遍歷順序規則。每一條規則包含條件匹配和相應的動作(稱爲目標),如果條件匹配爲真,該動作會被執行。
下圖簡要描述了網絡數據包通過iptables的過程(只包含filter和nat表):
iptables入門篇
圖中在上面的小寫字母代表表,在下面的大寫字母代表鏈。從任何網絡端口進來的每一個 IP 數據包都要從上到下的穿過這張圖。一種常見的困擾是認爲 iptables 對從內部端口進入的數據包和從面向互聯網端口進入的數據包採取不同的處理方式,相反,iptabales 對從任何端口進入的數據包都會採取相同的處理方式。可以定義規則使 iptables 採取不同的方式對待從不同端口進入的數據包。當然一些數據包是用於本地進程的,因此在圖中表現爲從頂端進入,到 <Local Process> 停止,而另一些數據包是由本地進程生成的,因此在圖中表現爲從 <Local Process> 發出,一直向下穿過該流程圖。關於該流程圖如何工作的詳細解釋請參考《Iptables Tutorial》。
防火牆策略一般分爲兩種,一種叫通策略,一種叫堵策略。通策略,默認門是關着的,必須要定義誰能進。堵策略,門是打開的,但是你必須有身份認證,否則不能進。所以我們要定義,讓進來的進來,讓出去的出去,所以通,是要全通,而堵,則是要選擇。當我們定義的策略的時候,要分別定義多條功能,其中:定義數據包中允許或者不允許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。爲了讓這些功能交替工作,我們制定出了“表”這個定義,來定義、區分各種不同的工作功能和處理方式。

2.1表(tables)
iptables包含5張表(優先級爲:security > raw > mangle > nat > filter):

  1. filter表:用於存放所有有防火牆相關操作的默認表。
  2. nat表:用於網絡地址轉換(例如:DNAT和SNAT)
  3. mangle表:用於對特定數據包的修改
  4. raw表:用於配置數據包,raw中的數據包不會被系統跟蹤。
  5. security表:用於強制訪問控制網絡規則(例如:selinux—詳情可參考https://lwn.net/Articles/267140/),該表是後來加上的。
    在大多數情況下僅需要使用filter和nat,不會用到raw,mangle和security表,這三張表用於更復雜的情況——包括多路由和路由判定。
    2.2 鏈(chains)
    表由鏈組成,鏈是一些按順序排列的規則的列表。Iptables一共包含5條鏈:
  6. INPUT鏈:用於處理進入本機的數據包
  7. OUTPUT鏈:用於處理從本機輸出的數據包
  8. FORWARD鏈:用於轉發數據包
  9. PREROUTING鏈:用於在路由決策前對數據包做相關操作,經常用來做DNAT
  10. POSTROUTING鏈:用於在路由決策後對數據包做相關操作,經常用來做SNAT
    默認的filter表包含INPUT、OUTPUT和FORWARD 3條內建的鏈,這3條鏈作用於數據包過濾過程中的不同時間點,如下圖所示。nat表包含PREROUTING、POSTROUTING和OUTPUT鏈。mangle表包含PERROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD鏈。raw表包含PREROUTING和OUTPUT鏈。
    默認情況下,任何鏈中都沒有規則。可以向鏈中添加自己想用的規則。鏈的默認規則通常設置爲 ACCEPT,如果想要確保任何包都不能通過規則集,那麼可以重置爲 DROP。默認的規則總是在一條鏈的最後生效,所以在默認規則生效前數據包需要通過所有存在的規則。用戶可以加入自己定義的鏈,從而使規則集更有效並且易於修改。如何使用自定義鏈請參考《Simple stateful firewall》。
    默認的表、鏈結構示意圖如下:
    iptables入門篇
    2.3 規則(rules)
    數據包的過濾基於規則。規則由一個目標(數據包包匹配所有條件後的動作)和很多匹配(導致該規則可以應用的數據包所滿足的條件)指定。一個規則的典型匹配事項是數據包進入的端口(例如:eth0 或者 eth1)、數據包的類型(ICMP、TCP或者 UDP)和數據包的目的端口。
    目標使用 -j 或者 --jump 選項指定。目標可以是用戶定義的鏈(例如,如果條件匹配,跳轉到之後的用戶定義的鏈,繼續處理)、一個內置的特定目標或者是一個目標擴展。內置目標是 ACCEPT, DROP, QUEUE 和 RETURN,目標擴展是 REJECT 和 LOG。如果目標是內置目標,數據包的命運會立刻被決定並且在當前表的數據包的處理過程會停止。如果目標是用戶定義的鏈,並且數據包成功穿過第二條鏈,目標將移動到原始鏈中的下一個規則。目標擴展可以被終止(像內置目標一樣)或者不終止(像用戶定義鏈一樣)。
    數據包通過防火牆的時候是按順序匹配規則的,從上往下依次匹配,一個包不符合某條規則,就會由後面的規則來處理,如果都不符合,就由缺省的規則處理。
    2.4 遍歷鏈(Traversing Chains)
    下面的流程圖描述了在任何接口上收到的網絡數據包是按照怎樣的順序穿過表的交通管制鏈。第一個路由策略包括決定數據包的目的地是本地主機(這種情況下,數據包穿過 INPUT 鏈),還是其他主機(數據包穿過 FORWARD 鏈);中間的路由策略包括決定給傳出的數據包使用那個源地址、分配哪個接口;最後一個路由策略存在是因爲先前的mangle與nat鏈可能會改變數據包的路由信息。數據包通過路徑上的每一條鏈時,鏈中的每一條規則按順序匹配;無論何時匹配了一條規則,相應的 target/jump 動作將會執行。最常用的3個target是 ACCEPT, DROP ,或者jump到用戶自定義的鏈。內置的鏈有默認的策略,但是用戶自定義的鏈沒有默認的策略。在jump到的鏈中,若每一條規則都不能提供完全匹配,那麼數據包像這張圖片描述的一樣返回到調用鏈。在任何時候,若 DROP target 的規則實現完全匹配,那麼被匹配的數據包會被丟棄,不會進行進一步處理。如果一個數據包在鏈中被 ACCEPT,那麼它也會被所有的父鏈 ACCEPT,並且不再遍歷其他父鏈。然而,要注意的是,數據包還會以正常的方式繼續遍歷其他表中的其他鏈。
    iptables入門篇

2.5 模塊(modules)
有許多模塊可以用來擴展 iptables,例如 connlimit, conntrack, limit 和 recent。這些模塊增添了功能,可以進行更復雜的過濾。

三、 相關參數
3.1 語法
iptables(選項)(參數)
3.2 命令通用格式
iptables [-t tables] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
3.3 選項(options)
-t<表>:指定要操縱的表;
-A:向規則鏈中添加條目;
-D:從規則鏈中刪除條目;
-i:向規則鏈中插入條目;
-R:替換規則鏈中的條目;
-L:顯示規則鏈中已有的條目;
-F:清除規則鏈中已有的條目;
-Z:清空規則鏈中的數據包計算器和字節計數器;
-N:創建新的用戶自定義規則鏈;
-P:定義規則鏈中的默認目標;
-h:顯示幫助信息;
-p:指定要匹配的數據包協議類型;
-s:指定要匹配的數據包源ip地址;
-j<目標>:指定要跳轉的目標;
-i<網絡接口>:指定數據包進入本機的網絡接口;
-o<網絡接口>:指定數據包要離開本機所使用的網絡接口;
3.4 目標(target)
ACCEPT:接收數據包;
DROP:丟棄數據包,不返回響應信息;
REDIRECT:重定向、映射、透明代理;
SNAT:源地址轉換;
DNAT:目標地址轉換;
MASQUERADE:IP僞裝(NAT),用於ADSL;
LOG:日誌記錄;
MARK:做防火牆標記;
REJECT:拒絕數據包通過,必要時會給數據發送端一個響應信息;
QUEUE: 防火牆將數據包移交到用戶空間;
RETURN:防火牆停止執行當前鏈中的後續Rules,並返回到調用鏈;

四、 常見實例
4.1 查看iptables規則
iptables –nvL –t [filter|nat|mangle|raw] #默認查看filter表
4.2 清除iptables規則
iptables -F -t [filter|nat|mangle|raw] #默認清除filter表
4.3 清空規則鏈中的數據包計算器和字節計數器
iptables -Z -t [filter|nat|mangle|raw] #默認清除filter表
4.4 定義規則鏈中的默認目標(動作)
iptables -P INPUT DROP #定義filter表的INPUT鏈默認目標爲DROP
iptables -P FORWARD ACCEPT #定義filter表的FORWARD鏈默認目標爲ACCEPT
iptables -P OUTPUT ACCEPT #定義filter表的OUTPUT鏈默認目標爲ACCEPT
4.5 開放IP/協議/port
iptables -A INPUT -s 192.168.1.2 -j ACCEPT #允許源192.168.1.2的數據包進入本機
iptables -A INPUT -p ospf -j ACCEPT #允許所有ospf協議數據包進入本機
iptables -A INPUT -p icmp -j ACCEPT #允許所有icmp協議數據包進入本機
iptables -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT #允許本地迴環
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允許訪問22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允許訪問80端口
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允許已建立的或相關的數據包通行
iptables -A FORWARD -i eth0 -m set ! --match-set white_list src -j DROP #拒絕從eth0網卡進入,並且IP不在white_list中的數據包通過
4.6 記錄日誌
iptables -A PREROUTING -s 172.16.0.0/16 -i eth0 -j LOG #所有從eth0網卡進入的源172.16.0.0/16的數據包記錄在log日誌中
4.7啓動網絡轉發規則
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127 #讓內網192.168.188.0/24使用公網IP 210.14.67.127上網
4.8 防止SYN洪水***
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
4.9 限速
iptables -I INPUT -p tcp -i eth0 -s 192.168.12.2 -m limit --limit=5000/s --limit-burst=100 -j ACCEPT
iptables -I INPUT -p tcp -i eth0 -s 192.168.12.2 -j DROP

本文僅整理了iptables的基本概念及入門知識,旨在幫助大家快速瞭解和使用iptables。關於更多iptables的擴展和實踐部分將在後續篇章推出,未完待續…

參考文章:
https://en.wikipedia.org/wiki/Iptables
http://www.netfilter.org/projects/iptables/index.html
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章