[RHCE] Network Security
IPTABLES
iptables是Linux系統中的防火牆,防火牆最主要的工作就是過濾與限制網路的存取,iptables的架構可分為table與chain兩部分,系統預設有四個table,每個table有各自負責的用途,依照優先順序由高到低分別為raw, mangle, nat, filter。raw: 與處理一些不用特別去追蹤的連線。
mangle: 與特殊封包的標記有關。
nat: 負責進行轉址。
filter: 負責過濾進出的封包。
每個table中都有自己的chain,主要有五種chain,分別為INPUT, OUTPUT, PREROUTING, POSRROUTING, 與FORWADR;table之間可能會擁有相同的chain,例如每個table都有一個OUPUT chain,所以當處理到關於OUTPUT的封包時,就會參考table優先順序決定哪個table的chain有決定權。
INPUT: 負責進入防火牆封包的規則。
OUTPUT: 負責送出防火牆封包的規則。
FORWARD: 負責轉送封包到防火牆內終端位址的規則。
PREROUTING: 負責在進行路由前要進行的規則。
POSRROUTING: 負責在進行路由後要進行的規則。
每個chain中有自己的rule,一個chain可能有許多rule,如果一個封包進到chain中都不符合任何rule,這個封包最後就會交由policy處理,policy與rule有四種動作,ACCEPT, DROP, REJECT, LOG。所以整個iptables的層級結構大致如下:
而一個封包從進入防火牆開始,就會經過許多table的chain進行判斷處理,直到被送到目的地;如果將chain的處理順序,配合table的優先層級結合起來,就可以得到這張流程圖:
VIEW IPTABLES
使用者可以使用 #iptables –t [table名稱] –L 來查詢目前該table裡面的chain,如果不指定table,則會顯示filter table的chain,另外還有兩個選項:-n: 不進行IP與hostname的反查。
-v: 顯示詳細資訊。
上圖是 #iptables –L –v 的結果,也就是查詢filter table的chian,可以看到第一行說明chain的類型是INPUT,與流程圖中第一個出現filter的chain是INPUT相符,接著這個chain的policy是ACCEPT,這個chain目前已經通過了0個封包,0K bytes的數據;第二行就是rule的欄位說明,而rule欄位的意義如下:
pkts: 這條rule已經通過了幾個封包。
bytes: 這條rule已經通過了幾bytes的數據。
target: 封包符合這條rule時所進行的動作。
port: 這條rule是針對哪個通訊協定。
opt: 額外的選項。
in: 這條rule是針對哪個輸入介面。
out: 這條rule是針對哪個輸出介面。
source: 這條rule是針對哪個來源IP。
destination: 這條rule是針對哪個目標IP。
最後沒有欄位名稱的是這條rule的額外選項;第三行開始就是這個chain中的每條rule的規定,rule的順序是有意義的,當封包進入這個chain之後,就會依照rule的順序去判斷這個封包該怎麼處理,所以當管理者在撰寫rule的時候要特別注意rule的順序是否符合期望的規劃。
BUILD IPTABLE
一般來說要在新的主機規劃防火牆之前,管理者會先將原本的chain或者rule清除,再依照規畫重新建立規則,如此可避免原有的規則對新的規畫造成影響;但是在清除這些rule之前有件事情要先確認,就是policy,policy是防火牆的最後一道防線,假設管理者由遠端連入主機要設定防火牆,而它將所有INPUT的rule清除後,結果忘記policy是DROP,那管理者就再也無法連入主機了;所以先確認policy不會對自己造成影響,才可以刪除rule;使用 #iptable –t [table名稱] –P [chain名稱] [target] 可以設定policy,target常用ACCEPT與DROP兩種。確認完policy之後,清除目前防火牆的rule可以用 #iptables –t [table名稱] [參數] [chain名稱]:
-F: 如果不指定chain,則清除該table中所有chain中的rule。
-X: 如果不指定chain,則清除所有使用者自訂的chain,要被刪除的chain必須沒有被引用(references)以及裡面沒有任何rule。
-Z: 如果不指定chain,則清除所有chain的計數與流量統計。
最後就是要建立新的規則,同樣是使用 #iptables 這個指令,可用的參數跟選項在下面列出:
-A [chain名稱]: 在指定的chain的rule最後新增一條rule。
-I [chain名稱] [編號]: 在指定chain的rule中插入一條rule,如果不指定編號則會插到第一條。
-D [chain名稱] [編號]: 刪除chain中指定編號的rule。
-i [介面名稱]: 指定封包進入的網路介面,如eth0, eth1…等。
-o [介面名稱]: 指定封包輸出的網路介面,如eth0, eth1…等。
-p [!] [協定]: 指定通訊協定,有tcp, udp, icmp, all, 或者/etc/protocols中的名稱;「!」表示inverts,舉例來說 –p tcp 就是如果協定是tcp就執行target,-p ! tcp 就表示如果不是tcp就執行target。
-s [!] [來源IP或網域]: 指定來源的IP或網域,網域可以表示為192.168.1.1/24或192.168.1.1/255.255.255.0;「!」同樣表示inverts。
-d [!] [目標IP或網域]: 指定目的的IP或網域,網域可以表示為192.168.1.1/24或192.168.1.1/255.255.255.0;「!」同樣表示inverts。
--sport [port號範圍]: 必須配合 –p 使用,可以針對單一port設定,如 --sport 80,或者針對連續port設定,如 –sport 80:8080。
--dport [port號範圍]: 必須配合 –p 使用,可以針對單一port設定,如 --dport 80,或者針對連續port設定,如 –dport 80:8080。
-j [target]: 符合rule的條件時要執行的動作,有ACCEPT, DROP, REJECT, LOG四種動作。
ACCEPT: 允許封包通過。
DROP: 丟棄封包。
REJECT: 丟棄封包,並且向來源傳送一個ICMP的錯誤訊息。
LOG: 紀錄封包,封包會繼續往下層rule移動。
-m [模組名稱]: iptable的外掛模組,有mac與state兩種模組。
--mac-source [MAC]: 配合 –m mac 使用,可指定MAC位址,如 –m mac --mac-source 00:11:22:AA:BB:CC。
--state [封包連線狀態]: 配合 -m state 使用,可指定封包連線狀態,如 –m state --state NEW;可用的狀態有INVALID, ESTABLISHED, NEW, RELATED四種:
INVALID: 表示封包的連線狀態無法被識別或者沒有連線。
NEW: 表示這個封包的連線正要開始建立,例如TCP交握中client傳送的第一個SYN封包的狀態就是NEW。
ESTABLISHED: 表示這個封包的連線已經成功建立連接,例如TCP的交握中,cilent收到server的ack後所傳送的第一個ack的狀態就是ESTABLISHED。
RELATED: 表示封包在ESTABLISHED連線之外建立的新連線就是RELATED,例如FTP登入連線建立後,FTP資料傳送連線就是RELATED。
NAT
NAT(Network Address Translation)的功能為IP的轉換,防火牆內的IP是交換機所配發的private IP,這個IP無法存取網路上的服務,所以必須利用防火牆轉換為public IP,這個稱為SNAT(Source NAT);網路上的服務想要存取防火牆內的主機,同樣也必須將public IP轉換為private IP,才可以順利找到防火牆內的主機,這個稱為DNAT(Destination NAT)。SNAT與DNAT的規則都寫在nat table中,SNAT是從防火牆出去的所以會記錄在POSTROUTING chain中,DNAT是進來防火牆的所以會記錄在PREROUTING chain中。
SNAT的指令為 #iptables –t nat –A POSTROUTING [條件] –j SNAT --to-source [IP或IP範圍:port或port範圍],如此便可將由防火牆出去且符合條件的封包的來源IP都改為其他的IP,例如: #iptables –t nat –A POSTROUTING –p tcp –s 192.168.0.0/24 –d 0.0.0.0/0 –j SNAT --to-source 192.168.3.101-192.168.3.105 這會將192.168.0.0網段內送往任何目的的tcp封包,其封包的來源會改為192.168.3.101到192.168.3.105之間的IP。
DNAT的指令為 #iptables –t nat –A PREROUTING [條件] –j DNAT --to-destination [IP或IP範圍:port或port範圍],如此便可將進來防火牆且符合條件的封包的目的IP都改為其他的IP,例如: #iptables –t nat –A PREROUTING –p tcp –s 0.0.0.0/0 –d 192.168.3.101 --dport 80 –j DNAT --to- destination 192.168.0.250 這會將任何來源網段送往192.168.3.101:80的tcp封包,其封包目的會改為192.168.0.250。
NAT的好處在於可以擴產public IP的不足,使得防火牆內只有private IP的主機都可以存取網路上的服務;另外也加強防火牆內部網路的安全性,避免網際網路上的有心人士可以直接進入到防火牆內的網路。
留言
張貼留言