iptables原理及规则
iptables簡介和原理
我們先來了解以下社么是防火墻?
防火墻:隔離功能,工作在網絡或主機邊緣,對進出網絡或主機的數據包基于一定的規則檢查,并在匹配某規則時由規則定義的行為進行處理的一組功能的組件,基本上的實現都是默認情況下關閉所有的通過型訪問,只開放允許訪問的策略
[ 防火墻的本質是對報文(包)進行過濾,通過過濾器對報文(包)按照特征來進行匹配,將匹配到的報文(包)進行處理,以此來進行過濾 ]
在linux中真正實現防火墻功能的是netfilter,它是一個抽象的框架,提供了一套hook函數的管理機制,并以此來對數據包進行管理。iptables是用來在用戶空間編寫防火墻規則的工具,用戶通過iptables以系統調用的方式來管理netfilter。
在內核中的五個hook function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),這五個hook function被放在數據包流過協議棧的五個關鍵點,以此來對數據包進行檢測和處理,而這五個hook function向用戶開放,用戶不能直接對內核中的hook function進行操作,但用戶可以通過一個命令工具iptables向其寫入規則,以系統調用的方式來將規則發送給hook function。
?
以下是剛剛提到的五個hook function:
NF_IP_PRE_ROUTING:剛剛進入網絡層的數據包通過此點(剛剛進行完版本號,校驗 和等檢測),源地址轉換在此點進行;IP_Input.c中IP_Rcv調用;
NF_IP_LOCAL_IN:經路由查找后,送往本機的通過此檢查點,INPUT包過濾在此點進行,IP_local_deliver中調用;
NF_IP_FORWARD:要轉發的包通過此檢測點,FORWORD包過濾在此點進行;
NF_IP_POST_ROUTING:所有馬上便要通過網絡設備出去的包通過此檢測點,內置的目的地址轉換功能(包括地址偽裝)在此點進行;
NF_IP_LOCAL_OUT:本機進程發出的包通過此檢測點,OUTPUT包過濾在此點進行。
?
了解完五個hook function,我們再來看看iptables的組成
iptables由五個表和五個鏈以及一些規則組成
hook function在執行規則時會一次性執行多條規則,hook執行的多條規則又按照所處的hook分為五個鏈,可以理解為hook所執行的為鏈,按照鏈中的規則從上至下以此執行。再把這些鏈按對數據包的操作或者功能分類,這樣每個功能下會含有多個鏈,這樣的一個功能類稱為一個表,每個hook function中以鏈為單位存放。五個表中不是所有表都擁有五個鏈。
簡單的來說hook function是框架,鏈是這個框架的內容,而表是鏈功能的劃分。表和hook function是兩個不同維度的東西。
?
接下來我們具體討論以下表和鏈
五個表table
filter:過濾規則表,根據預定義的規則過濾符合條件的數據包
nat:network address translation 地址轉換規則表
mangle:修改數據標記位規則表
raw:關閉NAT表上啟用的連接跟蹤機制,加快封包穿越防火墻速度
security:(用戶的自定義表)用于強制訪問控制(MAC)網絡規則,由Linux安全模塊(如SELinux)實現
優先級由高到低的順序為:security -->raw-->mangle-->nat-->filter
?
五個內置鏈chain
INPUT——進來的數據包應用此規則鏈中的策略
OUTPUT——外出的數據包應用此規則鏈中的策略
FORWARD——轉發數據包時應用此規則鏈中的策略
PREROUTING——對數據包作路由選擇前應用此鏈中的規則(所有的數據包進來的時侯都先由這個鏈處理)
POSTROUTING——對數據包作路由選擇后應用此鏈中的規則(所有的數據包出來的時侯都先由這個鏈處理)
?
每個表所含有的鏈
filter:過濾器,防火墻 (INPUTE,FORWARD,OUTPUT)
nat:network address translation(PREPOUTING,INPUTE,OUTPUT,POSTROUTING)
mangle:修改報文(PREROUTING,INPUTE,FORWARD,OUTPUT,POSTROUTING)
raw:連接追蹤功能(PREOUTING,OUTPUT)
?
了解完這些組成,我們來看一下iptables具體是如何運作的
當數據包(報文)進入主機后會有三種情況:
?
流入本機:PREROUTING --> INPUT-->用戶空間進程?
從外界到達防火墻的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),之后會進行路由選擇(判斷該數據包應該發往何處),如果數據包的目標主機是防火墻本機(比如說Internet用戶訪問防火墻主機中的web服務器的數據包),那么內核將其傳給INPUT鏈進行處理(決定是否允許通過等),通過以后再交給系統上層的應用程序(比如Apache服務器)進行響應。
?
流出本機:用戶空間進程 -->OUTPUT--> POSTROUTING?
防火墻本機向外部地址發送的數據包(比如在防火墻主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,之后進行路由選擇,然后傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
轉發:PREROUTING --> FORWARD --> POSTROUTI
來自外界的數據包到達防火墻后,首先被PREROUTING規則鏈處理,之后會進行路由選擇,如果數據包的目標地址是其它外部地址(比如局域網用戶通過網關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然后再交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
?
知道了原理那我們該如何配置iptables呢,這就是iptables的規則
iptables規則
規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作作出處理,規則分為匹配條件和處理動作兩部分
注意:規則要添加在鏈上,才生效
匹配條件:默認為與條件,同時滿足
基本匹配:IP
擴展匹配:通過復雜高級功能匹配(端口,TCP的Flags(SYN,ACK等)),擴展匹配又分為隱式擴展(tcp,udp,icmp)和顯式擴展(必須指定擴展模塊進行 的擴展)
處理動作:稱為target,跳轉目標
內建處理動作:ACCEPT(通過),DROP(拒絕并丟棄數據包,不回應),REJECT(拒絕但 回應對方拒絕的信息),SNAT,DNATMASQUERADE,MARK,LOG...
自定義處理動作:自定義chain,利用分類管理復雜情形
?
iptables規則語法
?
iptables [選項]
-t :指定表(不寫默認filter表)
規則管理
-A:add,向規則鏈中添加規則(放在規則鏈的最后)
-I:insert,向規則鏈中插入規則(如果不指定第幾條則默認插入到第一條)
-D :delete,刪除規則鏈中的某規則
-R :replace,替換規則鏈中的某規則
-F:flush,清空指定規則(不指定規則將清空正條連)
-Z:zero,歸零計數器(iptables的每條規則都有兩個計數器,匹配到的報文的個數和匹配到的所有報文的大小)
規則查看
-L:list,列出一個鏈的規則,不指定鏈則會顯示表中的全部規則(默認為filter)
-n:numberic,以數字格式顯示地址和端口號(不進行反解析,會大幅提高列出速,port為端口號,source和destination為ip,如果不寫n選項則會嘗試將port解析為服務名,source和destination解析為域名,降低效率)
-v:verbose,詳細信息(pkts匹配到的報文數總和,bytes匹配到的報文包的大小總和,target匹配成功后采取的措施,port匹配的協議,opt匹配的選項,in匹配的報文流入網卡,out匹配的報文流出網卡,source匹配報文來源,destination匹配報文的目標地址)
-vv:更詳細的信息
--line-number:顯示規則編號
-S :命令格式顯示鏈上規則
鏈管理
-N:new,新建一個自定義鏈
-X:刪除一個空且為被引用的鏈
-P:policy,指定一個鏈的默認規則(在沒條鏈后的括號內)
-E:重命名一個鏈
規則保存
iptables-save:將當前iptables配置打印到當前終端,我們一般會將其導入到文件中,以便以后直接導入,建議導入到/etc/sysconfig/iptables
完整命令:
存iptables-save>/etc/sysconfig/iptables
取iptables-save</etc/sysconfig/iptables
?
具體格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
**關于rule-specification
rule-specification是對規則的定義,其寫法為rule-specification = [matches...] [target]
其中matches是匹配模式,target為處理方式
matches:
matches分為基本匹配和擴展匹配,使用擴展匹配時需指定要加載的擴展模塊,擴展匹配又分為隱式擴展和顯式擴展,隱式擴展在使用-p選項指明了特定的協議時,無需再用-m選項指明擴展模塊,可以自動匹配擴展機制,不需要手動加載擴展模塊
-m matchname 指定擴展模塊(基本匹配和隱式擴展時省略)
基本匹配:
-s:指定源IP地址或網段
-d:指定目標IP地址或網段
-i:報文流入的接口(網卡),只能應用于數據報文流入環節,只應用于INPUT、FORWARD、PREROUTING鏈
-o:報文流出的接口(網卡),只能應用于數據報文流出的環節,只應用于FORWARD、OUTPUT、POSTROUTING鏈
擴展匹配:
-m 指定擴展的模塊
隱式擴展:(主要是協議,在指定協議時自動匹配模塊,因此不需要指定模塊)
-p:指定協議,可使用數字如0(all)
-p tcp
--sport,匹配報文來源端口
--dport,匹配報文目標端口
--tcp--flags mask comp,匹配標志位(mask可以為SYN,ACK,FIN,RST等用“,”分隔,comp為標志位必須為1的標志位
-p udp
--sport,匹配報文來源端口
--dport,匹配報文目標端口
-p icmp
--icmp-type,匹配響應報文的類型(請求報文為8,回應報文為0)
顯示擴展:
-m multiport(用于匹配離散的ip只能用于tcp/udp協議,因此要配合-p udp或-p tcp一起使用)
--deports,同時匹配多個離散的目標端口(“,”隔開“21:24”表示21號端口到24號端口,在multiport中算一個整體,當作一個端口)
--sports,同時匹配多個離散的來源端口
-m iprange(用來范圍匹配ip)
--src-range,匹配一個來源ip地址范圍(例如172.1.1.1-172.1.1.100)
--dst-range,匹配一個目標ip地址范圍
-m string(用來匹配字符串)
--algo,選用一個匹配的算法bm或kmp
--string,指定匹配的字符串,字符串需用引號引起
-m time(用來匹配時間,使用時注意檢查時區)
--timestart 指定起始時間(02:00:00)
--timestop 指定結束時間
--weekdays 指定一星期的某幾天(1,7為周一和周日)
--monthdays 指定一個月中的某幾天(10,20為10號和20號)
--datestart 指定起始日期(2018-01-01)
--datestop 指定結束日期
-m connlimit(限制每個ip鏈接到sever的數量)
--connlimit-above 鏈接數大于時匹配
--connlimit-upto 鏈接數下雨等于時匹配
--connlimit-mask 限制對應掩碼的ip鏈接數量(24)
-m limit(限制數據包進入的速度)
--limit 匹配一定時間內的包(10/minute每分鐘10個包,這樣設置后iptables會每6s匹配一個包)
-m mac(匹配mac地址)
--mac-source
-m state(匹配報文當前狀態,此擴展比較占用資源)
--state 匹配報文狀態
NEW:新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求
ESTABLISHED:NEW狀態之后,連接追蹤信息庫中為其建立的條目失效之前期間內所進行的通信狀態
RELATED:新發起的但與已有連接相關聯的連接,如:ftp協議中的數據連接與命令連接之間的關
INVALID:無效的連接,如flag標記不正確
UNTRACKED:未進行追蹤的連接如raw表中關閉
target:
ACCEPT:允許數據包通過
DROP:直接丟棄數據包,不進行任何回應
REJECT:拒絕數據包通過,但給予回應
RETURN:返回調用鏈
REDIRECT:端口重定向
LOG:記錄日志
MARK:做防火墻標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址偽裝
轉載于:https://www.cnblogs.com/bailandecheng/p/9866132.html
總結
以上是生活随笔為你收集整理的iptables原理及规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程可见性和关键字volatile
- 下一篇: 每秒钟承载600万订单级别的无锁并行计算