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