前言
防火墻工作與主機(jī)或者網(wǎng)絡(luò)邊緣箱歧,對(duì)于進(jìn)出本主機(jī)或本網(wǎng)絡(luò)的報(bào)文根據(jù)事先的檢查規(guī)則做匹配檢查矾飞,對(duì)于能夠匹配上的數(shù)據(jù)包做出相應(yīng)處理動(dòng)作。
在防火墻的工作范圍可以分為“主機(jī)防火墻”和“網(wǎng)絡(luò)防火墻”主機(jī)防火墻主要作用于在進(jìn)入或流出本機(jī)的報(bào)文呀邢;網(wǎng)絡(luò)防火墻通常設(shè)置在網(wǎng)關(guān)位置洒沦,對(duì)進(jìn)出或流出本網(wǎng)絡(luò)的數(shù)據(jù)包進(jìn)行檢驗(yàn),現(xiàn)在很多的硬件防火墻驼鹅,大部分都用作網(wǎng)絡(luò)防火墻微谓,用于保護(hù)本地整個(gè)網(wǎng)絡(luò),而網(wǎng)絡(luò)防火墻也由硬件和軟件之分输钩,不差錢的看中效率的很多都會(huì)去選擇硬件防火墻豺型,但其實(shí)軟件和硬件防火墻的作用和原理都是差不多的。
在鏈路層买乃、網(wǎng)絡(luò)層姻氨、傳輸層和應(yīng)用層都可以使用防火墻進(jìn)行判斷是否處理。
在鏈路層剪验,防火墻可以對(duì)MAC地址進(jìn)行控制肴焊;在網(wǎng)絡(luò)層,可以對(duì)源IP,目的IP功戚,ICMP進(jìn)行控制娶眷;在傳輸層,可以對(duì)源端口啸臀,目的端口届宠,甚至TCP報(bào)文中的flags位的控制;在應(yīng)用層中乘粒,可以對(duì)報(bào)文拆開檢查后控制豌注。
iptable和netfilter的關(guān)系
iptable工作在用戶空間中,就iptable自身而言灯萍,它的工作就是定義規(guī)則轧铁,可以讓內(nèi)核空間當(dāng)中的netfilter讀取這些規(guī)則,并且實(shí)現(xiàn)讓防火墻工作旦棉。
簡(jiǎn)單來講齿风,iptable工作在用戶空間,用于編寫規(guī)則绑洛,netfilter工作在內(nèi)核聂宾,根據(jù)規(guī)則匹配數(shù)據(jù)包。
netfilter
netfilter簡(jiǎn)介
介紹netfilter之前應(yīng)該先看看協(xié)議棧(TCP/IP協(xié)議棧)底層大致機(jī)制
![][1]
如圖诊笤,數(shù)據(jù)從流入之后系谐,經(jīng)過A點(diǎn),然后根據(jù)路由決策判斷數(shù)據(jù)是否需要進(jìn)入用戶空間讨跟,如果是留入用戶空間纪他,會(huì)經(jīng)過B點(diǎn),如果僅僅是經(jīng)由本機(jī)轉(zhuǎn)發(fā)的則經(jīng)過C點(diǎn)然后到達(dá)E點(diǎn)晾匠,最后流出茶袒;對(duì)于用戶空間產(chǎn)生的數(shù)據(jù)包,先經(jīng)由路由判決凉馆,決定從那個(gè)網(wǎng)卡出去薪寓,經(jīng)過D點(diǎn)亡资,然后到達(dá)E點(diǎn),最后流出向叉。
netfilter其實(shí)就是對(duì)這數(shù)據(jù)報(bào)必經(jīng)的5個(gè)點(diǎn)锥腻, 做了5個(gè)鉤子函數(shù),分別是prerouting母谎、input瘦黑、output、forword奇唤、postrouting只要數(shù)據(jù)包到達(dá)某個(gè)點(diǎn)后幸斥,就去調(diào)用我們的鉤子函數(shù),我們?cè)阢^子函數(shù)中設(shè)定了各種表,表中有鏈,鏈中有規(guī)則省容。如果有數(shù)據(jù)包被表中的鏈內(nèi)的規(guī)則命中渔扎,則執(zhí)行相應(yīng)動(dòng)作。
netfilter的結(jié)構(gòu)
netfilter作為內(nèi)核模塊運(yùn)行在內(nèi)存中,它自己維護(hù)這一塊內(nèi)存區(qū)域,這塊區(qū)域中,保存著4張表
netfilter的4表5鏈
前面說了netfilter在數(shù)據(jù)包的必經(jīng)之路上設(shè)置了5個(gè)鉤子函數(shù)钠至,對(duì)應(yīng)著5條鏈,分別是PREROUTING胎源、INPUT棉钧、OUTPUT、FORWORD涕蚤、POSTROUTING
并且根據(jù)不同功能為其配備了4個(gè)表宪卿,分別是raw、mangle万栅、nat佑钾、filter,這些表有先后順序烦粒,順序?yàn)椋簉wa-->mangle-->nat-->filter休溶。舉例說明,在PREROUTING鏈上扰她,有3張表兽掰,分別是raw、mangle和nat,那么先由raw處理徒役,然后再由mangle表處理孽尽。
三個(gè)用于防火的鏈:INPUT/OUTPUT/FORWORD
根據(jù)報(bào)文流向,報(bào)文分為三種情況
1.流入本機(jī)的報(bào)文
PREROUTING-->INPUT
2.由本機(jī)流出的報(bào)文
OUTPUT-->POSTROUTING
3.由本機(jī)轉(zhuǎn)發(fā)的報(bào)文
PREROUTING-->FORWORD-->POSTROUTING
五表的作用
nat表:顧名思義network address translation忧勿,根據(jù)設(shè)定改變數(shù)據(jù)包地址杉女,屬于一個(gè)流的包只會(huì)經(jīng)過第一個(gè)包被允許做NAT瞻讽,那么余下的包都會(huì)自動(dòng)地被做相同的操作,也就是說余下的包不會(huì)通過這個(gè)表熏挎,一個(gè)個(gè)地被NAT速勇,而是自動(dòng)完成。
mangle
raw
filter:內(nèi)建三個(gè)鏈婆瓜,INPUT、OUTPUT贡羔、FORWORD廉白,其中FORWORD所過濾的不是本機(jī)接受或產(chǎn)生的,而是經(jīng)過本機(jī)轉(zhuǎn)發(fā)的數(shù)據(jù)包乖寒。
iptables
- 組成部分:根據(jù)規(guī)則匹配條件來嘗試匹配報(bào)文猴蹂,一旦匹配成功,就由規(guī)則定義的處理動(dòng)作作出處理
- 匹配條件:有內(nèi)建的匹配條件和需要模塊的擴(kuò)展匹配條件
- 處理動(dòng)作:有內(nèi)建的處理動(dòng)作楣嘁,如ACCEPT磅轻、DROP或需要模塊的處理動(dòng)作,如REJECT逐虚,還可以使用自定義鏈來處理聋溜。
iptable的鏈
iptables內(nèi)置了5個(gè)鏈,對(duì)應(yīng)著5個(gè)鉤子函數(shù)叭爱,還可以自定義鏈用于內(nèi)置鏈的擴(kuò)展和補(bǔ)充撮躁,可實(shí)現(xiàn)更靈活的規(guī)則管理機(jī)制
iptable命令:
語法:iptables [-t table] COMMAND chain [-m match] -j target
-t是指明要操作那個(gè)表,操作由COMMAND指定买雾,如增加把曼、刪除或修改、查看漓穿,作用與那個(gè)表中那個(gè)鏈上嗤军,如果是增加規(guī)則,則需要指明匹配條件晃危,與匹配命中之后的動(dòng)作
----------------------
#COMMAND: #有三類叙赚,對(duì)鏈管理的命令、對(duì)規(guī)則管理的命令和查看
#鏈管理命令
-N:new, 自定義一條新的規(guī)則鏈僚饭;
-X: delete纠俭,刪除自定義的規(guī)則鏈;
注意:僅能刪除 用戶自定義的 引用計(jì)數(shù)為0的浪慌、空的鏈冤荆;
-P:Policy,設(shè)置默認(rèn)策略权纤;對(duì)filter表中的鏈而言钓简,其默認(rèn)策略有:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
-E:重命名自定義鏈乌妒;引用計(jì)數(shù)不為0的自定義鏈不能夠被重命名,也不能被刪除外邓;
#規(guī)則管理命令
-A: append撤蚊,追加,在鏈中追加一條規(guī)則损话;
-I:insert侦啸,插入,后面跟上序號(hào)丧枪,為空為插入第一條光涂;
-D:delete,刪除拧烦,可以用以下兩種方法刪除忘闻;
(1) 指明規(guī)則序號(hào);
(2) 指明規(guī)則本身恋博;
-R:replace,替換指定的規(guī)則齐佳;
-F:flush,清空指定規(guī)則鏈债沮,為空則清空表中所有鏈
-Z:zero炼吴,置零;iptables的每條規(guī)則有2個(gè)計(jì)數(shù)器
(1) 匹配到的報(bào)文的個(gè)數(shù)疫衩;
(2) 匹配到的所有報(bào)文的大小之和缺厉;
----------------------
#match匹配條件
#如果是基本匹配條件,無需加載任何模塊隧土,有iptables/netfilter提供提针。
[!] -s, --source address[/mask][,...]:檢查報(bào)文中的源IP地址是否符合此處指定的地址或范圍;
[!] -d, --destination address[/mask][,...]:檢查報(bào)文中的目標(biāo)IP地址是否符合此處指定的地址或范圍曹傀;
注意:如果要匹配所有IP辐脖,則可以使用0.0.0.0
[!] -p, --protocol protocol #protocol可以是tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, 或者使用all表示全部,也可以使用協(xié)議代碼皆愉,協(xié)議代碼和協(xié)議對(duì)應(yīng)關(guān)系在/etc/protocols中可以查看
[!] -i, --in-interface name:數(shù)據(jù)報(bào)文流入的接口(網(wǎng)卡接口)嗜价;只能應(yīng)用于數(shù)據(jù)報(bào)文流入的環(huán)節(jié),只能應(yīng)用于PREROUTING幕庐,INPUT和FORWARD鏈久锥;
[!] -o, --out-interface name:數(shù)據(jù)報(bào)文流出的接口;只能應(yīng)用于數(shù)據(jù)報(bào)文流出的環(huán)節(jié)异剥,只能應(yīng)用于FORWARD瑟由、OUTPUT和POSTROUTING鏈;
iptables的匹配條件
iptables支持兩種擴(kuò)展匹配:隱式擴(kuò)展和顯示擴(kuò)展冤寿,隱式擴(kuò)展在使用-p選項(xiàng)指明了特定的協(xié)議時(shí)歹苦,無需再同時(shí)使用-m選項(xiàng)指明青伤;顯示擴(kuò)展需要用-m來指定;擴(kuò)展可以包含多個(gè)子選項(xiàng)殴瘦。
#隱式擴(kuò)展選項(xiàng)
-p tcp的子選項(xiàng):
[!] --source-port, --sport port[:port]:匹配報(bào)文的源端口狠角;可以是端口范圍;
[!] --destination-port,--dport port[:port]:匹配報(bào)文的目標(biāo)端口蚪腋;可以是端口范圍丰歌;
[!] --tcp-flags mask comp
匹配指定的flags,mask是需要檢查的flags屉凯,comp是必須為1的flags,沒在comp指定上的flags則必須為0
例如:“-p tcp --tcp-flags SYN,ACK,FIN,RST SYN”表示立帖,要檢查的標(biāo)志位為SYN,ACK,FIN,RST四個(gè),其中SYN必須為1神得,余下的必須為0厘惦;
[!] --syn:用于匹配第一次握手偷仿,相當(dāng)于`--tcp-flags SYN,ACK,FIN,RST SYN`哩簿;
----------------
-p udp的子選項(xiàng)
udp
[!] --source-port, --sport port[:port]:匹配報(bào)文的源端口;可以是端口范圍酝静;
[!] --destination-port,--dport port[:port]:匹配報(bào)文的目標(biāo)端口节榜;可以是端口范圍;
-----------------
-p icmp的子選項(xiàng)
[!] --icmp-type {type[/code]|typename}
echo-request:8 #icmp的請(qǐng)求類型代碼
echo-reply:0 #icmp的回復(fù)類型代碼
顯式擴(kuò)展必須使用-m選項(xiàng)指明要調(diào)用的擴(kuò)展模塊的擴(kuò)展機(jī)制
1.multiport 以離散或連續(xù)的 方式定義多端口匹配條件别智,最多15個(gè)宗苍,注意:如45:800,雖然開放了45至800之間的所有端口薄榛,但Multiport只算2個(gè)
[!] --source-ports,--sports port[,port|,port:port]...:指定多個(gè)源端口讳窟;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個(gè)目標(biāo)端口;
例如:
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT
//允許訪問目標(biāo)為172.16.0.7的tcp,22,80,139,445,3306敞恋。5個(gè)端口
-------------------
2.iprange 以連續(xù)地址塊的方式來指定多個(gè)IP
[!] --src-range from[-to]
[!] --dst-range from[-to]
例如:
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT
//拒絕地址范圍172.16.0.61-172.16.0.70的主機(jī)去訪問目標(biāo)172.16.0.7丽啡,tcp的22,80,139,445,3306端口
---------------------------
3.time 匹配指定時(shí)間范圍
--timestart hh:mm[:ss] #開始時(shí)間
--timestop hh:mm[:ss] #結(jié)束時(shí)間
[!] --weekdays day[,day...] #也可以以周做單位來匹配
[!] --monthdays day[,day...]
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #以日期做單位
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--kerneltz:使用內(nèi)核配置的時(shí)區(qū)而非默認(rèn)的UTC
------------------------
4.string 通過某中模式來匹配字符串,需要內(nèi)核大于或等于2.6.14
--algo {bm|kmp} #指定匹配模式策略
[!] --string pattern
[!] --hex-string pattern
--from offset
--to offset
另外此模塊對(duì)于加密傳輸?shù)男畔]辦法匹配硬猫,所以只能用于明文匹配
例子:
~]# iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT
//在OUTPUT鏈上加入規(guī)則补箍,拒絕string中包含有g(shù)ay字符串的數(shù)據(jù)包。使用bm模式策略來匹配
-------------------
5.connlimit 匹配單個(gè)IP最大連接數(shù)
--connlimit-upto n
--connlimit-above n
例如:
~]# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
//限制172.16.0.7的tcp 22單IP訪問數(shù)啸蜜,connlimit-above即超過2個(gè)就拒絕
6.limit 使用令牌桶來限制速率
--limit rate[/second|/minute|/hour|/day] #允許的平均數(shù)量坑雅,如1分鐘我只允許10個(gè)包,則10/minute
--limit-burst number #令牌桶存儲(chǔ)的令牌數(shù)量
例如
允許每分鐘10次ping衬横,但第一次可以ping 20次裹粤。20次之后按照RATE計(jì)算。所以蜂林,前20個(gè)ping包每秒能正常返回蛹尝,從第21個(gè)ping包開始后豫,每6秒允許一次ping:
#iptables -A INPUT -d ServerIP -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 20 -j ACCEPT
限制本機(jī)某tcp服務(wù)接收新請(qǐng)求的速率:--syn, -m limit
7.state “state”擴(kuò)展是“conntrack”模塊的一個(gè)子集,通過數(shù)據(jù)包的連接追蹤狀態(tài)來設(shè)置防火墻突那。
[!] --state state #有以下幾種狀態(tài)
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
NEW: 新連接請(qǐng)求挫酿;
ESTABLISHED:已建立的連接;
INVALID:無法識(shí)別的連接愕难;
RELATED:相關(guān)聯(lián)的連接早龟,當(dāng)前連接是一個(gè)新請(qǐng)求,但附屬于某個(gè)已存在的連接猫缭;
UNTRACKED:未追蹤的連接葱弟;
對(duì)于匹配條件,在匹配條件前面的[!]意思是取反猜丹。
iptables的處理動(dòng)作
iptables的處理動(dòng)作是指如果數(shù)據(jù)包被規(guī)則命中之后芝加,做出什么樣的動(dòng)作,比如說射窒,ACCEPT藏杖、DROP等,以下是比較常見的規(guī)則脉顿。
DNAT:目標(biāo)地址轉(zhuǎn)換
SNAT:源地址轉(zhuǎn)換
REDIRECT:端口重定向
MASQUERADE:地址偽裝(其實(shí)也是源地址轉(zhuǎn)換)蝌麸,適用于動(dòng)態(tài)源地址 RETURN:用于自定義鏈,自定義鏈中匹配完畢后返回到自定義的前一個(gè)鏈中繼續(xù)向下匹配