1、什麼是防火牆(Firewall)?linux
防火牆是一種位於內部網絡(主機防火牆)與外部網絡(網絡防火牆)之間的網絡安全防禦系統,根據特定的訪問規則,容許或限制數據包傳輸經過。主要做用是爲了限制企業內部的用戶對外的訪問,以及互聯網上的用戶對企業內部的訪問,在最大程度上阻止了各個環節的***行爲(可來自企業內部,也可來自互聯網)。
web
2、防火牆通常做用算法
一、數據包過濾:數據包過濾是指監控經過 的數據包的特徵來決定放行或阻止該數據包。防火牆經過數據包過濾能夠實現阻擋***,禁止外部或內部訪問的某些站點,限制每一個IP的流量和鏈接數。
安全
二、數據包透明轉發:防火牆通常架設在提供某些服務的服務器前,用戶對服務器的訪問請求與服務器的響應給用戶的信息,都須要通過防火牆的轉發,所以防火牆具有網關的能力
服務器
三、阻擋外部***:用戶發送的信息是防火牆所不容許的,防火牆會當即將其阻斷,避免其進入防火牆後面的服務器中。
網絡
四、記錄***行爲:防火牆能夠根據須要把***行爲記錄下來。
併發
3、防火牆分類ssh
一、按網絡環境分:tcp
硬件防火牆:把軟件防火牆嵌入在硬件中,通常的軟件安全廠商所提供的硬件防火牆即是在硬件服務器廠商定製硬件,而後再把linux系統與本身的軟件系統嵌入。價格貴,性能好,缺泛靈活性。ide
軟件防火牆:單獨使用軟件系統來完成防火牆功能,將軟件部署在系統主機上,其安全性較硬件防火牆差,同時佔用系統資源,在必定程度上影響系統性能,但靈活性較好。
二、 按做用範圍分:
主機防火牆:(內部網絡)
網絡防火牆:(外部網絡)
4、包過濾防火牆(iptables是其中之一)
包過濾防火牆是一種查看所通過的數據包的包頭,由此決定DROP(丟棄)這個數據包,仍是ACCEPT(接受)這個數據包並讓它經過,也可能執行其餘更復雜的動做。
在Linux系統中,包過濾功能是內建於內核的,它針對每個數據包的包頭,按照包過濾規則進行斷定,與規則相匹配的數據包依據路由信息繼續轉發,不然就丟棄。
包過濾是在IP層實現,包過濾根據數據包的源IP地址、目的IP地址、協議類型(TCP、UDP或ICMP)、源端口、目的端口、ICMP消息類型、TCP包頭中的ACK位等包頭信息以及數據包傳輸方向等信息來判斷是否容許數據包經過。
包過濾也包括與服務相關的過濾,這是指基於特定的服務進行包過濾,因爲大多服務監聽都基於特定的TCP/UDP端口,所以爲阻斷全部進入特定服務的連接,防火牆只需將全部包含特定TCP/UDP目的端口的包丟棄便可。
一、 包過濾防火牆策略:
拒絕來自某主機或某網段的全部鏈接。
容許來自某主機或某網段的全部鏈接。
拒絕來自某主機或某網段的指定端口的鏈接。
容許來自某主機或某網段的指定端口的鏈接。
拒絕本地主機或本地網絡與其餘主機或其餘網絡的全部鏈接。
容許本地主機或本地網絡與其餘主機或其餘網絡的全部鏈接。
拒絕本地主機或本地網絡與其餘主機或其餘網絡的指定端口的鏈接。
容許本地主機或本地網絡與其餘主機或其餘網絡的指定端口的鏈接。
二、過濾數據包的基本過程
包過濾規則必須被包過濾設備端口存儲起來。
當數據包到達端口時,對數據包包頭進行語法分析。如IP、TCP、UDP包頭中的字段。
包過濾規則以特殊的方式存儲。數據包規則順序必須與規則存儲順序相同。
若是一條規則阻止數據包傳輸或接收,則此數據包便不被容許。
若是一條規則容許數據包傳輸或接收,則此數據包即可以被繼續處理。
若是數據包不知足任何一條規則時,則此數據包便被阻塞。
5、iptables包過濾器防火牆
iptables是一個用戶態的防火牆應用軟件,集成於目前大多數Linux內核中。它其實是由netfilter和iptables兩個組件組成 ,netfilter組件了稱爲內核空間,是內核的一部分。iptables組件是一種工具,也稱用戶空間,它使用插入、修改和除去信息包過濾表中的規則變得方便快捷。
一、netfilter:
在整個網絡流程的若干位置放置了一些檢測點(HOOK),而在每一個檢測點上登記了一些處理函數進行處理(如包過濾,NAT等,甚至能夠是 用戶自定義的功能)。
IP層的五個HOOK點的位置以下所示
[1]:INPUT:經路由查找後,送往本機的經過此檢查點,INPUT包過濾在此點進行;
[2]:OUTPUT:本機進程發出的包經過此檢測點,OUTPUT包過濾在此點進行。
[3]:FORWARD:要轉發的包經過此檢測點,FORWARD包過濾在此點進行;
[4]:PREROUTING:剛剛進入網絡層的數據包經過此點(剛剛進行完版本號,校驗和等檢測), 目的地址轉換在此點進行;
[5]:POSTROUTING:全部立刻便要經過網絡設備出去的包經過此檢測點,內置的源地址轉換功能(包括地址假裝)在此點進行;
二、iptables鏈:
[1]、內置鏈:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
[2]、自定義鏈:用於內置鏈的補充(沒有勾子函數)----可實現靈活的規則管理機構,不能單獨生效,只有在內置鏈調用時,關聯時才生效。
三、iptables功能:
filter:過濾,防火牆;------真正的防火牆意義
nat:網絡地址轉換,主要用於修改源IP或目標IP,也能夠改端口;-----------network address translation
mangle:拆解報文,作出修改,並從新封裝起來;
raw:關閉nat表上啓用的鏈接追蹤機制;
四、功能與鏈的關係:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
五、報文的流向
流入本機:PREROUTING------>INPUT
由本機流出:OUTPUT--------->POSTROUTING
轉發:PREROUTING--->FORWARD---->POSTROUTING
六、路由功能發生的時刻:
報文進入本機後:判斷目標主機是?
報文離開本機以前:判斷經由哪一個接口送往下一部?
七、添加規則時的考量點:
要實現哪一種功能:判斷添加到那個表上
報文流經的路徑:判斷添加到那個鏈上
注:鏈上的規則次序,由於檢查的次序;所以,隱含必定的應用規則
1)同類規則(訪問同一應用),匹配範圍小的放上(前)面;
2)不一樣類的規則(訪問不一樣應用),匹配報文頻率較大的放在上(前)面;
3)將哪些可由一條規則描述的多個規則合併起來;(減小規則的數目,有可能提升性能)
4)設置默認策略;
6、iptables的基本應用
一、查看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 鏈的#號規則
二、清除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鏈的#號規則
三、計數清除:
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鏈的#號規則計數
四、設置鏈的默認策略
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鏈容許全部
五、插入規則
iptables -I INPUT 1 :在INPUT鏈中插入第1號規則
iptables -A INPUT :在INPUT鏈後追加一條規則
六、替換指定鏈中的指定規則
iptables -R INPUT 1 :替換INPUT鏈中的第1號規則
iptables -R OUTPUT 1 :替換OUTPUT鏈中的第1號規則
iptables -R FORWARD 1 :替換FORWARD鏈中的第1號規則
七、用戶自定義鏈
建立:
iptables -N NAME :建立用戶自定義鏈NAME
更改:
iptables -E NAME NEW_NAME:更改NAME鏈名爲NEW_NAME
刪除:
iptables -X NAME :刪除用戶自定義鏈NAME
八、基本規則匹配器
指定協議:-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.200的80端口
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
九、擴展規則匹配器
limit:過濾限制速率
iptables -A INPUT -m limit --limit 1000/hour -j ACCEPT # 每小時數據包數量1000
iptables -A INPUT -m limit --limit-burst 15 -j ACCEPT # 匹配最大初始數據包數量(默認是5)
iptables -A INPUT -m 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:未進行追蹤的鏈接;
7、部分應用練習
練習:INPUT和OUTPUT默認策略爲DROP;
一、限制本地主機的web服務器在週一不容許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不容許訪問;web服務器僅容許響應報文離開本機;
[root@www ~]# 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
[root@www ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
二、在工做時間,即週一到週五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個;
# 裝載ftp鏈接追蹤的專用模塊
[root@www ~]# modproble nf_conntrack_ftp
#放行命令鏈接
[root@www ~]# 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
[root@www ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
#放行數據鏈接
[root@www ~]# iptables -A INPUT -d 172.16.38.2 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@www ~]# iptables -A OUTPUT -s 172.16.38.2 -m state --state ESTABLISHED -j ACCEPT
三、開放本機的ssh服務給172.16.x.1-172.16.x.100中的主機,x爲你的座位號,新請求創建的速率一分鐘不得超過2個;僅容許響應報文經過其服務端口離開本機;
[root@www ~]# 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
[root@www ~]# iptables -A OUTPUT -s 172.16.38.2 -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
四、拒絕TCP標誌位所有爲1及所有爲0的報文訪問本機;
[root@www ~]# iptables -A INPUT -d 172.16.38.2 -p tcp --tcp-flags ALL ALL -j DROP
五、容許本機ping別的主機;但不開放別的主機ping本機;
[root@www ~]# iptables -A INPUT -d 172.16.38.2 -p icmp --icmp-type 8 -j DROP
[root@www ~]# iptables -A OUTPUT -s 172.16.38.2 -p icmp --icmp-type 8 -j ACCEPT
6、開放本機web服務器給非192.168.0.0/24網絡中的主機訪問
[root@www ~]# iptables -A INPUT 3 -s 192.168.0.0/24 -d 172.16.38.2 -p tcp --dport 80 -j DROP
7、禁止本機被非172.16.0.0/16網絡中的主機進行ping請求;
[root@www ~]# iptables -A INPUT ! -s 172.16.0.0/16 -d 172.16.38.2 -p icmp --icmp-type 8 -j DROP
補充:利用iptables的recent模塊來抵禦DOS***: 22,創建一個列表,保存有全部訪問過指定的服務的客戶端IP
ssh: 遠程鏈接,
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模塊將單IP的併發設置爲3;會誤殺使用NAT上網的用戶,能夠根據實際狀況增大該值;
2.利用recent和state模塊限制單IP在300s內只能與本機創建2個新鏈接。被限制五分鐘後便可恢復訪問。
下面對最後兩句作一個說明:
1.第二句是記錄訪問tcp 22端口的新鏈接,記錄名稱爲SSH
--set 記錄數據包的來源IP,若是IP已經存在將更新已經存在的條目
2.第三句是指SSH記錄中的IP,300s內發起超過3次鏈接則拒絕此IP的鏈接。
--update 是指每次創建鏈接都更新列表;
--seconds必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--update同時使用
3.iptables的記錄:/proc/net/xt_recent/SSH
下面防火牆規則:容許22號和80號端口進入和響應, 不容許本機經過任務端口訪問外部網絡
[root@www ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.16.38.2 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 172.16.38.2 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 172.16.38.2 0.0.0.0/0 state ESTABLISHED
DROP all -- 172.16.38.2 0.0.0.0/0