咱們先來了解如下社麼是防火牆 linux
防火牆:隔離功能,工做在網絡或主機邊緣,對進出網絡或主機的數據包基於必定的規則檢查,並在匹配某規則時由規則定義的行爲進行處理的一組功能的組件,基本上的實現都是默認狀況下關閉全部的經過型訪問,只開放容許訪問的策略web
[ 防火牆的本質是對報文(包)進行過濾,經過過濾器對報文(包)按照特徵來進行匹配,將匹配到的報文(包)進行處理,以此來進行過濾 ]算法
在linux中真正實現防火牆功能的是netfilter,它是一個抽象的框架,提供了一套hook函數的管理機制,並以此來對數據包進行管理。iptables是用來在用戶空間編寫防火牆規則的工具,用戶經過iptables以系統調用的方式來管理netfilter。安全
在內核中的五個hook function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),這五個hook function被放在數據包流過協議棧的五個關鍵點,以此來對數據包進行檢測和處理,而這五個hook function向用戶開放,用戶不能直接對內核中的hook function進行操做,但用戶能夠經過一個命令工具iptables向其寫入規則,以系統調用的方式來將規則發送給hook function。服務器
如下是剛剛提到的五個hook function:網絡
NF_IP_PRE_ROUTING:剛剛進入網絡層的數據包經過此點(剛剛進行完版本號,校驗 和等檢測),源地址轉換在此點進行;IP_Input.c中IP_Rcv調用;
NF_IP_LOCAL_IN:經路由查找後,送往本機的經過此檢查點,INPUT包過濾在此點進行,IP_local_deliver中調用;
NF_IP_FORWARD:要轉發的包經過此檢測點,FORWORD包過濾在此點進行;
NF_IP_POST_ROUTING:全部立刻便要經過網絡設備出去的包經過此檢測點,內置的目的地址轉換功能(包括地址假裝)在此點進行;
NF_IP_LOCAL_OUT:本機進程發出的包經過此檢測點,OUTPUT包過濾在此點進行。框架
瞭解完五個hook function,咱們再來看看iptables的組成tcp
iptables由五個表和五個鏈以及一些規則組成函數
hook function在執行規則時會一次性執行多條規則,hook執行的多條規則又按照所處的hook分爲五個鏈,能夠理解爲hook所執行的爲鏈,按照鏈中的規則從上至下以此執行。再把這些鏈按對數據包的操做或者功能分類,這樣每一個功能下會含有多個鏈,這樣的一個功能類稱爲一個表,每一個hook function中以鏈爲單位存放。五個表中不是全部表都擁有五個鏈。工具
簡單的來講hook function是框架,鏈是這個框架的內容,而表是鏈功能的劃分。表和hook function是兩個不一樣維度的東西。
接下來咱們具體討論如下表和鏈
filter:過濾規則表,根據預約義的規則過濾符合條件的數據包
nat:network address translation 地址轉換規則表
mangle:修改數據標記位規則表
raw:關閉NAT表上啓用的鏈接跟蹤機制,加快封包穿越防火牆速度
security:(用戶的自定義表)用於強制訪問控制(MAC)網絡規則,由Linux安全模塊(如SELinux)實現
優先級由高到低的順序爲:security -->raw-->mangle-->nat-->filter
INPUT——進來的數據包應用此規則鏈中的策略
OUTPUT——外出的數據包應用此規則鏈中的策略
FORWARD——轉發數據包時應用此規則鏈中的策略
PREROUTING——對數據包做路由選擇前應用此鏈中的規則(全部的數據包進來的時侯都先由這個鏈處理)
POSTROUTING——對數據包做路由選擇後應用此鏈中的規則(全部的數據包出來的時侯都先由這個鏈處理)
每一個表所含有的鏈
filter:過濾器,防火牆 (INPUTE,FORWARD,OUTPUT)
nat:network address translation(PREPOUTING,INPUTE,OUTPUT,POSTROUTING)
mangle:修改報文(PREROUTING,INPUTE,FORWARD,OUTPUT,POSTROUTING)
raw:鏈接追蹤功能(PREOUTING,OUTPUT)
瞭解完這些組成,咱們來看一下iptables具體是如何運做的
當數據包(報文)進入主機後會有三種狀況:
流入本機:PREROUTING --> INPUT-->用戶空間進程Ø
從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),以後會進行路由選擇(判斷該數據包應該發往何處),若是數據包的目標主機是防火牆本機(好比說Internet用戶訪問防火牆主機中的web服務器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否容許經過等),經過之後再交給系統上層的應用程序(好比Apache服務器)進行響應。
流出本機:用戶空間進程 -->OUTPUT--> POSTROUTINGØ
防火牆本機向外部地址發送的數據包(好比在防火牆主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,以後進行路由選擇,而後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
轉發:PREROUTING --> FORWARD --> POSTROUTI
來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,以後會進行路由選擇,若是數據包的目標地址是其它外部地址(好比局域網用戶經過網關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),而後再交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
知道了原理那咱們該如何配置iptables呢,這就是iptables的規則
規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動做做出處理,規則分爲匹配條件和處理動做兩部分
注意:規則要添加在鏈上,才生效
匹配條件:默認爲與條件,同時知足
基本匹配:IP
擴展匹配:經過複雜高級功能匹配(端口,TCP的Flags(SYN,ACK等)),擴展匹配又分爲隱式擴展(tcp,udp,icmp)和顯式擴展(必須指定擴展模塊進行 的擴展)
處理動做:稱爲target,跳轉目標
內建處理動做:ACCEPT(經過),DROP(拒絕並丟棄數據包,不迴應),REJECT(拒絕但 迴應對方拒絕的信息),SNAT,DNATMASQUERADE,MARK,LOG...
自定義處理動做:自定義chain,利用分類管理複雜情形
iptables規則語法
iptables [選項]
-t :指定表(不寫默認filter表)
規則管理
-A:add,向規則鏈中添加規則(放在規則鏈的最後)
-I:insert,向規則鏈中插入規則(若是不指定第幾條則默認插入到第一條)
-D :delete,刪除規則鏈中的某規則
-R :replace,替換規則鏈中的某規則
-F:flush,清空指定規則(不指定規則將清空正條連)
-Z:zero,歸零計數器(iptables的每條規則都有兩個計數器,匹配到的報文的個數和匹配到的全部報文的大小)
規則查看
-L:list,列出一個鏈的規則,不指定鏈則會顯示錶中的所有規則(默認爲filter)
-n:numberic,以數字格式顯示地址和端口號(不進行反解析,會大幅提升列出速,port爲端口號,source和destination爲ip,若是不寫n選項則會嘗試將port解析爲服務名,source和destination解析爲域名,下降效率)
-v:verbose,詳細信息(pkts匹配到的報文數總和,bytes匹配到的報文包的大小總和,target匹配成功後採起的措施,port匹配的協議,opt匹配的選項,in匹配的報文流入網卡,out匹配的報文流出網卡,source匹配報文來源,destination匹配報文的目標地址)
-vv:更詳細的信息
--line-number:顯示規則編號
-S :命令格式顯示鏈上規則
鏈管理
-N:new,新建一個自定義鏈
-X:刪除一個空且爲被引用的鏈
-P:policy,指定一個鏈的默認規則(在沒條鏈後的括號內)
-E:重命名一個鏈
規則保存
iptables-save:將當前iptables配置打印到當前終端,咱們通常會將其導入到文件中,以便之後直接導入,建議導入到/etc/sysconfig/iptables
完整命令:
存iptables-save>/etc/sysconfig/iptables
取iptables-save</etc/sysconfig/iptables
具體格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
**關於rule-specification
rule-specification是對規則的定義,其寫法爲rule-specification = [matches...] [target]
其中matches是匹配模式,target爲處理方式
matches:
matches分爲基本匹配和擴展匹配,使用擴展匹配時需指定要加載的擴展模塊,擴展匹配又分爲隱式擴展和顯式擴展,隱式擴展在使用-p選項指明瞭特定的協議時,無需再用-m選項指明擴展模塊,能夠自動匹配擴展機制,不須要手動加載擴展模塊
-m matchname 指定擴展模塊(基本匹配和隱式擴展時省略)
基本匹配:
-s:指定源IP地址或網段
-d:指定目標IP地址或網段
-i:報文流入的接口(網卡),只能應用於數據報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈
-o:報文流出的接口(網卡),只能應用於數據報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈
擴展匹配:
-m 指定擴展的模塊
隱式擴展:(主要是協議,在指定協議時自動匹配模塊,所以不須要指定模塊)
-p:指定協議,可以使用數字如0(all)
-p tcp
--sport,匹配報文來源端口
--dport,匹配報文目標端口
--tcp--flags mask comp,匹配標誌位(mask能夠爲SYN,ACK,FIN,RST等用「,」分隔,comp爲標誌位必須爲1的標誌位
-p udp
--sport,匹配報文來源端口
--dport,匹配報文目標端口
-p icmp
--icmp-type,匹配響應報文的類型(請求報文爲8,迴應報文爲0)
顯示擴展:
-m multiport(用於匹配離散的ip只能用於tcp/udp協議,所以要配合-p udp或-p tcp一塊兒使用)
--deports,同時匹配多個離散的目標端口(「,」隔開「21:24」表示21號端口到24號端口,在multiport中算一個總體,看成一個端口)
--sports,同時匹配多個離散的來源端口
-m iprange(用來範圍匹配ip)
--src-range,匹配一個來源ip地址範圍(例如172.1.1.1-172.1.1.100)
--dst-range,匹配一個目標ip地址範圍
-m string(用來匹配字符串)
--algo,選用一個匹配的算法bm或kmp
--string,指定匹配的字符串,字符串需用引號引發
-m time(用來匹配時間,使用時注意檢查時區)
--timestart 指定起始時間(02:00:00)
--timestop 指定結束時間
--weekdays 指定一星期的某幾天(1,7爲週一和週日)
--monthdays 指定一個月中的某幾天(10,20爲10號和20號)
--datestart 指定起始日期(2018-01-01)
--datestop 指定結束日期
-m connlimit(限制每一個ip連接到sever的數量)
--connlimit-above 連接數大於時匹配
--connlimit-upto 連接數下雨等於時匹配
--connlimit-mask 限制對應掩碼的ip連接數量(24)
-m limit(限制數據包進入的速度)
--limit 匹配必定時間內的包(10/minute每分鐘10個包,這樣設置後iptables會每6s匹配一個包)
-m mac(匹配mac地址)
--mac-source
-m state(匹配報文當前狀態,此擴展比較佔用資源)
--state 匹配報文狀態
NEW:新發出請求;鏈接追蹤信息庫中不存在此鏈接的相關信息條目,所以,將其識別爲第一次發出的請求
ESTABLISHED:NEW狀態以後,鏈接追蹤信息庫中爲其創建的條目失效以前期間內所進行的通訊狀態
RELATED:新發起的但與已有鏈接相關聯的鏈接,如:ftp協議中的數據鏈接與命令鏈接之間的關
INVALID:無效的鏈接,如flag標記不正確
UNTRACKED:未進行追蹤的鏈接如raw表中關閉
target:
ACCEPT:容許數據包經過
DROP:直接丟棄數據包,不進行任何迴應
REJECT:拒絕數據包經過,但給予迴應
RETURN:返回調用鏈
REDIRECT:端口重定向
LOG:記錄日誌
MARK:作防火牆標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址假裝