一、什麼是防火牆(Firewall)?

   防火牆是一種位於內部網絡(主機防火牆)與外部網絡(網絡防火牆)之間的網絡安全防護系統,根據特定的訪問規則,允許或限制數據傳輸通過。主要作用是爲了限制企業內部的用戶對外的訪問,以及互聯網上的用戶對企業內部的訪問,在最大程度上阻止了各個環節的***行爲(可來自企業內部,也可來自互聯網)。


二、防火牆一般作用

   1、數據包過濾:數據包過濾是指監控通過 的數據包的特徵來決定放行或阻止該數據包。防火牆通過數據包過濾可以實現阻擋***,禁止外部或內部訪問的某些站點,限制每個IP的流量和連接數。

   2、數據包透明轉發:防火牆一般架設在提供某些服務的服務器前,用戶對服務器的訪問請求與服務器的響應給用戶的信息,都需要經過防火牆的轉發,因此防火牆具備網關的能力

   3、阻擋外部***:用戶發送的信息是防火牆所不允許的,防火牆會立即將其阻斷,避免其進入防火牆後面的服務器中。

   4、記錄***行爲:防火牆可以根據需要把***行爲記錄下來。


三、防火牆分類

   1、按網絡環境分:

     硬件防火牆:軟件防火牆嵌入在硬件中,一般的軟件安全廠商所提供的硬件防火牆便是在硬件服務器廠商定製硬件,然後再把linux系統與自己的軟件系統嵌入。價格貴,性能好,缺泛靈活性。

     軟件防火牆:單獨使用軟件系統來完成防火牆功能,將軟件部署在系統主機上,其安全性較硬件防火牆差,同時佔用系統資源,在一定程度上影響系統性能,但靈活性較好。

        2、  按作用範圍分:

                    主機防火牆:(內部網絡)

                    網絡防火牆:(外部網絡)


四、包過濾防火牆(iptables是其中之一)

        包過濾防火牆是一種查看所經過的數據包的包頭,由此決定DROP(丟棄)這個數據包,還是ACCEPT(接受)這個數據包並讓它通過,也可能執行其他更復雜的動作。

        在Linux系統中,包過濾功能是內建於內核的,它針對每一個數據包的包頭,按照包過濾規則進行判定,與規則相匹配的數據包依據路由信息繼續轉發,否則就丟棄。

        包過濾是在IP層實現,包過濾根據數據包的源IP地址、目的IP地址、協議類型(TCP、UDP或ICMP)、源端口、目的端口、ICMP消息類型、TCP包頭中的ACK位等包頭信息以及數據包傳輸方向等信息來判斷是否允許數據包通過。

        包過濾也包括與服務相關的過濾,這是指基於特定的服務進行包過濾,由於大多服務監聽都基於特定的TCP/UDP端口,因此爲阻斷所有進入特定服務的鏈接,防火牆只需將所有包含特定TCP/UDP目的端口的包丟棄即可。

      

        1、 包過濾防火牆策略:

                拒絕來自某主機或某網段的所有連接。

                允許來自某主機或某網段的所有連接。

                拒絕來自某主機或某網段的指定端口的連接。

                允許來自某主機或某網段的指定端口的連接。

                拒絕本地主機或本地網絡與其他主機或其他網絡的所有連接。

                允許本地主機或本地網絡與其他主機或其他網絡的所有連接。

                拒絕本地主機或本地網絡與其他主機或其他網絡的指定端口的連接。

                允許本地主機或本地網絡與其他主機或其他網絡的指定端口的連接。


        2、過濾數據包的基本過程

                包過濾規則必須被包過濾設備端口存儲起來。

                當數據包到達端口時,對數據包包頭進行語法分析。如IP、TCP、UDP包頭中的字段。

                包過濾規則以特殊的方式存儲。數據包規則順序必須與規則存儲順序相同。

                如果一條規則阻止數據包傳輸或接收,則此數據包便不被允許。

                如果一條規則允許數據包傳輸或接收,則此數據包便可以被繼續處理。

                如果數據包不滿足任何一條規則時,則此數據包便被阻塞。


