防火牆iptables

一、定義:

    防火牆:工作於主機或網絡的邊緣,對進出的報文做規則檢查,對匹配的報文做相應

處理的組件。分爲主機防火牆和網絡防火牆,常見的網絡防火牆有,netscreen,checkpoint。

二、iptables的歷史與工作原理:

 1、iptables的發展

    iptables的原名叫ipfirewall,而ipfirewall工作於內核中,通過鉤子函數上放置規則,

  實現各種功能,而每個鉤子上多條規則稱爲一個鏈(CHAIN),每個功能有多個鏈,所以稱

  爲表,後來改爲iptables

 2、鉤子函數(規則鏈)

prerouting: 進入本機後路由功能發生之前
input:到達本機內部
output: 由本機發出
forward: 由本機轉發
postrouting:路由功能發生之後,即將離開本機之前

 3、規則的功能:

filter:過濾,允許或禁止
NAT: Network Address Translation,地址轉換        
mangle:修改報文首部信息
raw:關閉nat的連接追蹤功能
規則與對應的鏈:
filter:input, forward, output
nat:prerouting, output, postrouting
mangle:prerouting, input, forward, output, postrouting
raw:prerouting, output

4、鏈:鏈上的規則次序即爲檢查次序,因此有一定的法則

(1) 同類規則,匹配範圍小的放上面;

(2) 不同類規則,匹配報文機率較大的放上面;

(3) 應該設置默認策略;


5、數據包過濾匹配流程:

(1)網絡A-->prerouting(raw,mangle,nat)-->路由選擇-->轉發數據流向

-->forward(mangle,fiter)-->postrouting(mangle,nat)-->網絡B

(2)網絡A--->prerouting(raw,mangle,nat)-->路由選擇-->input(mangle,filter)

-->本機的應用進程-->路由選擇-->output(raw,mangle,nat,filter)-->postrouting(mangle,nat)-->網絡B

6、添加規則時的考量點:

(1) 要實現的功能:判斷添加在哪個表上;

(2) 報文流向及經由路徑:判斷添加在哪個鏈上;

      功能的優先級,由高而低:      

      raw --> mangle --> nat --> filter

7、規則的組成部分:       

匹配條件:基本匹配條件、擴展匹配條件

如何處理:內建處理機制、自定義處理機制(自定義的鏈)

注意:報文不可能經由自定義鏈,只有在被內置鏈上的引用才能生效(即做爲自定義目標)

三、iptables的命令使用   

  iptables命令生成規則:

規則通過內核接口直接送至內核,因此,會立即生效。但不會永久有效;

如果期望永久有效,需要保存至配置文件中,此文件還需開機時加載或由用戶手工加載;

iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET   

1、-t TABLE:
默認爲filter, 共有filter, nat, mangle, raw四個可用;
 2、SUBCOMMAND:
   (1)鏈:
-F:flush,清空指定表的指定鏈上所有規則;省略鏈名時,清空表中的所有鏈;
-N:new, 新建一個用戶自定義的鏈;自定義鏈只能作爲默認鏈上的跳轉對象,即在默認鏈通過引用來生效自定義鏈;
-X:drop,刪除用戶自定義的空鏈;非空自定義鏈和內置鏈無法刪除;
-Z:zero,將規則的計數器置0;
-P:policy,設置鏈的默認處理機制;當所有都無法匹配或有匹配有無法做出有效處理機制時,默認策略即生效;
filter表的可用策略:ACCEPT(不限制), DROP(丟棄), REJECT(拒絕)         
-E:rename,重命名自定義鏈;
#iptables -E NAME NEWNAME
注意:被引用中的鏈,無法刪除和改名
  (2)規則:增,刪,改,查
-A:append,在鏈尾追加一條規則;
-I:insert,在指定位置插入一條規則;
-D:delete,刪除指定的規則;
-R:replace,替換指定的規則;
-L:list,列出指定鏈上的所有規則;
-n: numeric,以數字格式顯示地址和端口號,即不反解;
-v: verbose,詳細格式,顯示規則的詳細信息,包括規則計數器等;
-vv:更加詳細
--line-numbers: 顯示規則編號;
-x: exactly,顯示計數器的精確值;
3、CHAIN:prorouting,input,output,forward,postrouting
常用:input,output,forward
4、CRETERIA: 匹配條件   重點
  匹配條件:
   1)通用匹配:
