firewall: 工作於主機或網絡的邊緣,對於進出的報文根據事先定義的規則作檢查,將那些能夠被規則所匹配到的報文作出相應處理的組件。
防火牆可分爲:
主機防火牆
網絡防火牆
專業的硬件防火牆:
checkpoint,netscreen
iptables: 程序
iptables:規則編寫工具
netfilter: 網絡過濾器, 內核中工作在TCP/IP網絡協議棧上的框架;
hooks function(鉤子函數):
prerouting: 進入本機後路由功能發生之前
input:到達本機內部
output: 由本機發出
forward: 由本機轉發
postrouting:路由功能發生之後,即將離開本機之前
路由發生的時刻:
報文進入本機後:
判斷目標地址
報文離開本機之前:
判斷經由哪個接口發出;
報文流向經由的位置:
到本內部:prerouting, input
由本機發出:output, postrouting
由本機轉發:prerouting, forward,postrouing
規則的功能:
過濾:firewall,
地址轉換:NAT Server
Network Address Translation
mangle:修改報文首部中的某些信息
raw:關閉nat表上啓用的連接追蹤功能
iptables:每個鉤子函數上可放置n條規則;對應於每個鉤子上的多條規則就稱爲一個鏈(CHAIN)
每個功能有多個鏈,所以,就稱作表;
iptables有四表五鏈:
四表:filter,nat,mangle,raw
五鏈:prerouting,input,forward,output,postrouting
每個表一般都只能定義在該存在的鏈上:
filter:input,forward, output
nat:prerouting,output, postrouting
mangle:prerouting,input, forward, output, postrouting
raw:prerouting,output
鏈:鏈上的規則次序即爲檢查次序,因此有一定的法則
(1) 同類規則,匹配範圍小的放上面;
(2) 不同類規則,匹配報文機率較大的放上面;
(3) 應該設置默認策略;
添加規則時的考量點:
(1) 要實現的功能:判斷添加在哪個表上;
(2) 報文流向及經由路徑:判斷添加在哪個鏈上;
功能的優先級:
由高而低:
raw --> mangle --> nat --> filter
規則的組成部分:
報文的匹配條件, 匹配之後如何處理
匹配條件:基本匹配條件、擴展匹配條件
如何處理:內建處理機制、自定義處理機制(自定義的鏈)
注意:報文不可能經由自定義鏈,只有在被內置鏈上的引用才能生效(即做爲自定義目標)
iptables:規則管理工具
自動實現規則的語法檢查
規則和鏈有計數器:
pkts: 由規則或鏈匹配到的報文的個數;
bytes:由規則或鏈匹配到的所有報文大小之和;
鏈:應該有默認策略;
iptables命令生成規則,送往netfilter;
規則通過內核接口直接送至內核,因此,會立即生效。但不會永久有效;
如果期望有永久有效,需要保存至配置文件中,此文件還開機時加載和由用戶手工加載;
注意:1.規則的次序非常關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。
2.經常使用的放在前面,可以省去過多的規則判斷對時間的浪費
iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -jTARGET
-t TABLE:
默認爲filter, 共有filter, nat, mangle,raw四個可用;
例: 顯示nat的所有規則
iptables -t nat -L -n -v
顯示filter的所有規則
iptables -L -n -v
SUBCOMMAND:
鏈:
-F:flush,清空指定表的指定鏈上所有規則;省略鏈名時,清空表中的所有鏈;
-N:new, 新建一個用戶自定義的鏈;自定義鏈只能作爲默認鏈上的跳轉對象,即在默認鏈通過引用來生效自定義鏈;
-X:drop,刪除用戶自定義的空鏈;非空自定義鏈和內置鏈無法刪除;
-Z:zero,將規則的計數器置0;
-P:policy,設置鏈的默認處理機制;當所有都無法匹配或有匹配有無法做出有效處理機制時,默認策略即生效;
filter表的可用策略:ACCEPT, DROP, REJECT
-E:rename,重命名自定義鏈;
注意:被引用中的鏈,無法刪除和改名
例: 清空filter上的INPUT規則
iptables -F INPUT
清空nat上的OUTPUT規則
iptables -t nat -F OUTPUT
規則:
-A:append,在鏈尾追加一條規則;
-I:insert,在指定位置插入一條規則;
-D:delete,刪除指定的規則;
-R:replace,替換指定的規則;
例:替換INPUT第二條規則
iptables -R INPUT 2-s 172.16.37.1 -d 172.16.37.10 -p tcp --dport 22
查看:
-L:list,列出指定鏈上的所有規則;
-n: numeric,以數字格式顯示地址和端口號,即不反解;
-v: verbose,詳細格式,顯示規則的詳細信息,包括規則計數器等;-vv,-vvv
--line-numbers: 顯示規則編號;
-x: exactly,顯示計數器的精確值;
CRETERIA: 匹配條件
檢查IP首部,檢查TCP、UDP或ICMP首部;
基於擴展機制,也可以進行額外的檢查;如做連接追蹤;
注意:可同時指定多個條件,默認多條件要同時被滿足;
匹配條件:
通用匹配:
[!] -s, --src, --source IP|Network:檢查報文中的源IP地址; ! -s 172.16.100.1表示除了這個IP
-d, --dst, --destination:檢查報文中的目標IP地址;
-p, --protocol:檢查報文中的協議,即ip首部中的protocols所標識的協議;tcp、udp或icmp三者之一;
-i, --in-interface:數據報文的流入接口;通常只用於PREROUTING, INPUT, FORWARD鏈上的規則; -i eth0
-o, --out-interface:檢查報文的流出接口;通常只用於FORWARD, OUTPUT, POSTROUTING鏈上的規則;-o eth0
例:本機IP172.16.37.10,僅允許172.16.37.1訪問sshd服務,並能效應
# iptables -A INPUT -s 172.16.37.1 -d 172.16.37.10 -p tcp --dport 22 -j ACCEPT
# iptables -A OUTPUT -s 172.16.37.10 -d 172.16.37.1 -p tcp --sport 22 -j ACCEPT
# iptables -P INPUTDROP
# iptables -P OUTPUTDROP
例:本機IP172.16.37.10,允許172.16.37.1訪問httpd服務,並能效應
# iptables -A INPUT -s 172.16.37.1 -d 172.16.37.10 -ptcp --dport 80 -j ACCEPT
# iptables -A OUTPUT -s 172.16.37.10 -d 172.16.37.1 -ptcp --sport 80 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
擴展匹配:使用iptables的模塊實現擴展性檢查機制
隱式擴展:如果在通用匹配上使用-p選項指明瞭協議的話,則使用-m選項指明對其協議的擴展就變得可有可無了;
tcp:
--dport PORT[-PORT] 目標端口
--sport 來源端口
--tcp-flags LIST1 LIST2
LIST1: 要檢查的標誌位;
LIST2:在LIST1中出現過的,且必須爲1標記位;而餘下的則必須爲0;
例如:--tcp-flags syn,ack,fin,rst syn
--syn:用於匹配tcp會話三次握手的第一次;
udp:
--sport 目標端口
--dport 來源端口
icmp:
--icmp-types
8:echo request 請求
0:echo reply 回答
例:開放172.16.37.1對本機172.16.37.10的ping響應,和ping請求;注:若默認INPUT/OUPUT爲DROP,請求和響應同時開啓才能ping通
# iptables -A INPUT -s 172.16.37.1 -d 172.16.37.10 -picmp --icmp-type 8 -j ACCEPT
# iptables -A OUTPUT -s 172.16.37.10 -d 172.16.37.1 -picmp --icmp-type 0 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
顯式擴展:必須指明使用的擴展機制;
-m 模塊名稱
每個模塊會引入新的匹配機制;
想知道有哪些模塊可用:
rpm-ql iptables
小寫字母,以.so結尾;
multiport擴展:以離散定義多端口匹配;最多指定15個端口;
專用選項:
--source-ports, --sports PORT[,PORT,...]
--destination-ports,--dports PORT[,PORT,...]
--portsPORT[,PORT,...]
例:允許172.16.100.11對本機的ssh,http,https訪問
iptables -I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp -mmultiport --sports 22,80,443 -j ACCEPT
iprange擴展:指定連續的ip地址範圍;在匹配非整個網絡地址時使用;
專用選項:
[!] --src-range IP[-IP]
[!] --dst-range IP[-IP]
例:允許172.16.100.1-100對172.16.100.11的telnet23端口訪問
iptables -A INPUT -d 172.16.100.11 -p tcp --dport 23 -miprange --src-range172.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
string擴展:檢查報文中出現的字符串,與給定的字符串作匹配;
字符串匹配檢查算法:
kmp,bm
專用選項:
--algo {kmp|bm} :指定算法
--string"STRING":要匹配的字符串,會自動編碼
--hex-string"HEX_STRING":HEX_STRING爲編碼成16進制格式的字串;效率會高
例:檢查響應報文中包含sex的字符串,並將其拒絕
iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp --sport80 -m string --string"sex" --algo kmp -j REJECT
time擴展:基於時間區間做訪問控制
專用選項:
--datestartYYYY[-MM][-DD][hh[:mm[:ss]]] 開始日期
--dattestop 停止日期
--timestart 開始時間
--timestop 停止時間
--weekdays DAY1[,DAY2,...]
例:在周1,2,4,5的08:30-18:30拒絕172.16.100.11對80端口的訪問
iptables -A INPUT -d172.16.100.11 -p tcp --dport 80 -m time --timestart 08:30 --timestop 18:30--weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit擴展:基於連接數作限制;對每個IP能夠發起的併發連接數作限制;
專用選項:
--connlimit-above [n] 連接數超過n個
! --connlimit-above[n] 連接不超過n個
例:當連接172.16.100.11的ssh數大於5時[包括5個]拒絕
iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22-m connlimit --connlimit-above 5 -j REJECT
iptables -P INPUT ACCEPT
例:配置本機的telnet服務,要求只允許來自於172.16.0.0/16網絡中的主機訪問,且只允許工作時間訪問,而且,每個來源IP最多的併發連接數不能超過2個;
方法1:iptables -A INPUT -s 172.16.0.0/16-d 172.16.37.10 -p tcp --dport 23 -m time --timestart 01:00 --timestop 20:00 -mconnlimit ! --connlimit-above 2 -j ACCEPT
iptables -P DROP
方法2:先拒絕在允許
iptables -I INPUT 1 -p tcp -dport 23 -m connlimit --connlimit-above 2 -jDROP
iptables -I INPUT 2 -p tcp -dport 23 -j ACCEPT
limit擴展:基於發包速率作限制;
專用選項:令牌桶算法
--limit n[/second|/minit|/hour|/day] 例--limit 10/minit 指明每分鐘允許10個數據包
--limit-burst n 峯值爲幾,即最大突發爲幾
假設如下的規則:
iptables -A INPUT -p icmp --icmp-type 8-m limit --limit 6/m --limit-burst 5 -j ACCEPT
iptables -P INPUT DROP
然後從另一部主機上ping這部主機,就會發生如下的現象:
首先我們能看到前四個包的迴應都非常正常,然後從第五個包開始,我們每10秒能收到一個正常的迴應。這是因爲我們設定了單位時間(在這裏是每分鐘)內允許通過的數據包的個數是每分鐘6個,也即每10秒鐘一個;其次我們又設定了事件觸發閥值爲5,所以我們的前四個包都是正常的,只是從第五個包開始,限制規則開始生效,故只能每10秒收到一個正常回應。
假設我們停止ping,30秒後又開始ping,這時的現象是:
前兩個包是正常的,從第三個包開始丟包,這是因爲在這裏我的允許一個包通過的週期是10秒,如果在一個週期內系統沒有收到符合條件的包,系統的觸發值就會恢復1,所以如果我們30秒內沒有符合條件的包通過,系統的觸發值就會恢復到3,如果5個週期內都沒有符合條件的包通過,系統都觸發值就會完全恢復。
state擴展:啓用連接追蹤模板記錄連接,並根據連接匹配連接狀態的擴展;
啓用連接追蹤功能之前:簡單包過濾防火牆;
啓用連接追蹤功能:帶狀態檢測的包過濾防火牆;
專用選項:
--state STATE
STATE的種類:
NEW: 新建立的連接,連接追蹤模板中無相應的條目時,客戶端第一次發出的請求;
ESTABLISHED:NEW狀態之後,邊距追蹤模板中的條目刪除之前所進行的通信過程,都稱爲ESTABLISHED;
RELATED:相關聯的連接,如ftp協議的命令連接與數據連接即爲相關聯的連接;
INVALIED: 無法識別的狀態;
例:放行OUTPUT已建立連接的ssh服務
iptables -A OUTPUT -p tcp -sport 22-m --state ESTABLISHED -j ACCEPT
調整連接追蹤功能所能容納的連接的最大數目:
/proc/sys/net/nf_conntrack_max
當前追蹤的所有連接:
/proc/net/nf_conntrack
不同協議或連接類型追蹤時的時長屬性:
/proc/sys/net/netfilter/
如何放行被動模式下的ftp服務:
(1) 裝載模塊:
#modprobe nf_conntrack_ftp
(2) 放行請求報文
放行入站請求端口爲21的請求報文;
放行所有狀態爲ESTABLISHED和RELATED狀態的入站報文;
(3) 放行出站響應報文
放行所有狀態爲ESTABLISHED的出站報文;
TARGET:
-j: jump,跳轉目標
內置目標:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
SNAT
DNAT
NAT Server: 能根據需要實現所謂的SNAT、DNAT或PNAT;
並非是用戶空間運行的進程完成轉換功能,靠的是內核中地址轉換規則;
SNAT:CIP --> SNAT(PIP) --> SIP
CIP: 本地客戶端IP SIP:服務器IP
DNAT: RemoteIP --> DNAT(SIP) --> SIP
RemoteIP:遠程客戶端地址;
PNAT:端口轉換
私有的客戶端訪問互聯網的方法:
(1)SNAT
(2)Proxy
SNAT:主要用於實現讓內網客戶端訪問外部主機時使用;
注意:要定義在POSTROUTING鏈;也可以在OUTPUT上使用;
定義方法:
iptables -t nat -APOSTROUTING -s 內網網絡或主機地址 -j SNAT --to-source NAT服務器上的某外網地址
例:讓172.16.0.0/16網絡都用192.168.1.1去訪問外網
iptables -t nat -APOSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.1.1
另一個TARGET:
MASQUERADE:地址僞裝;能自行判斷該轉爲哪個源地址;但是很消耗資源。
iptables -t nat -APOSTROUTING -s 內網網絡或主機地址 -j MASQUERADE
DNAT:主要用於發佈內部服務器,讓內網中的服務器在外網中可以被訪問到;
注意:要定義在PREROUTING鏈;
iptables -t nat -APREROUTING -d NAT服務器的某外網地址 -p 某協議 --dport 某端口 -j DNAT --to-destination 內網某服務器地址[:PORT]
例:訪問172.16.37.10的web服務需經過192.168.1.1
iptables -t nat -APREROUTING -d 192.168.1.1 -p tcp --dport 80 -j DNAT --to-destination172.16.37.10
FULLNAT: 全地址轉換
在請求報文到時:既修改源地址,又修改目標地址
NAT實驗:
拓撲:
源地址轉換:
1.客戶機網關設置爲191.111
2.啓動服務器的web服務,主頁註明 is 172.16.36.200
3.現在客戶機是ping不通服務器的
4.在NAT主機上添加一條SNAT規則做源地址轉換
#iptables -APOSTROUTING -s 192.168.191.0/24 -j SNAT --to-source 172.16.36.1
//將源地址爲192.168.191.0網段的地址,不論目標地址和訪問的端口是什麼,統統將源地址轉換爲172.16.36.1
5.客戶機測試:curl http://172.16.36.200
6.查看服務器web服務的日誌:
tail /etc/httpd/logs/access_log
可以看到日誌中訪問者IP爲172.16.36.1 即爲我們SNAT配置的地址,訪問成功
目標地址轉換:
1.將服務器的網關設置爲172.16.36.1
2.將web服務的監聽端口改爲8080
3.在NAT主機上添加一條DNAT規則做目標地址,和目標端口轉換。
#iptables -APREROUTING -d 192.168.191.111 -p tcp --dport 80 -j DNAT --to-destination172.16.36.200:8080
//將目標地址爲192.168.191.111且TCP端口爲80的請求,目標地址改爲172.16.36.200,端口改爲8080
4.客戶機測試:curl http://192.168.191.111
5.查看服務器日誌:
可以看到日誌中訪問者IP爲客戶機192.168.191.222,訪問成功
如何保存及重載規則:
保存:
(1)service iptables save
/etc/sysconfig/iptables文件;
(2) iptables-save> /PATH/TO/SOMEFILE
重載:
(1)service iptables reload
(2)iptables-restore < /PATH/FROM/SOMEFILE