五、iptables包過濾器防火牆

        iptables是一個用戶態的防火牆應用軟件,集成於目前大多數Linux內核中。它實際上是由netfilter和iptables兩個組件組成 ,netfilter組件了稱爲內核空間,是內核的一部分。iptables組件是一種工具,也稱用戶空間,它使用插入、修改和除去信息包過濾表中的規則變得方便快捷。


        1、netfilter:

        在整個網絡流程的若干位置放置了一些檢測點(HOOK),而在每個檢測點上登記了一些處理函數進行處理(如包過濾,NAT等,甚至可以是 用戶自定義的功能)。 

            IP層的五個HOOK點的位置如下所示

    [1]:INPUT:經路由查找後,送往本機的通過此檢查點,INPUT包過濾在此點進行;

    [2]:OUTPUT:本機進程發出的包通過此檢測點,OUTPUT包過濾在此點進行。

    [3]:FORWARD:要轉發的包通過此檢測點,FORWARD包過濾在此點進行;    

    [4]:PREROUTING:剛剛進入網絡層的數據包通過此點(剛剛進行完版本號,校驗和等檢測), 目的地址轉換在此點進行;

    [5]:POSTROUTING:所有馬上便要通過網絡設備出去的包通過此檢測點,內置的源地址轉換功能(包括地址僞裝)在此點進行;


   2、iptables鏈:

                [1]、內置鏈:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTINGwKiom1apwxOD6pU3AADJrkDif9A892.png

                [2]、自定義鏈:用於內置鏈的補充(沒有勾子函數)----可實現靈活的規則管理機構,不能單獨生效,只有在內置鏈調用時,關聯時才生效。

                

        3、iptables功能:

filter:過濾,防火牆;------真正的防火牆意義

nat:網絡地址轉換,主要用於修改源IP或目標IP,也可以改端口;-----------network address translation

mangle:拆解報文,做出修改,並重新封裝起來;

raw:關閉nat表上啓用的連接追蹤機制;


        4、功能與鏈的關係:

raw:PREROUTING,OUTPUT

mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat:PREROUTING,OUTPUT,POSTROUTING

filter:INPUT,FORWARD,OUTPUT


         5、報文的流向

流入本機:PREROUTING------>INPUT

由本機流出:OUTPUT--------->POSTROUTING

轉發:PREROUTING--->FORWARD---->POSTROUTING


   6、路由功能發生的時刻:

報文進入本機後:判斷目標主機是?

報文離開本機之前:判斷經由哪個接口送往下一部?


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

                要實現哪種功能判斷添加到那個表上

                報文流經的路徑:判斷添加到那個鏈上 

注:上的規則次序,因爲檢查的次序;因此,隱含一定的應用規則

1同類規則(訪問同一應用),匹配範圍小的放上()面;

2不同類的規則(訪問不同應用),匹配報文頻率較大的放在上(前)面;

3)將哪些可由一條規則描述的多個規則合併起來;(減少規則的數目,有可能提高性能)

4設置默認策略;


六、iptables的基本應用

 

    1、查看iptables規則:  L(列出)   S(顯示)

===================L==================

iptables -L:列出所有鏈的規則(默認filter表)

iptables -nL:以數字格式列出所有的鏈(Ip和端口)

iptables -vL:詳細列出所有鏈的規則

 

iptables -L INPUT:列出INPUT鏈的規則

iptables -L OUTPUT:列出OUTPUT鏈的規則

iptables -L FORWARD:列出FORWARD鏈的規則

iptables -L INPUT #:列出INPUT 鏈的#號規則

===================S==========================

iptables -S:顯示所有鏈的規則

iptables -vS:顯示所有鏈的詳細規則

 

iptables -S INPUT:顯示INPUT鏈的規則

iptables -S OUTPUT:顯示OUTPUT鏈的規則

iptables -S FORWARD:顯示FORWARD鏈的規則

iptables -S INPUT #:顯示INPUT 鏈的#號規則

 

    2、清除iptables指定鏈和表中所有規則:

 

iptables -F:清除所有鏈的規則(默認filter表)

iptables -F INPUT:清除INPUT鏈的所有規則

iptables -F FORWARD:清除FORWARD鏈的所有規則

iptables -F OUTPUT:清除OUTPUT鏈的所有規則

 

iptables -D:清除所有鏈的規則(默認filter表)

iptables -D INPUT #:清除INPUT鏈的#號規則

iptables -D OUTPUT #:清OUTPUT鏈的#號規則

iptables -D FORWARD #:清除FORWARD鏈的#號規則

 

    3、計數清除

iptables -Z:清除所有鏈的規則計數

iptables -Z INPUT:清除INPUT鏈的規則計數

iptables -Z OUTPUT:清除OUTPUT鏈的規則計數

iptables -Z FORWARD:清除FORWARD鏈的規則計數

 

iptables -Z INPUT #:清除INPUT鏈的#號規則計數

iptables -Z OUTPUT #:清除OUTPUT鏈的#號規則計數

iptables -Z FORWARD #:清除FORWARD鏈的#號規則計數

 

    4、設置鏈的默認策略

 

