防火墻是一個非常重要的網(wǎng)絡安全工具,,但是如果在需要對防火墻規(guī)則進行快速,、復雜的動態(tài)修改時你該如何實現(xiàn)呢?如果你使用本文介紹的Daniel
Robbins
的動態(tài)防火墻腳本,,這將是一件非常容易的工作,。你可以利用這些腳本來增強你網(wǎng)絡的安全性和對網(wǎng)絡攻擊的實時響應性,并基于該腳本進行自己的創(chuàng)造性設計,。
理解動態(tài)防火墻的腳本能夠帶來的益處的最好方法就是看它們在實際中的應用,。假設我是一個某個ISP的系統(tǒng)管理員,我最近架設了一個基于Linux的防火墻 來保護我的客戶和內(nèi)部系統(tǒng),,防止外部惡意用戶的攻擊,。為了實現(xiàn)該系統(tǒng)我使用了新版Linux2.4內(nèi)核的iptables工具來實現(xiàn),防火墻允許客戶和內(nèi) 部服務器向Internet建立連接,,也允許從Internet向內(nèi)部系統(tǒng)的公共服務如web服務器,、ftp服務器等建立新的連接。由于這里我使用了默認 拒絕任何服務,,只開放允許的服務的策略,,因此從Internet到非公共服務如squid的代理服務,、samba服務的連接是被拒絕的。目前我已經(jīng)有了一 個功能完備的,、滿足安全需求的防火墻系統(tǒng),,其能對ISP的所有用戶提供很好的保護。 剛剛開始的一個星期防火墻工作情況良好,,但是隨后一些糟糕的事情發(fā)生了,。Bob-一個攻擊者對我的網(wǎng)絡進行了攻擊,它采用了使用垃圾數(shù)據(jù)報淹沒我的ISP 網(wǎng)絡的方法來對我的客戶進行Dos攻擊,。不幸的是Bob已經(jīng)對我的防火墻進行了仔細的研究,,知道雖然我對內(nèi)部服務進行了保護但是25端口和80端口都是開 放的以收發(fā)Emai和開放www服務。Bob決定對我的Email和WWW服務器進行Dos的攻擊,。 Bob開始攻擊的1-2分鐘以后我發(fā)現(xiàn)我的線路出現(xiàn)嚴重的擁塞情況,。通過tcpdump察看我發(fā)現(xiàn)這是Bob進行的一次攻擊。并且我得到了它的攻擊源地址?,F(xiàn)在我就需要阻止這些IP地址對我的公共服務器的連接,。下面我就討論一種簡單方便的解決方案。 阻止攻擊 我馬上采取行動,,加載我的防火墻啟動腳本并使用vi對 iptables 規(guī)則進行編輯,,來阻塞這些Bob發(fā)出的惡意攻擊數(shù)據(jù)的源地址的數(shù)據(jù)報。大約一分鐘以后我找到了在防火墻啟動腳本中添加新的DROP規(guī)則的位置,,我馬上添加 了新的規(guī)則并重新啟動了防火墻,。很快防火墻發(fā)揮了作用,Bob的攻擊得到了遏制?,F(xiàn)在看起來我成功的擊潰了Bob的攻擊,,可是不久網(wǎng)絡值班電話又響了起 來,原來是客戶發(fā)現(xiàn)網(wǎng)絡不可用而打過來的投訴電話,??墒歉釉愀獾氖菐追昼娨院笪易⒁獾轿业腎nternet連接線路又開始出現(xiàn)嚴重阻塞。我仔細察看原來 是Bob使用了新的IP地址進行攻擊行動,。我只好不得不再次修改防火墻啟動腳本來阻止它的攻擊,。我就這樣一直在Bob的屁股后面疲于奔命,。 問題出在哪里呢,?雖然我建立了功能完備的、滿足安全需求的防火墻系統(tǒng)并且快速的發(fā)現(xiàn)了網(wǎng)絡出現(xiàn)問題的原因,,但是我卻不能在第一時間內(nèi)對我的防火墻規(guī)則進行 調(diào)整來響應Bob的攻擊,。當網(wǎng)絡被攻擊時,被動慌亂地快速對攻擊做出防范反應,,對防火墻規(guī)則配置腳本進行修改不但是壓力巨大,,而且效率低下,。 ipdrop 如果能創(chuàng)建一個特殊的"ipdrop"腳本,其被設計為能方便地插入一個規(guī)則來阻塞指定的IP,,那么將上面的工作將非常容易,。通過該腳本阻塞某個IP將是 非常容易的工作,只需要幾秒鐘就可以實現(xiàn),。而且通過該腳本還可以防止手工加入規(guī)則時容易出現(xiàn)的錯誤,。因此阻塞Bob的攻擊將變?yōu)榇_定其攻擊源地址。然后通 過如下命令: # ipdrop 129.24.8.1 on ipdrop腳本將立即阻塞129.24.8.1,。通過使用該腳本能顯著地提高你的防衛(wèi)能力,。下面就是ipdrop腳本的實現(xiàn): The ipdrop bash script source /usr/local/share/dynfw.sh args 2 $# "${0} IPADDR {on/off}" "Drops packets to/from IPADDR. Good for obnoxious networks/hosts/DoS" if [ "$2" == "on" ] #block outside IP address that‘s causing problems iptables $INSERT INPUT -s $1 -j DROP echo "IP ${1} drop ${2}." ipdrop:解釋 從上面的腳本源代碼中最后四行加粗的內(nèi)容可以看到實際的命令是在防火墻表中插入適當?shù)囊?guī)則??梢钥吹?INSERT變量的值取決于在命令行參數(shù)中是使用"on"還是"off"模式,。當iptables行被執(zhí)行時特定的規(guī)則將被適當?shù)牟迦牖騽h除。 現(xiàn)在我們看看這些規(guī)則本身的功能,,它們能和任何類型的防火墻一起發(fā)揮作用,,甚至在沒有部署防火墻的系統(tǒng)上。需要的條件僅僅是支持iptables的 Linux2.4版本的內(nèi)核,。我們阻塞來自惡意IP的攻擊數(shù)據(jù)報(第一條iptables語句),,阻塞發(fā)向惡意攻擊IP的數(shù)據(jù)報(第二條iptables 語句),并且對該IP關閉任意方向的數(shù)據(jù)轉(zhuǎn)發(fā)(最后兩條iptables工具),。一旦這些規(guī)則發(fā)揮作用系統(tǒng)將丟棄滿足這些條件的任何數(shù)據(jù)報,。 另外一個需要注意的是:腳本中調(diào)用了"rec_check", "unrecord", "record",和"args"。這些都是定義在"dynfw.sh"中的特殊的bash函數(shù),。"record"函數(shù)實現(xiàn)將被阻塞的IP記錄在文件 /root/.dynfw-ipdrop文件中,,而"unrecord"則是將其從文件/root/.dynfw-ipdrop中去除。 "rec_check"函數(shù)是在發(fā)現(xiàn)試圖重新阻塞某個已經(jīng)阻塞的IP地址或取消某個沒有被阻塞的IP地址時輸出錯誤信息并停止腳本執(zhí)行,。"args"函數(shù) 實現(xiàn)確保命令行參數(shù)的正確性,,并實現(xiàn)打印腳本幫助命令。文件dynfw-1.0.tar.gz包含所有的這些工具,,具體情況請見文章最后的資源部分,。 tcplimit 如果你需要對某個特殊的基于TCP的網(wǎng)絡服務的使用進行限制(例如在端系統(tǒng)上產(chǎn)生嚴重負載時),則tcplimit腳本則可以幫助你達到這個目的,,該腳本使用TCP端口,、一個率值和"on"或"off"作為參數(shù): # tcplimit 873 5 minute on tcplimit使用iptables的"state"模塊(應確保在內(nèi)核中打開該選項或加載模塊)來實現(xiàn)在某段時間內(nèi)只允許特定數(shù)目的連接請求通過。在 本例中防火墻將限制每分鐘只允許5個新連接到我的rsync服務器(port 873),。當然你可以根據(jù)需要選擇時間單位為秒鐘/分鐘/小時,。 tcplimit提供了一個限制對非關鍵服務的使用的非常好的方法-這樣大量到非關鍵服務的數(shù)據(jù)不會破壞服務器。在上面的例子中使用tcplimit來設 置使用rsync的限制,,以防止tsync數(shù)據(jù)占用了Internet連接的所有帶寬,。其中連接服務限制信息記錄在文件/root/.dynfw- tcplimit中,。若想關閉該限制只需要鍵入如下命令: # tcplimit 873 5 minute off tcplimit通過在"filter"表中創(chuàng)建一個新的規(guī)則鏈來實現(xiàn)。這個新的規(guī)則鏈將拒絕所有超過指定限制的數(shù)據(jù)報,,同時將一個規(guī)則插入到INPUT 規(guī)則鏈中,,其將所有的到目標端口(在本例中是873端口)的新連接數(shù)據(jù)報定向到這個新的規(guī)則鏈。新規(guī)則鏈只會影響新的超過限制的連接而不會影響已經(jīng)建立的 連接,。 當tcplimit定義的規(guī)則被關閉,,INPUT規(guī)則和新規(guī)則鏈則會被刪除,。象ipdrop一樣其tcplimit可以和任何類型的防火墻一起工作,。 host-tcplimit host-tcplimit和tcplimit非常類似,但是它是限制來自一個特定的IP的到服務器上某個特定端口的TCP連接數(shù)量,。host- tcplimit在防止某個特定的人濫用你的網(wǎng)絡資源時非常有用處,。例如你維護有一個CVS服務器,,有一天突然發(fā)現(xiàn)一個特殊的新開發(fā)者出現(xiàn)了,他好像建立 了一個腳本每十分鐘更新它的資源,。占用了大量的網(wǎng)絡資源,。然后你就給他發(fā)送信件說明他的行為的錯誤之處。但是你收到他如下的回信: Hi guys! I‘m really excited to be part of your development project. I just set up a Sincerely, Mr. Newbie
# host-tcplimit 1.1.1.1 2401 1 day on 現(xiàn)在Newbie先生(IP地址為1.1.1.1)被限制為每天只能進行一次CVS連接從而節(jié)省了網(wǎng)絡帶寬,。 user-outblock 最后一個,也是這幾個防火墻腳本中最有趣的是user-outblock,。這個腳本提供了一種實現(xiàn)允許某個用戶通過SSH或telnet登錄到系統(tǒng)上但是 不允許它通過命令行命令建立向外連接去的一個很理想的方法,。下面是一個應用user-outblock的一個示例場合。假設一個特殊的家庭在我們的ISP 擁有一個賬號,。媽媽和爸爸使用圖形化的email客戶端程序閱讀自己的信件,,偶爾會沖浪Internet,但是他們的兒子卻是一個熱衷的hacker分 子,,他常常使用它的shell訪問權(quán)限來對其他的機器做一些淘氣的事情,。 有一天你發(fā)現(xiàn)他和若干系統(tǒng)建立ssh連接,發(fā)現(xiàn)目標地址是屬于巴基斯坦軍事網(wǎng)站,。你希望幫助這個小孩子走向正道,,因此你采取了以下的行動: 首先,你檢查自己的系統(tǒng)并確保去掉了所有和網(wǎng)絡相關的程序的suid位,,例如ssh:
現(xiàn)在他企圖使用的任何和網(wǎng)絡相關的進程都會擁有自己的UID,。你現(xiàn)在可以使用user-outblock來阻塞所有該UID發(fā)出的的向外TCP連接(假設其UID為2049):
現(xiàn)在他只能登錄到系統(tǒng)中閱讀自己的信件,但是他不能使用你的服務器建立SSH連接,。 資源 * 由于發(fā)現(xiàn)動態(tài)這些防火墻腳本非常有用,,因此將它們打包(dynfw-1.0.tar.gz)以供下載安裝,。 # export PREFIX=/usr 還可以在dynamic firewall scripts section to the Gentoo Linux Web site下載dynfw的最新版本。 * tcpdump是一個非常重要的探測底層的IP報交換的工具,,使用它可以驗證防火墻工作是否正常,。 |
|