一、定義:
防火牆:工作於主機或網絡的邊緣,對進出的報文做規則檢查,對匹配的報文做相應
處理的組件。分爲主機防火牆和網絡防火牆,常見的網絡防火牆有,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