iptables -P :設置鏈的默認策略

iptables -P INPUT DROP :設置INPUT鏈拒絕所有

iptables -P OUTPUT DROP :設置OUTPUT鏈拒絕所有

iptables -P FORWARD DROP :設置FORWARD鏈拒絕所有

 

iptables -P INPUT  ACCEPT :設置INPUT鏈允許所有

iptables -P OUTPUT  ACCEPT :設置OUTPUT鏈允許所有

iptables -P FORWARD  ACCEPT :設置FORWARD鏈允許所有

 

    5、插入規則

 

iptables -I INPUT 1   :在INPUT鏈中插入第1號規則

iptables -A INPUT    :在INPUT鏈後追加一條規則

 

    6、替換指定鏈中的指定規則

 

iptables -R INPUT 1   :替換INPUT鏈中的第1號規則

iptables -R OUTPUT 1   :替換OUTPUT鏈中的第1號規則

iptables -R FORWARD 1   :替換FORWARD鏈中的第1號規則

 

    7、用戶自定義鏈

創建:

iptables -N NAME :創建用戶自定義鏈NAME

更改:

iptables -E NAME NEW_NAME:更改NAME鏈名爲NEW_NAME

刪除:

iptables -X NAME :刪除用戶自定義鏈NAME

 

 

    8、基本規則匹配器

 

指定協議:-p

tcp 、udp、icmp、all等協議!(表示非,加在協議之前)

 

指定icmp類型:

iptables -A INPUT -picmp --icmp-type echo-request -j ACCEPT

 

指定ip地址:

iptables -A INPUT -s192.168.1.2 -j ACCEPT

iptables -A INPUT -s192.168.0.0/24 -j ACCEPT

 

指定接口:

iptables -A INPUT -ieth0 -j ACCEPT

iptables -A FORWARD -o eth0 -j ACCEPT

 

指定端口號:

iptables -A INPUT -p tcp --sport 80 -j ACCEPT

iptables -A INPUT -p tcp --sport www -j ACCEPT

 

指定IP碎片:

iptables -A FORWARD -p tcp -s 192.16.0.0/24 -d 192.168.1.200 --drop 80 -j ACCEPT    # 允許192.16.0.0/24這個網段訪問192.168.1.20080端口

iptables -A FORWARD -p tcp  -f  -s 192.16.0.0/24 -d 192.168.1.200 -j ACCEPT    

 

指定TCP標記:

iptables -A FORWARD -p tcp  --tcp-flags ALL NONE -j ACCEPT 

iptables -A FORWARD -p tcp  --tcp-flags ALL SYN,ACK  -j ACCEPT 

iptables -A FORWARD -p tcp  --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT 

 

    9、擴展規則匹配器

 

limit:過濾限制速率

iptables -A INPUT -m limit --limit 1000/hour -j ACCEPT                   #  每小時數據包數量1000

iptables -A INPUT -limit --limit-burst 15 -j ACCEPT                 # 匹配最大初始數據包數量(默認是5)

iptables -A INPUT -limit --limit  5/m --limit-burst 15 -j ACCEPT     # 匹配最大初始數據包數量15 每分鐘5個

 

multiport:以離散方式定義多端口匹配;最多指定15個端口;

iptables -A INPUT -p tcp -m multiport --sport 22,88,21 -j ACCEPT    # 指定多個源端口;

iptables -A INPUT -p tcp -m multiport --dport 22,88,21 -j ACCEPT   # 指定多個目標端口;

iptables -A INPUT -p tcp -m multiport --port 22,88,21 -j ACCEPT      #   指明多個端口;

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.38.2 -p tcp -m multiport --dports 22,80 -j ACCEPT

 

iprange:指明連續的(但一般不是整個網絡)ip地址範圍;

[!] --src-range from[-to]:源IP地址;

[!] --dst-range from[-to]:目標IP地址;

iptables -A INPUT -d 172.16.38.2 -p tcp --dport 80 -m iprange --src-range 172.16.38.5-172.16.38.10 -j DROP # 拒絕172.16.38.5-172.16.38.10網絡範圍訪問本機web端口

iptables -A OUTPUT -m iprange --dst-range 172.16.38.5-172.16.38.10 -j DROP   # 禁用本機訪問172.16.38.5-172.16.38.10網絡範圍

 

string:對報文中的應用層數據做字符串模式匹配檢測;

--algo {bm|kmp}:字符串匹配檢測算法;

bm:Boyer-Moore

kmp:Knuth-Pratt-Morris

[!] --string pattern:要檢測的字符串模式;

[!] --hex-string pattern:要檢測的字符串模式,16進制格式;

iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT

