關(guān)于網(wǎng)絡(luò)安全的研究分析中,防火墻(Firewall)是被經(jīng)常強調(diào)的重點,它基本功能是過濾并可能阻擋本地網(wǎng)絡(luò)或者網(wǎng)絡(luò)的某個部分與Internet之間的數(shù)據(jù)傳送(數(shù)據(jù)包)。數(shù)據(jù)包其實就是一段段的數(shù)據(jù),其中同時包括了用來把它們發(fā)送到各自的目的地所必須的信息。你可以把數(shù)據(jù)包想象成一個郵包:數(shù)據(jù)包本身就是郵包中的數(shù)據(jù),而信封上則是所有用來把這些信息發(fā)送到正確的機(jī)器和正確的程序中去的書信抬頭,它同時還包含著回信地址等方面的信息。在其具體的過濾工作過程中,防火墻將接管在此之前從網(wǎng)絡(luò)內(nèi)部存取Internet和從Internet存取該內(nèi)部網(wǎng)絡(luò)的路由設(shè)置。 我們的感覺是以前的防火墻專門用來過濾一些非法的數(shù)據(jù)包,要么為什么其中的一種類型稱為包過濾型防火墻呢?發(fā)展到現(xiàn)在,它的功能是日益增多,不僅能夠過濾數(shù)據(jù)包,還能夠作網(wǎng)絡(luò)地址轉(zhuǎn)換,作代理等等。Linux內(nèi)核2.4中防火墻實現(xiàn)NetFilter就是這樣的。 先來看看防火墻所處的位置,我的理解是要么它裝在一臺機(jī)器上作個人防火墻,要么裝在一臺機(jī)器上為一個局域網(wǎng)提供網(wǎng)關(guān)的功能,而后種情況則如下圖所示: 這副圖概括了裝在網(wǎng)關(guān)上的NetFilter的框架結(jié)構(gòu)圖,從圖中可以看到一個數(shù)據(jù)包可能經(jīng)過的路徑,其中用[]擴(kuò)起來的東東,稱為檢查點,當(dāng)數(shù)據(jù)包到達(dá)這個點時,就要停下來進(jìn)行一些檢查。這里檢查點的名稱使用的是iptables中名稱,具體到NetFilter中可能就要改為那些所謂的鉤子 (Hook)函數(shù)了。 NetFilter概括起來說,它有下面的三個基本功能: 1、數(shù)據(jù)過濾(filter表) 根據(jù)這三個功能,將上面的五個檢查點按功能進(jìn)行了分類。由于每個功能在NetFilter中對應(yīng)一個表,而每個檢查點又有若干個匹配規(guī)則,這些規(guī)則組成一個鏈,所以就有下面的說法:“NetFilter是表的容器,表是鏈的容器,鏈?zhǔn)且?guī)則的容器” 一個鏈(chain)其實就是眾多規(guī)則(rules)中的一個檢查清單(checklist)。每一條鏈中可以有一條或數(shù)條規(guī)則,每一條規(guī)則都是這樣定義的“如果數(shù)據(jù)包頭符合這樣的條件,就這樣處理這個數(shù)據(jù)包”。當(dāng)一個數(shù)據(jù)包到達(dá)一個鏈時,系統(tǒng)就會從第一條規(guī)則開始檢查,看是否符合該規(guī)則所定義的條件: 如果滿足,系統(tǒng)將根據(jù)該條規(guī)則所定義的方法處理該數(shù)據(jù)包;如果不滿足則繼續(xù)檢查下一條規(guī)則。最后,如果該數(shù)據(jù)包不符合該鏈中任一條規(guī)則的話,系統(tǒng)就會根據(jù)該鏈預(yù)先定義的策略(policy)來處理該數(shù)據(jù)包。 而一個iptables命令基本上包含如下五部分:希望工作在哪個表上、希望使用該表的哪個鏈、進(jìn)行的操作(插入,添加,刪除,修改)、對特定規(guī)則的目標(biāo)動作和匹配數(shù)據(jù)包條件。 基本的語法為:iptables -t table -Operation chain -j target match(es)(系統(tǒng)缺省的表為"filter") 基本操作如下: -A 在鏈尾添加一條規(guī)則 基本目標(biāo)動作,適用于所有的鏈: ACCEPT 接收該數(shù)據(jù)包 基本匹配條件,適用于所有的鏈: -p 指定協(xié)議(tcp/icmp/udp/...) 匹配條件擴(kuò)展: TCP-----匹配源端口,目的端口,及tcp標(biāo)記的任意組合,tcp選項等。 目標(biāo)動作擴(kuò)展: LOG 將匹配的數(shù)據(jù)包傳遞給syslog()進(jìn)行記錄 Ipchains是一種Linux下使用比較廣泛的工具軟件,可以實現(xiàn)數(shù)據(jù)包過濾的防火墻功能(Linux的內(nèi)核為2.1及以上的內(nèi)核版本都能夠支持這個軟件包)。這個軟件包管理著對Linux操作系統(tǒng)內(nèi)核本身極為重要的那些IP帳戶和防火墻功能。用戶使用的內(nèi)核必須已經(jīng)在編譯時激活 ipchains功能;如果想掌握ipchains運行在哪一個層次,就必須在數(shù)據(jù)包級別上精通TCP/IP網(wǎng)絡(luò)的數(shù)據(jù)傳輸情況。ipchains是一個數(shù)據(jù)包過濾器,即是一個用來檢查數(shù)據(jù)包的信封內(nèi)容的程序;同時,根據(jù)用戶設(shè)定的一系列規(guī)則,還可以決定是否允許某些數(shù)據(jù)包通過和把它們發(fā)送到什么地方。 安裝ipchains:首先下載或在光盤上找到它的rpm包,然后以root身份登錄進(jìn)入系統(tǒng),敲入“rpm -ivh ipchains*”的命令來安裝ipchains軟件包。 配置ipchains的數(shù)據(jù)包過濾功能:首先依然以root用戶身份登錄進(jìn)入系統(tǒng),接著輸入“ipchains-L”命令,查看當(dāng)前已經(jīng)存在的鏈。如果你還沒有對這些選項進(jìn)行過配置的話,應(yīng)該會看到下面這樣的幾行: >chaininput(policyACCEPT); 選擇打算配置的鏈:一個鏈就是一系列加在一組數(shù)據(jù)包類型上的規(guī)則。inputchain(輸入鏈)指的是進(jìn)入到防火墻機(jī)器中的數(shù)據(jù)包。 forwardchain(轉(zhuǎn)發(fā)鏈)指的是進(jìn)入到防火墻機(jī)器中而現(xiàn)在又需要發(fā)送到網(wǎng)絡(luò)中的另外一臺機(jī)器上的數(shù)據(jù)包。outputchain(輸出鏈)指的是要向外發(fā)送的數(shù)據(jù)包。 然后輸入“ipchains -L chain”命令,列出打算編輯的鏈中當(dāng)前已經(jīng)存在的規(guī)則。在缺省的情況下,所有的鏈中的規(guī)則都是空白的。再輸入“ipchain-Achain”,告訴 ipchains程序需要針對哪個鏈建立一個新的數(shù)據(jù)包過濾規(guī)則。舉例來說,用戶可能想對輸入鏈建立些新規(guī)則,那么就輸入“ipchains -A input”。現(xiàn)在還不能按回車鍵,還有事情要做。現(xiàn)在需要鍵入規(guī)則本身的內(nèi)容。我們假定用戶想做的設(shè)置是:除了從某一臺特定的遠(yuǎn)程工作站點之外,人們沒有辦法遠(yuǎn)程登錄連接到防火墻后面的任何機(jī)器。在你正在建立的那個規(guī)則的格式中使用-s(source)標(biāo)志設(shè)置地址(或地址范圍),如下: (1)單個完整的IP地址,比如:192.168.152.24。 我們這個示例的目標(biāo)是只允許從三臺特定的機(jī)器上接入遠(yuǎn)程登錄服務(wù),它們的IP地址是192.156.12.1到192.156.12.3。表示這個地址范圍的IP地址和網(wǎng)絡(luò)屏蔽碼組合是192.156.12.1/255.255.255.252。現(xiàn)在用戶的規(guī)則語句看起來應(yīng)該是這個樣子的: ipchains-Ainput-s192.156.12.1/255.255.255.252還是不能按回車鍵,你還有事情要做。 除了來自這三臺機(jī)器以外,還可以繼續(xù)細(xì)化,告訴ipchains程序允許通過防火墻進(jìn)入的接收程序必須要使用哪一種協(xié)議。用戶可以使用-p(protocol,協(xié)議)標(biāo)志。遠(yuǎn)程登錄進(jìn)程使用的是TCP協(xié)議。現(xiàn)在這條規(guī)則看起來像是:ipchains- Ainput-s192.156.12.1/255.255.255.252-pTCP還是不要按回車鍵。 圍繞某個特定的協(xié)議建立一條規(guī)則的選擇太多了,但是用戶可以為你選定的進(jìn)程指定其端口(port)來細(xì)化那條規(guī)則。用戶可以把端口的名稱加到規(guī)則的末尾,也可以用一個冒號引導(dǎo)該端口的端口號。從/etc/services文件中可以查到任何網(wǎng)絡(luò)服務(wù)所使用的端口號。現(xiàn)在這條規(guī)則看起來是下列這兩行文字中的某個樣子: ipchains-Ainput-s192.156.12.1/255.255.255.252-pTCP:23ALLOW 現(xiàn)在可以按下回車鍵了。用戶在確實屏蔽了其他接入類型之前,這條規(guī)則實際上還是沒有什么用處的。最好的解決方法(因為我們的目的是為用戶所有希望允許的東西建立規(guī)則)是使用-P(policy)標(biāo)志(注意是大寫字母)屏蔽所有的輸入,然后ipchains就會去檢查特定的規(guī)則看看到底什么才能被允許進(jìn)入。這樣的一個策略語句如下所示:ipchains-PinputDENY 在重啟動/關(guān)機(jī)之前保存數(shù)據(jù)包過濾規(guī)則:沒有哪個配置文件是用來自動保存數(shù)據(jù)包過濾規(guī)則供你下次啟動機(jī)器的時候使用的。因此,選擇某種方法自己來完成這項工作就十分重要,否則下一次你就還得從頭一點一滴地重新寫出所有的規(guī)則。下面介紹一個保存數(shù)據(jù)包過濾規(guī)則的方法:先以root身份登錄進(jìn)入系統(tǒng),再使用ipchains-save腳本程序把用戶已經(jīng)編寫好的規(guī)則設(shè)置保存到一個文件中去,比如/root/ipchains-settings文件。輸入“ipchains-save>/root/ipchains-settings”。 開機(jī)引導(dǎo)后恢復(fù)數(shù)據(jù)包過濾規(guī)則:用戶在計算機(jī)重啟動之后,必須恢復(fù)數(shù)據(jù)包過濾規(guī)則。請按照下面的方法完成這項任務(wù):先以root身份登錄進(jìn)入系統(tǒng),再使用ipchains-restore腳本程序在某個文件中檢索用戶已經(jīng)編寫好的規(guī)則,比如從文件/root/ipchains-settings 中恢復(fù)數(shù)據(jù)包過濾規(guī)則。如下所示,輸入“ipchains-restore<> 如果要想實現(xiàn)代理防火墻功能,需要安裝能夠控制用戶從某個網(wǎng)絡(luò)的外部可以使用和不可以使用什么樣的網(wǎng)絡(luò)服務(wù)功能的軟件。代理防火墻不允許有任何連接接入到它后面的機(jī)器上(當(dāng)然也不是絕對的),不存在任何數(shù)據(jù)包過濾的效果,從接入連接的角度考慮,它就是一堵密不透風(fēng)的磚墻。可以如下設(shè)置: 首先在/etc/inetd.conf文件中禁用任何你不打算使用的服務(wù)功能,方法是把它們改為注釋語句(即在那些語句開頭加上一個#符號)。任何一種服務(wù)都會為試圖進(jìn)入系統(tǒng)的那些人多打開一條通路,因此應(yīng)該只使用你確實需要的服務(wù)。 接著編輯/etc/issue.net文件,刪除其中關(guān)于在你的機(jī)器上運行的特定硬件和Linux發(fā)行版本的介紹信息。這些信息會在諸如Telnet之類的遠(yuǎn)程登錄任務(wù)操作過程中顯示在登錄端的屏幕上。如果他們對屏幕上顯示的安裝方式熟悉的話,任何暴露了你機(jī)器上這些特殊信息的東西都會使那些試圖闖入的人們了解應(yīng)該去攻擊哪些薄弱環(huán)節(jié)(如Sendmail8.7-8.8.2 for Linux這個漏洞)。 再接著把某些特殊的用戶們分配到console用戶組中,這樣就是這幫人實際坐在服務(wù)器計算機(jī)前面時確實可以執(zhí)行命令,但同時要禁止任何其他人調(diào)用這些命令。舉例來說,如果需要強調(diào)安全性,那就應(yīng)該只允許console用戶組的成員可以掛裝磁盤。 然后查看/etc/securetty文件,確定其中列出的設(shè)備都是真實存在的物理ttys(比如tty1到tty8)端口。這個文件限制了人們能夠以根用戶身份登錄進(jìn)入系統(tǒng)的位置。允許任何遠(yuǎn)端用戶以根用戶身份登錄進(jìn)入系統(tǒng)是極其危險的,因為這樣做就為潛在的侵入者縮短了侵入超級用戶帳戶的過程。 最后是最好不設(shè)匿名帳戶或來賓帳戶(anonymouse & guest)如果一定要設(shè),請在/etc/passwd中將其shell設(shè)為/bin/failure,使其不能訪問任何shell。(注意:Linux 中是設(shè)為/bin/false)。打開chroot(如chroot -s),使其訪問的文件限定在一定目錄下。一定要保證在FTP服務(wù)器上唯一允許匿名用戶進(jìn)行寫入操作的部分是/incoming目錄。列出成功登錄的記錄清單如果想查看都有哪些人最近成功地登錄進(jìn)入了系統(tǒng),可以使用last命令。如果想列出比缺省數(shù)目更多的記錄,可以使用格式“l(fā)ast -nnumber”告訴last命令需要顯示多少登錄記錄。如果這個命令執(zhí)行失敗,說明登錄操作還沒有被記錄下來。為了確保它們能夠被記錄下來,請以根用戶身份執(zhí)行“touch/sar/log/wtmp”命令來建立日志記錄文件。列出不成功登錄的記錄清單如果想查看都有哪些人最近沒有成功地登錄進(jìn)入系統(tǒng),可以使用lastb命令。和last命令相類似,如果你想列出比缺省數(shù)目更多的不成功嘗試記錄的話,可以使用“l(fā)astb -nnumber”格式。如果這個命令執(zhí)行失敗,說明不成功登錄操作還沒有被記錄下來。為了確保它們能夠被記錄下來,請以根用戶身份執(zhí)行 “touch/var/log/btmp”命令來建立日志記錄文件。 如果安全出現(xiàn)了漏洞,或者你認(rèn)為已經(jīng)出現(xiàn)了漏洞的話,就可以抓住這個機(jī)會從系統(tǒng)登錄記錄或者其他地方查找蛛絲馬跡。系統(tǒng)會記錄下每一次成功的登錄操作和不成功的登錄嘗試操作。特別是那個“列出不成功的嘗試登錄記錄清單”,它能夠讓你很快地查找出是否有人在千方百計地獲取根用戶權(quán)限或者猜試某個用戶的口令字。 如果你使用的是shadow隱藏口令字軟件,請檢查/etc/passwd文件,看看其中是否禁用了 shadow隱藏口令字功能——如果是這樣,口令字將會被保存在/etc/passwd文件里。Linux系統(tǒng)中的/etc/passwd文件是整個系統(tǒng)中最重要的文件,它包含了每個用戶的信息(加密后的口令也可能存與/etc/shadow文件中)。它每一行分為7個部分,依次為用戶登錄名,加密過的口令,用戶號,用戶組號,用戶全名,用戶主目錄和用戶所用的Shell程序,其中用戶號(UID)和用戶組號(GID)用于Unix系統(tǒng)唯一地標(biāo)識用戶和同組用戶及用戶的訪問權(quán)限。這個文件是用DES不可逆算法加密的,只能用John之類的軟件窮舉,因此,此文件成為入侵者的首要目標(biāo)。通常黑客用FTP匿名登錄后將passwd Get回去,就用John開始跑了。所以一定要把此文件設(shè)為不可讀不可寫。另注意,opasswd或passwd.old是passwd的備份,它們可能存在,如果存在,一定也要設(shè)為不可讀不可寫修改。進(jìn)行以上設(shè)置必須root用戶的權(quán)限,所以如果情況真的如上面所說的這樣,你就應(yīng)該知道在這臺機(jī)器上黑客已經(jīng)獲得了root的操作權(quán)限。 檢查是否有不熟悉的用戶帳戶擁有特殊的優(yōu)先權(quán):一個擁有高級工具和豐富經(jīng)驗的黑客能夠替換某些重要的系統(tǒng)功能。用一臺獨立的計算機(jī)或者一臺你相信沒有遭到攻擊的機(jī)器把諸如ls之類的命令備份到一張軟盤上去,當(dāng)然最好是將安裝光盤再刻錄一張,然后檢查程序ls、find、ps和所有網(wǎng)絡(luò)守護(hù)進(jìn)程的系統(tǒng)版本中的日期與它們生成時的日期數(shù)據(jù)是否一致。 最后你應(yīng)該經(jīng)常到下面的地方去查看是否有提高安全性方面的建議和那些修補最新發(fā)現(xiàn)的系統(tǒng)漏洞的網(wǎng)站:如Root Shell (http://www.rootshell.com)、Computer Emergency Response Team(計算機(jī)緊急情況快速反應(yīng)組——http://www.cert.com)和你機(jī)器上安裝的Linux版本的軟件服務(wù)商網(wǎng)頁,并最好訂閱一些最新系統(tǒng)漏洞的電子雜志。
2、網(wǎng)絡(luò)地址轉(zhuǎn)換(nat表)
3、數(shù)據(jù)包處理(mangle表)
-I 插入規(guī)則
-D 刪除規(guī)則
-R 替代一條規(guī)則
-L 列出規(guī)則
DROP 丟棄該數(shù)據(jù)包
QUEUE 排隊該數(shù)據(jù)包到用戶空間
RETURN 返回到前面調(diào)用的鏈
foobar 用戶自定義鏈
-s 源地址(ip address/masklen)
-d 目的地址(ip address/masklen)
-i 數(shù)據(jù)包輸入接口
-o 數(shù)據(jù)包輸出接口
UPD-----匹配源端口和目的端口
ICMP----匹配ICMP類型
MAC-----匹配接收到的數(shù)據(jù)的mac地址
MARK----匹配nfmark
OWNE----(僅僅應(yīng)用于本地產(chǎn)生的數(shù)據(jù)包)來匹配用戶ID,組ID,進(jìn)程ID及會話ID
LIMIT---匹配特定時間段內(nèi)的數(shù)據(jù)包限制。這個擴(kuò)展匹配對于限制dos攻擊數(shù)據(jù)流非常有用。
STATE---匹配特定狀態(tài)下的數(shù)據(jù)包(由連接跟蹤子系統(tǒng)來決定狀態(tài)),可能的狀態(tài)包括:
INVALID (不匹配于任何連接)
ESTABLISHED (屬于某個已經(jīng)建立的鏈接的數(shù)據(jù)包)
NEW (建立連接的數(shù)據(jù)包)
RELATED (和某個已經(jīng)建立的連接有一定相關(guān)的數(shù)據(jù)包,例如一個ICMP錯誤消息或ftp數(shù)據(jù)連接)
TOS——匹配IP頭的TOS字段的值。
ULOG 將匹配的數(shù)據(jù)適用用戶空間的log進(jìn)程進(jìn)行記錄
REJECT 不僅僅丟棄數(shù)據(jù)包,同時返回給發(fā)送者一個可配置的錯誤信息
MIRROR 互換源和目的地址以后重新傳輸該數(shù)據(jù)包
>chainforward(policyACCEPT);
>chainoutput(policyACCEPT);
>
(2)整個一類的IP地址范圍,比如:192.168.152.0/255.255.255.0—它表示從192.168.152.0到192.168.152.255范圍內(nèi)的地址。
(3)主機(jī)名,比如:blue。
(4)完整的域名,比如:blue.cdors.org。
(5)某個IP地址范圍,要使用IP地址和網(wǎng)絡(luò)屏蔽碼(netmask)認(rèn)真地構(gòu)造之。
ipchains-Ainput-s192.156.12.1/255.255.255.252-pTCPTelnetALLOW


