轉載: http://my.oschina.net/shipley/blog/299025
Firewall(防火牆):元件,工作在網路邊緣(主機邊緣),對進出網路資料包基於一定的規則檢查,並在匹配某規則時由規則定義的處理進行處理的一組功能的元件。
防火牆型別:根據工作的層次的不同來劃分,常見的防火牆工作在OSI第三層,即網路層防火牆,工作在OSI第七層的稱為應用層防火牆,或者代理伺服器(代理閘道器)。
網路層防火牆又稱包過濾防火牆,在網路層對資料包進行選擇,選擇的依據是系統內設定的過濾邏輯,被稱為訪問控制列表(ACL),通過檢查資料流中每個資料的源地址,目的地址,所用埠號和協議狀態等因素,或他們的咋喝來確定是否允許該資料包通過。
優點:對使用者來說透明,處理速度快且易於維護。
缺點:一旦黑客突破防火牆,就可以輕易地偽造資料包的源地址,目的地址和IP的埠號,即“IP地址偽造”。
包過濾防火牆圖示
代理服務型防火牆(Proxy Service)將所有跨越防火牆的網路通訊鏈路分為兩段。當代理伺服器接收到使用者對某個站點的訪問請求後會檢查該請求是否符合控制規則。如果規則允許,則代理伺服器會替使用者去那個站點取回所需要的資訊,轉發給使用者。內外網使用者的訪問都是通過代理伺服器上的“連結”來實現的,從而起到了隔離防火牆內外計算機系統的作用。特點:在應用層對資料進行檢查,比較安全。但是會增加防火牆的負載。
代理服務型防火牆圖示
現實生產環境中所使用的防火牆一般都是二者結合體。即先檢查網路資料,通過之後再送到應用層去檢查。
netfilter元件稱為核心空間,它被整合在linux核心中。netfilter是一種核心中用於擴充套件各種網路服務的結構化底層框架。它是在核心中選取五個位置放了五個hook function,而這五個hook function向使用者開放,使用者可以通過一個工具(iptables)向其寫規則。
netfilter 主要由資訊過濾表(table)組成,包含了控制IP包處理的規則集(rules)。根據規則所處理的IP包的型別,規則被分組放在鏈(chain)中,從而使核心對來自某些源,前往某些目的地或具有某些協議型別的資訊包處置方法,如完成資訊包的處理、控制和過濾等工作。
iptables也稱為使用者空間,是一個工作在使用者層用來寫規則的工具,寫好的規則被送往netfilter。這些規則告訴核心中的netfilter元件如何去處理資訊包。
五個hook function(規則鏈):Input ,Output,Forward,prerouting,postrouting。
filter:Input,Output,Forward
四種處理機制(表):過濾(filter) 主要用於過濾資料包,該表根據管理員預定義的一組規則過濾符
合條件的資料包。filter表是iptables預設的表。
l INPUT:主要與想要進入我們 Linux 本機的資料包有關;
l OUTPUT:主要與我們 Linux 本機所要送出的資料包有關;
l FORWARD:與 Linux 本機比較沒有關係, 他可以傳遞資料包到後臺的計算機中,與下列 nat table 相關性較高。
地址轉換(NAT) 主要用於網路地址轉換,該表可實現一對一。一對多,多對多
等工作,iptables就是使用該表實現共享上網功能。
l PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)
l POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE)
l OUTPUT:與傳送出去的資料包包有關
包重構(mangle)對指定的資料包進行修改,例如更改TTL和TOS等,實際中很
少使用。
RAW 很少使用
一條鏈可以包含一條或者數條規則。
nat:prerouting,postrouting,output
mangle:Input ,Output,Forward,prerouting,postrouting。
RAW:prerouting,output
iptables傳輸資料包的過程
1 當一個資料包進入網路卡時,資料包首先進入PREROUTING鏈,核心根據資料包目的IP判斷是否需要轉送出去。
2 如果資料包就是進入本機的,資料包就會沿著圖向下移動,到達INPUT鏈。資料包到達INPUT鏈後,任何程式都會收到它。本機上執行的程式可以傳送資料包,這些資料包經過OUTPUT鏈,然後到達POSTROTING鏈輸出。
3 如果資料包是要轉發出去的,且核心允許轉發,資料包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。
iptables中各表與鏈的相互關係 《鳥哥的私房菜》
書寫規則:
iptables [-t table] command CHAIN [NUM ] match criteria -j TARGET
CHAIN: 對鏈進行的操作
-N:new 新建一條鏈
-X 刪除一條使用者自定義鏈(空鏈)
-F:flush 清空一條鏈,預設清空表中所有鏈
-Z:zero 清空計數器,iptables中每條規則預設有兩個計數器,用於記錄本條規則所匹配到的資料包的個數和本條規則所匹配到的資料包的總大小
-P:policy 定義鏈的預設處理策略
-E 重新命名鏈
RULE:對規則進行的操作
-A:append 追加,在鏈的最後加一條規則
-I:insert 插入一條規則 一般使用-I CHAIN NUM 給規則加一個編號。
-R:replace 替換某條規則,規則被替換並不會改變順序,必須要指定替換的規則編號:-R CHAIN NUM。
-D:delete 刪除一條規則,可以輸入完整規則,或者直接指定標號加以刪除:-D CHAIN NUM。
LIST:檢視
-L:list 列出鏈中的所有規則
輔助性子命令:-n numeric 以數字的形式來顯示地址,預設顯示主機名稱
-v verbose 顯示詳細資訊 ,支援-vv -vvv格式,v越多,資訊越詳細。
-x 顯示原有資訊,不要做單位換算
--line-numbers 顯示規則的行號
Match Creteria(匹配規則):
基本匹配
-s,--src,--source 匹配資料包的源地址
-d,--dst,--destination 匹配資料包的目標地址
-i, 指定資料包的流入介面(邏輯介面)
-o, 指定資料包的流出介面
-p, 做協議匹配 protocol,(tcp|udp|icmp)
擴充套件匹配:對某一種功能的擴充套件
隱含擴充套件 :對某一種協議的擴充套件
-p tcp
--sport 指定源埠
--dport 指定目的埠
--tcp-flags(SYN,ACK,FIN,PSH,URG,RST,ALL,NONE)指定TCP的標誌位
需要跟兩個標誌位列表,如:SYN,ACK,FIN,RST SYN 第一個列表表示要檢查的位,第二個
列表表示第一個列表中出現的位必須為1,未出現的必須為0
--syn 只允許新連線
-p udp 無連線協議
--sport 指定源埠
--dport 指定目的埠
-p icmp
--icmp-type echo-request,8(ping出去,請求回應,) echo-reply,0(給予回應)
顯式擴充套件 :額外附加的更多的匹配規則,功能性地擴充套件
-m state 狀態檢測擴充套件
NEW 使用者發起一個全新的請求
ESTABLISHED 對一個全新的請求進行回應
RELATED 兩個完整連線之間的相互關係,一個完整的連線,需要依賴於另一個完整的連線
INVALID 無法識別的狀態
-m multiport --sports 22,80,443 指定多個源埠
--dports 22,80,443 指定多個目標埠
--ports 非連續埠
-m connlimit 限定併發連線速率
!--connlimit-above 5 高於五個將拒絕
-m string 字串匹配
--algo bm|kmp 指定演算法
--string pattern
-m time 基於時間的匹配
--timestart
--timestop
--days
-j TARGET 處理動作
ACCEPT 接受
DROP 悄悄丟棄,請求端沒有任何回應
REJECT 明確拒絕
SNAT 源地址轉換
DNAT 目標地址轉換
REDIRECT 埠重定向
LOG 將訪問記錄下來
[root@server27 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
下面我們寫兩條規則:
只允許192.168.0.0網段的主機通過SSH訪問該主機
允許本機通過SSH連線192.168.0.0網段的其他主機
[root@server27 ~]# iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 22 -j ACCEPT
[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT
[root@server27 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.0.0/24 192.168.0.127 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.0.127 192.168.0.0/24 tcp spt:22
定義預設策略
[root@server27 ~]# iptables -t filter -P INPUT DROP
[root@server27 ~]# iptables -t filter -P OUTPUT DROP
PS:上面規則一定不要寫錯了,否則你將會把自己拒之門外。
允許本機PING本網段任何主機
[root@server27 ~]# iptables -t filter -A OUTPUT -s 192.168.0.127 -d 0.0.0.0/0.0.0.0 -p icmp --icmp-type 8 -j ACCEPT //**出去的資料包
[root@server27 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.0.127 -p icmp --icmp-type 0 -j ACCEPT //** 回來的資料包
[root@server27 ~]# ping 192.168.0.236 -c 4
PING 192.168.0.236 (192.168.0.236) 56(84) bytes of data.
64 bytes from 192.168.0.236: icmp_seq=1 ttl=64 time=0.242 ms
64 bytes from 192.168.0.236: icmp_seq=2 ttl=64 time=0.249 ms
64 bytes from 192.168.0.236: icmp_seq=3 ttl=64 time=0.437 ms
64 bytes from 192.168.0.236: icmp_seq=4 ttl=64 time=0.204 ms
允許本網段任何主機PING本機
[root@server27 ~]# iptables -t filter -A OUTPUT -s 192.168.0.127 -d 0.0.0.0/0.0.0.0 -p icmp --icmp-type 0 -j ACCEPT
[root@server27 ~]# iptables -t filter -A INPUT -d 192.168.0.127 -s 0.0.0.0/0.0.0.0 -p icmp --icmp-type 8 -j ACCEPT
PS:當目標網路指定為任意主機時,應該為0.0.0.0/0.0.0.0
凡是來自192.168.0.0/24網段的主機均使用一個自定義的新鏈
先開啟http服務
自定義一條鏈,拒絕192.168.0.0/24網段的主機對http服務的訪問
[root@server27 ~]# iptables -N attach-input
[root@server27 ~]# iptables -A attach-input -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 80 -j DROP
[root@server27 ~]# iptables -L -n
此時,自定義鏈依舊無法使用,我們只能在固定鏈上做轉發請求資料包到自定義鏈上,才能實現自定義鏈的功能。
[root@server27 ~]# iptables -A INPUT -s 192.168.0.0/24 -j attach-input
[root@server27 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
attach-input all -- 192.168.0.0/24 0.0.0.0/0
此時已經無法訪問到網頁。
將INPUT鏈刪除之後,馬上又可以訪問了。
[root@server27 ~]# iptables -F INPUT
刪除自定義鏈,先清空鏈,再清空規則
[root@server27 ~]# iptables -F attach-input
[root@server27 ~]# iptables -X attach-input
PS:每條規則都可以使用“!”取反。如: -s '!' 192.168.0.0/24,加單引號防止被識別成其他字元。
下面我們來實現顯式擴充套件狀態檢測的功能:
先將預設策略置為DROP
[root@server27 ~]# iptables -P INPUT DROP
[root@server27 ~]# iptables -P OUTPUT DROP
[root@server27 ~]# iptables -P FORWARD DROP
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 80 -j ACCEPT //*進來的資料包
[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 80 -j ACCEPT //*出去的資料包
但是這兩條規則對於反彈式木馬是無效的。
我們可以基於顯式擴充套件寫這樣兩條規則:
[root@server27 ~]# iptables -I INPUT 1 -d 192.168.0.127 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //**進來的資料包
[root@server27 ~]# iptables -I OUTPUT -s 192.168.0.127 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT //**出去的資料包
刪除我們之前建立的那兩條規則:
[root@server27 ~]# iptables -D INPUT 2
[root@server27 ~]# iptables -D OUTPUT 2
此時,已經可以正常訪問http服務。
我們試一下ftp服務:
先開啟ftp服務
先建立這樣四條規則,看看能不能達到效果,
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 21 -j ACCEPT
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 20 -j ACCEPT
[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 21 -j ACCEPT
[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 20 -j ACCEPT
客戶端請求是被動模式,實驗證明,我們僅僅開始21 20埠無法達到效果。這樣我們就得用到狀態檢測的RELATED機制。
PS:要想實現FTP的訪問需先手動載入額外的模組:ip_conntrack_ftp,ip_conntrack_tftp,ip_nat_ftp,,ip_nat_tftp(and others)
[root@server27 ~]# modprobe ip_conntrack_ftp
[root@server27 ~]# modprobe ip_nat_ftp
[root@server27 ~]# modprobe ip_nat_tftp
[root@server27 ~]# modprobe ip_conntrack_tftp
實現自動載入的功能:編輯/etc/sysconfig/iptables-config檔案,在“IPTABLES_MODULES=”後面寫上要新增的模組就可以了。
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 21 -j ACCEPT
[root@server27 ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp -m state --state RELATED -j ACCEPT
[root@server27 ~]# iptables -R OUTPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT //**修改上一條規則,增加RELATED狀態
[root@server27 ~]# iptables -R INPUT 3 -d 192.168.0.127 -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT //**修改INPUT第三條規則,增加NEW,ESTABLISHED狀態
此時ftp已經可以訪問了,要保證所有的規則能夠永久有效需要使用:service iptables save來儲存。
基於字串匹配的顯式擴充套件功能:
[root@server27 ~]# iptables -A INTPUT -d 192.168.0.127 -p tcp --dport 80 -m string --algo kmp --string 'qq.com' -j REJECT
PS:iptables工作在OSI第三層,第四層。預設情況下,iptables無法限定第七層的應用程式,要想實現限制七層某些應用程式的功能,需要重編譯核心,在核心上打上補丁 layer7。.
源地址換換和目標地址轉換:
PS:源地址轉換必須在POSTROUTING鏈上做。
目標地址轉換必須在PREROUTING鏈上做。
下面我們來實現源地址的功能:
我們假設這樣一種場景:
192.168.0.254是工作在外網的一臺WEB伺服器,中間的那臺是企業裡的NAT伺服器,我們在上面新增iptables的規則,使其實現地址轉換的功能,PC機是工作在企業內部。我們的最終目的是192.168.80.30這臺計算機通過NAT伺服器可以訪問到192.168.0.254的WEB服務。
實驗環境搭建:192.168.0.254 192.168.0.127使用虛擬機器網路卡的橋接功能;
192.168.80.129 192.168.080.130使用虛擬機器網路卡的僅主機功能;
為PC機設定閘道器:
[root@station39 ~]# route add default gw 192.168.80.129
下面開始來配置NAT伺服器:
首先要開啟NAT伺服器的核心路由功能:
[root@server27 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@server27 ~]# cat /proc/sys/net/ipv4/ip_forward
1
設定規則:
[root@server27 ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -d 192.168.0.0/24 -j SNAT --to-source 192.168.0.127
[root@server27 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.80.0/24 192.168.0.0/24 to:192.168.0.127
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
OK,我們用192.168.80.130這臺主機訪問一下192.168.0.254,看,已經可以了!
只需一條規則就可以搞定,很方便吧!
PS:如果我們使用路由功能來訪問254這臺主機的話,WEB伺服器的訪問日誌將記錄的訪問地址是192.168.80.130,而如果我們使用地址轉換的功能來訪問的話,訪問日誌記錄的訪問地址則是192.168.0.127。.
一般我們上網的時候,所獲得的IP都是動態的,怎麼辦?
做源地址轉換的時候,還有一個小功能MASQUERADE(地址偽裝),使用這個功能,我們不需要
指定目標地址,它會自動探測能夠上網際網路的地址,並自動將內網地址轉換過來。缺陷:比較耗費資源。
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
接下來開始實現目標地址轉換功能:
場景:假設192.168.80網段為一個提供WEB服務的網站的內網,中間的為網站的NAT伺服器,遠端的客戶端192.168.0.26想通過中間的NAT伺服器來訪問內部的192.168.80.130提供的WEB服務,這裡就要用到目標地址轉換了。
環境搭設:192.168.80.130 192.168.80.129使用虛擬機器網路卡的僅主機功能
192.168.0.26 192.168.0.127使用虛擬機器網路卡的橋接功能
設定192.168.80.130的閘道器:
[root@station39 ~]# route add default gw 192.168.80.129
開始在NAT伺服器上設定規則:
這裡依然要開啟核心的路由功能。
開始之前先將剛才做的源地址轉換實驗的規則給清除了
[root@server27 ~]# iptables -t nat -F
開始寫規則:
[root@server27 ~]# iptables -t nat -A PREROUTING -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.130
[root@server27 ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 192.168.0.0/24 192.168.0.127 tcp dpt:80 to:192.168.80.130
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
OK!規則已經寫好了,我們使用192.168.0.26來訪問一下192.168.0.127試試,已經可以訪問了,其實提供WEB服務的是192.168..80.130這臺主機,這就是目標地址轉換的功能。
我們再檢視一下192.168.80.130這臺WEB伺服器的訪問日誌:
看,源地址並沒有發生改變!只是訪問的目標地址被轉換到192.168.80.130上來了,這就是目標地址轉換。
l7-filter 七層過濾,對核心打補丁之後,能夠支援對應用層資料的過濾。
編譯過程相對繁瑣一些,也不是本文主要講述內容,所以就不在此詳細說明,有興趣的朋友可以去網上查詢相關教程。
編譯完成並啟用核心之後,就可以使用l7filter的過濾功能了。
我們新增這樣兩條規則:
[root@server27 ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -d 192.168.0.0/24 -j SNAT --to-source 192.168.0.127
[root@server27 ~]# iptables -t nat -A FORWARD -m layer7 --l7proto qq -j REJECT
這裡就不再演示效果了。
儲存iptables規則:
/etc/init.d/iptables save
service iptables save
儲存位置:在/etc/sysconfig/iptables檔案內:
# Generated by iptables-save v1.3.5 on Fri Mar 4 19:44:47 2011
*filter
:INPUT DROP [33:2399]
:FORWARD DROP [0:0]
:OUTPUT DROP [7:540]
-A INPUT -d 192.168.0.127 -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -d 192.168.0.127 -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Fri Mar 4 19:44:47 2011
指定規則儲存位置:
iptables-save > /etc/sysconfig/iptables/iptables.20110307
生效儲存的規則
iptables-restore < /etc/sysconfig/iptables/iptables.20110307
避免在遠端連線寫規則的時候一不小心自己被防火牆拒之門外,可以寫一個小指令碼:
#!/bin/bash
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
at now+10min
測試完成之後停掉指令碼就可以了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16674653/viewspace-1972765/,如需轉載,請註明出處,否則將追究法律責任。