一、防火牆簡介
防火牆分為網絡防火牆和應用層防火牆
1、網絡防火牆
網絡防火牆就是一個位于計算機和它所連接配接的網絡之間的防火牆。該計算機流入流出的所有網絡通信均要經過此防火牆。防火牆對流經它的網絡通信進行掃描,這樣能夠過濾掉一些攻擊,以免其在目标計算機上被執行。防火牆還可以關閉不使用的端口。而且它還能禁止特定端口的流出通信,封鎖特洛伊木馬。最後,它可以禁止來自特殊站點的通路,進而防止來自不明入侵者的所有通信。
2、應用層防火牆
應用層防火牆是在 TCP/IP 堆棧的“應用層”上運作,您使用浏覽器時所産生的資料流或是使用 FTP 時的資料流都是屬于這一層。應用層防火牆可以攔截進出某應用程式的所有封包,并且封鎖其他的封包(通常是直接将封包丢棄)。理論上,這一類的防火牆可以完全阻絕外部的資料流進到受保護的機器裡。
因為應用層防火牆的算法會更複雜,過慮更為嚴格,是以在部署防火牆的時候,要把應用層防火牆部署到網絡防火牆的裡邊。
Linux防火牆體系主要工作在網絡層,針對TCP/IP資料包實施過濾和限制,屬于典型的包過濾防火牆(網絡層防火牆)。
二、iptables的表鍊結構
1、iptables簡介
平時說iptables是防火牆,其實iptables是iptables/netfilter組合中的一個,隻有iptables/netfilter才應該叫做防火牆,它是基于軟體方式工作的網絡防火牆。iptables工作于使用者空間,是防火牆的規則編寫工具,使用iptables編寫規則并且發送到netfilter;防火牆的規則剛放到netfilter中,它是一個能夠讓規則生效的網絡架構,工作于核心空間。
2、iptables的表、鍊結構
iptables是由四表五鍊組成的,想要配置iptables必須先了解這四表五鍊
<a href="http://s3.51cto.com/wyfs02/M01/23/26/wKioL1MypgDA9vpKAAIbDWY8DEU705.jpg" target="_blank"></a>
一個規則可以出現在多個表中,誰先誰後呢?是以在這四個表中是存在優先級關系的:
1)四表
優先級:raw表 > mangle表 > nat表 > filter表
①、raw表
RAW表隻使用在PREROUTING鍊和OUTPUT鍊上,因為優先級最高,進而可以對收到的資料包在連接配接跟蹤前進行處理。一但使用者使用了RAW表,在某個鍊上,RAW表處理完後,将跳過NAT表和ip_conntrack處理,即不再做位址轉換和資料包的連結跟蹤處理了。
RAW表可以應用在那些不需要做nat的情況下,以提高性能。如大量通路的web伺服器,可以讓80端口不再讓iptables做資料包的連結跟蹤處理,以提高使用者的通路速度。
raw内含有兩個鍊:PREROUTING和OUTPUT
②、mangle表
mangle表一般是對資料包進行修改用的
比如在網絡的轉發過程中,資料包要從X到Z,中間夾了一個Y,當資料從X到Y的時候,Y要運作拆包,看是不是自己的,如果是就收下了,如果不就是重新封裝,把源IP改為自己的,而不再是X的了,再進行轉發。
mangle表中含五個鍊:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
③、nat表
用于nat功能(端口映射,位址映射等)
主要用來處理一些将要到達本機路由和将要離開本機路由的資料包,修改資料包中的源、目标IP位址或端口;其對應的子產品為iptable_nat。
nat表内含三個鍊:PREROUTING、POSTROUTING、OUTPUT
④、filter表
一看名字就知道是用來做過濾用的。filter表是iptables的預設表,如果在設定規則時,不指定表,則預設就是在filter表上操作
filter表内含三個鍊:INPUT、FORWARD、OUTPUT
2)五鍊
這五條鍊其實就是針對防火牆政策的規則
①、PREROUTING
路由前,資料包在經過防火牆前應做如何處理
②、INPUT
在資料包進行進入本機前就做何處理,目标是本機,不是網絡内的主機
③、OUTPUT
在資料包離開本機時做何處理,源是本機,目标是其它主機
④、FORWARD
對于轉發資料包做如何處理,因為本機可能是一台代理伺服器,網絡内的其它主機在與網際網路通信時都需要經過這台伺服器的轉發
⑤、POSTROUTING
在資料包離開防火牆時做如何處理
INPUT、OUTPUT鍊主要用在“主機型防火牆”中,即主要針對伺服器本機進行保護的防火牆;而FORWARD、PREROUTING、POSTROUTING鍊多用在“網絡型防火牆”中,
三、iptables資料包的過濾流程
為了更直覺的表現資料包的過濾流程,請參考第二步及下圖
<a href="http://s3.51cto.com/wyfs02/M01/23/26/wKiom1MysozxkuL0AAJOKwKvWIM068.jpg" target="_blank"></a>
四、iptables使用規則
iptables規則=檢查條件+處理機制
1)檢查條件
(1)IP:源IP,目标IP
(2)Protocal:TCP、UDP、ICMP
TCP:源端口、目标端口、Flags
UDP:源端口、目标端口
ICMP:ICMP-TYPE
TCP Flags:基于标記的TCP包比對經常被用于過濾試圖打開新連接配接的TCP資料包,共有六個标志位,UDP沒有
①、URG
如為1,則表示本資料包中含有緊急資料
②、ACK
确認标志們
③、PSH
PUSH操作,所謂PUSH操作就是批資料包到達接收端以後,立即傳送給應用程式,而不是在緩沖區中排隊
④、RST
表示連接配接複位請求,用來複位那些産生錯誤的連接配接;當PST=1時,表示出現嚴重錯誤,必須釋放連接配接,然後再重建立立
⑤、SYN
表示同步序号,用來建立連接配接。
SYN=1,ACK=0 表示連接配接請求
SYN=1,ACK=1 表示連接配接請求被響應
⑥、FIN
表示資料已經發送完畢,希望釋放連接配接
2)處理機制、動作 -j target
ACCEPT:将包放行,進行完此處理動作後,将不再比對其它規則,直接跳往下一個規則鍊
DENY:拒絕,委婉式的拒絕
DROP:丢棄資料包,進行完此處理動作後,将不再比對其它規則,直接中斷過濾程式
REJECT:阻攔該資料包,并通知對方(ICMP消息)
SNAT:改定資料包源IP
DNAT:改定資料包目标IP
RETURN:結束在目前規則鍊中的過濾程式,傳回主規則鍊繼續過濾,如果把自定義規則鍊看成是一個子程式,那麼這個動作,就相當于提前結束子程式并傳回到主程式中。
REDIRECT:将資料包重新導向到另一個端口(PNAT),進行完此處理動作後,将會繼續比對其它規則
LOG:記錄日志
五、iptables文法
1)建立一條自定義的規則鍊
1
<code>iptables [-t table] -N chain</code>
2)删除一條自定義的規則鍊,必須為空鍊
<code>iptables [-t table] -X [chain]</code>
3)修改自定義鍊名
<code>iptables [-t table] -E old-chain-name new-chain-name</code>
4)為鍊指定預設政策,指定預設規則
<code>iptables [-t table] -P chain target</code>
5)iptables [-t talbe] {-F|-L|-Z} [chain[rulenum]][options...]
-F:flush,清空鍊中的規則,不指鍊則清空表中的所有規則,規則有編号,自上而下從1開始
-L:list,列出表中的所有規則
-n:隻和-L一塊用,數字格式顯示IP和PORT
-v:verbose,以詳細格式顯示
-vvv
-x:exactly,精确值,不執行機關換算
--line-numbers:顯示各規則的行号
-Z:zero,清零,把規則的計數器清零
6)iptables [-t table] {-A|-D} chain rule-specification
-A:append,附加一條規則,添加到現在規則鍊的最下面(-I:預設添加到最前面)
rule-specification
比對條件 -j 處理機制
(1)通用比對:
-s:source,比對源位址,可以是IP,也可以是網絡位址;可以使用!操作符取反
-d:比對目标位址,可以是IP,也可以是網絡位址;可以使用!操作符取反
-p:比對協定,通常隻使用{TCP|UDP|ICMP}三者之一
-i:資料封包流入接口;通常隻用于INPUT、FORWARD和PREROUTING
-o:資料封包流出接口;通常隻用于OUTPUT、FORWARD和POSTROUTING
(2)擴充比對:
①隐含擴充:使用-p{tcp|udp|icmp}指定某特定服務後,自動能夠對協定進行擴充
-p tcp
--dport m[-n]:比對的目标端口,可以是連續的多個端口
--sport m[-n]:比對的源端口,可以是連續的多個端口
--tcpflags (6個标志們:URG、PSH、RST、SYN、ACK、FIN)
--tcp-flags rst,syn,ack,fin syn = --syn
ALL,NONE
-p udp udp沒有标志位,是以隻有源端口和目标端口可選
--dport
--sport
-p icmp
--icmp-type
8:ping 請求
0:ping響應
②顯示擴充:必須要明确指定的擴充子產品
-m 擴充子產品名稱 --專用選項1 --專用選項2
multiport:多端口比對,一次指定多個(15個以内)離散端口
--source-ports, --sports
--destination-ports, --dports
--ports
iprange:ip位址範圍
[!] --src-range from[-to]
[!] --dst-range from[-to]
time:指定時間範圍
datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
datestop
timestart hh:mm[:ss]
timestop hh:mm[:ss]
[!]--weekdays day[,day...]
string:字元串比對
--algo{bm|kmp}:字元比對查找時使用算法
--string "STRING":要查找的字元串
--hex-string "HEX-STRING":要查找的字元,先編碼成16進制格式
connlimit:第IP對指定服務的最大并發連接配接數
[!]--connlimit-above [n]
limit:封包速率控制
--limit #[/second|/minute|/hour|/day]
--limit-burst #
state:狀态比對
ip_conntrack,nf_conntrack
--state
NEW
ESTABLISHED
RELATED
INVALID
-D 删除規則
<code>iptables [-t table] -D chain rulenum</code>
-I 插入規則
<code>iptables [-t table] -I chain [rulenum] rule-specification</code>
-R 替換指定規則
<code>iptables [-t table] -Rchain rulenum rule-specification</code>
-S 隻顯示指定鍊上的規則添加指令
<code>iptables [-t table] -S [chain [rulenum]]</code>
六、儲存規則
寫好規則後,别忘了儲存到配置檔案哈,否則一重新開機就啥也沒了,切記切記!
本文轉自 nmshuishui 51CTO部落格,原文連結:http://blog.51cto.com/nmshuishui/1384802,如需轉載請自行聯系原作者