-s, --src, --source  IP|Network:檢查報文中的源IP地址;
-d, --dst, --destination:檢查報文中的目標IP地址;
-p, --protocol:檢查報文中的協議,即ip首部中的protocols所標識的協議;tcp、udp或icmp三者之一;
-i, --in-interface:數據報文的流入接口;通常只用於PREROUTING, INPUT, FORWARD鏈上的規則;
-o, --out-interface:檢查報文的流出接口;通常只用於FORWARD, OUTPUT, POSTROUTING鏈上的規則;
注意:前面加[!]表示取反

  2)擴展匹配:使用iptables的模塊實現擴展性檢查機制

  (1)隱式擴展:如果在通用匹配上使用-p選項指明瞭協議的話,則使用-m選項指明對其協議的擴展就變得可有可無了;

(a)tcp: 
--dport PORT[-PORT]
--sport
--tcp-flags LIST1 LIST2
LIST1: 要檢查的標誌位;
LIST2:在LIST1中出現過的,且必須爲1標記位;而餘下的則必須爲0; 
例如:--tcp-flags syn,ack,fin,rst syn
--syn:用於匹配tcp會話三次握手的第一次;
(b)udp:
--sport
--dport
(c)icmp:
 --icmp-types
 8: echo request
 0:echo reply  
 (2)顯式擴展:必須指明使用的擴展機制;
  -m 模塊名稱              
(a)multiport擴展:
  以離散定義多端口匹配;最多指定15個端口;
  專用選項:
--source-ports, --sports PORT[,PORT,...]
--destination-ports, --dports PORT[,PORT,...]
--ports PORT[,PORT,...]
 例子:
#iptables -I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dports 22,80,443 -j ACCEPT   #開啓其它主機對100.11的tcp的22.80.443端口的請求
#iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp -m multiport --sports 22,80,443 -j ACCEPT   #開啓100.11的tcp的22,80,443的端口迴應
(b)iprange擴展:
  指定連續的ip地址範圍;在匹配非整個網絡地址時使用;
  專用選項:
[!] --src-range IP[-IP]
[!] --dst-range IP[-IP]
示例:開啓100.1-100.100對100.11的tcp的23端口的訪問
iptables -A INPUT -d 172.16.100.11 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.11 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
(c)string擴展:
 檢查報文中出現的字符串,與給定的字符串作匹配;
 字符串匹配檢查算法:
kmp, bm
專用選項:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING":HEX_STRING爲編碼成16進制格式的字串;
示例:
iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp --sport 80 -m string --string "sex" --algo kmp -j REJECT
(d)time擴展:
 基於時間區間做訪問控制
     專用選項:
--datestart YYYY[-MM][-DD][hh[:mm[:ss]]]
--datestop
--timestart
--timestop
--weekdays DAY1[,DAY2,...]
示例:
# iptables -R INPUT 1 -d 172.16.100.11 -p tcp --dport 80 -m time --timestart 08:30 --timestop 18:30 --weekdays Mon,Tue,Thu,Fri -j REJECT
(e)connlimit擴展:
 基於連接數作限制;對每個IP能夠發起的併發連接數作限制;
專用選項:
--connlimit-above [n]
# iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT
(f)limit擴展:
基於發包速率作限制;
專用選項:令牌桶算法
--limit  n[/second|/minute|/hour|/day]
--limit-burst n   限制突發數
iptables -R INPUT 3 -d 172.16.100.11 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
5、TARGET:
-j: jump,跳轉目標
內置目標:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕

練習:

(1) 配置本機的dns服務,並放行之;默認策略爲drop;

#iptables -I INPUT 2 -d 172.16.21.68 -p tcp --dport 53 -j ACCEPT
#iptables -I OUTPUT 2 -s 172.16.21.68 -p tcp --sport 53 -j ACCEPT
#iptables -I INPUT 3 -d 172.16.21.68 -p udp --dprot 53 -j ACCEPT
#iptables -I INPUT 3 -d 172.16.21.68 -p udp --dport 53 -j ACCEPT
#iptables -I OUTPUT 2 -s 172.16.21.68 -p udp --sport 53 -j ACCEPT

(2) 配置本機的telnet服務,要求只允許來自於172.16.0.0/16網絡中的主機訪問,且只允許工作時間訪問,而且,每個來源IP最多的併發連接數不能超過2個;

#iptables -I INPUT 5 -s 172.16.0.0/16 -d 172.16.21.68 -p tcp --dport 23 -m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tun,Wen,Thu,Fri -m connlimit --connlimit-above 2 -j ACCEPT
#iptables -I OUTPUT 5 -s 172.16.21.68 -d 172.16.0.0/16 -p tcp --sport 23  -m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tun,Wen,Thu,Fri -m connlimit --connlimit-above 2 -j ACCEPT


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