iptables -A INPUT -d 172.16.38.2 -p tcp --dport 80 -m string --algo bm --string "admin" -j ACCEPT

 

time:根據將報文到達的時間與指定的時間範圍進行匹配;

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

[!] --monthdays day[,day...]

[!] --weekdays day[,day...]

--kerneltz:使用內核上的時區,而非默認的UTC;

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

星期一 Monday星期二 Tuesday星期三 Wednesday星期四 Thursday星期五 Friday星期六 Saturday星期日 Sunday

 

connlimit:根據每客戶端IP做併發連接數數量匹配;

--connlimit-upto n:連接的數量小於等於n時匹配;

--connlimit-above n:連接的數量大於n時匹配;

iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT

 

state:根據」連接追蹤機制「去檢查連接的狀態;

conntrack機制:追蹤本機上的請求和響應之間的關係;狀態有如下幾種:

NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別爲第一次發出的請求;

ESTABLISHED:NEW狀態之後,連接追蹤模板中爲其建立的條目失效之前期間內所進行的通信狀態;

RELATED:相關聯的連接;如ftp協議中的命令連接與數據連接之間的關係;

INVALID:無效的連接;

UNTRACKED:未進行追蹤的連接;


七、部分應用練習


練習:INPUT和OUTPUT默認策略爲DROP;

 

1、限制本地主機的web服務器在週一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機;

[[email protected] ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --dport 80 -m limit --limit 100/s -m time --weekdays 1 -m string --algo bm --string "admin" -j ACCEPT

[[email protected] ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

2、在工作時間,即週一到週五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個;

 #   裝載ftp連接追蹤的專用模塊

[[email protected] ~]#  modproble  nf_conntrack_ftp            

#放行命令連接

[[email protected] ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.38.2 -p tcp --dport 21 -m limit --limit 5/m -m time --timestart 8:30 --timestop 18:00 --weekdays 1,2,3,4,5 -j ACCEPT

[[email protected] ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT

#星期日 Sunday

 

connlimit:根據每客戶端IP做併發連接數數量匹配;

--connlimit-upto n:連接的數量小於等於n時匹配;

--connlimit-above n:連接的數量大於n時匹配;

iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT

 

state:根據」連接追蹤機制「去檢查連接的狀態;

conntrack機制:追蹤本機上的請求和響應之間的關係;狀態有如下幾種:

NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別爲第一次發出的請求;

ESTABLISHED:NEW狀態之後,連接追蹤模板中爲其建立的條目失效之前期間內所進行的通信狀態;

RELATED:相關聯的連接;如ftp協議中的命令連接與數據連接之間的關係;

INVALID:無效的連接;

UNTRACKED:未進行追蹤的連接;


七、部分應用練習


練習:INPUT和OUTPUT默認策略爲DROP;

 

1、限制本地主機的web服務器在週一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機;

[[email protected] ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --dport 80 -m limit --limit 100/s -m time --weekdays 1 -m string --algo bm --string "admin" -j ACCEPT

[[email protected] ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

2、在工作時間,即週一到週五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個;

 #   裝載ftp連接追蹤的專用模塊

[[email protected] ~]#  modproble  nf_conntrack_ftp            

#放行命令連接

[[email protected] ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.38.2 -p tcp --dport 21 -m limit --limit 5/m -m time --timestart 8:30 --timestop 18:00 --weekdays 1,2,3,4,5 -j ACCEPT

[[email protected] ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT

#放行數據連接

[[email protected] ~]# iptables -A INPUT -d 172.16.38.2 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

[[email protected] ~]# iptables -A OUTPUT -s 172.16.38.2 -m state --state ESTABLISHED -j ACCEPT

3、開放本機的ssh服務給172.16.x.1-172.16.x.100中的主機,x爲你的座位號,新請求建立的速率一分鐘不得超過2個;僅允許響應報文通過其服務端口離開本機;

[[email protected] ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --dport 22 -m iprange --src-range 172.16.38.1-172.16.38.100 -m limit --limit 2/m -j ACCEPT

[[email protected] ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT

4、拒絕TCP標誌位全部爲1及全部爲0的報文訪問本機;

[[email protected]www ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --tcp-flags ALL ALL -j DROP

5、允許本機ping別的主機;但不開放別的主機ping本機;

[[email protected] ~]# iptables -A INPUT -d 172.16.38.2 -p icmp --icmp-type 8 -j DROP

[[email protected] ~]# iptables -A OUTPUT -s 172.16.38.2 -p icmp --icmp-type 8 -j ACCEPT

6、開放本機web服務器給非192.168.0.0/24網絡中的主機訪問