動態(tài)iptables防火墻之dynfw
dynfw是一種一個非常重要的iptables網(wǎng)絡(luò)防火墻安全工具,來看下文的具體介紹。
防火墻是一個非常重要的網(wǎng)絡(luò)安全工具,但是如果在需要對防火墻規(guī)則進行快速、復(fù)雜的動態(tài)修改時你該如何實現(xiàn)呢?如果你使用本文介紹的Daniel Robbins 的動態(tài)防火墻腳本,這將是一件非常容易的工作。你可以利用這些腳本來增強你網(wǎng)絡(luò)的安全性和對網(wǎng)絡(luò)攻擊的實時響應(yīng)性,并基于該腳本進行自己的創(chuàng)造性設(shè)計。
理解動態(tài)防火墻的腳本能夠帶來的益處的最好方法就是看它們在實際中的應(yīng)用。假設(shè)我是某個ISP的系統(tǒng)管理員,我最近架設(shè)了一個基于Linux的防火墻來保護我的客戶和內(nèi)部系統(tǒng),防止外部惡意用戶的攻擊。為了實現(xiàn)該系統(tǒng)我使用了新版Linux2.4內(nèi)核的iptables工具來實現(xiàn),防火墻允許客戶和內(nèi)部服務(wù)器向Internet建立連接,也允許從Internet向內(nèi)部系統(tǒng)的公共服務(wù)如web服務(wù)器、ftp服務(wù)器等建立新的連接。由于這里我使用了默認(rèn)拒絕任何服務(wù),只開放允許的服務(wù)的策略,因此從Internet到非公共服務(wù)如squid的代理服務(wù)、samba服務(wù)的連接是被拒絕的。目前我已經(jīng)有了一個功能完備的、滿足安全需求的防火墻系統(tǒng),其能對ISP的所有用戶提供很好的保護。
剛剛開始的一個星期防火墻工作情況良好,但是隨后一些糟糕的事情發(fā)生了。Bob-一個攻擊者對我的網(wǎng)絡(luò)進行了攻擊,它采用了使用垃圾數(shù)據(jù)報淹沒我的 ISP網(wǎng)絡(luò)的方法來對我的客戶進行Dos攻擊。不幸的是Bob已經(jīng)對我的防火墻進行了仔細(xì)的研究,知道雖然我對內(nèi)部服務(wù)進行了保護但是25端口和80端口都是開放的以收發(fā)Emai和開放www服務(wù)。Bob決定對我的Email和WWW服務(wù)器進行Dos的攻擊。
Bob開始攻擊的1-2分鐘以后我發(fā)現(xiàn)我的線路出現(xiàn)嚴(yán)重的擁塞情況。通過tcpdump察看我發(fā)現(xiàn)這是Bob進行的一次攻擊。并且我得到了它的攻擊源地址。現(xiàn)在我就需要阻止這些IP地址對我的公共服務(wù)器的連接。下面我就討論一種簡單方便的解決方案。
阻止攻擊
我馬上采取行動,加載我的防火墻啟動腳本并使用vi對 iptables 規(guī)則進行編輯,來阻塞這些Bob發(fā)出的惡意攻擊數(shù)據(jù)的源地址的數(shù)據(jù)報。大約一分鐘以后我找到了在防火墻啟動腳本中添加新的DROP規(guī)則的位置,我馬上添加了新的規(guī)則并重新啟動了防火墻。很快防火墻發(fā)揮了作用,Bob的攻擊得到了遏制?,F(xiàn)在看起來我成功的擊潰了Bob的攻擊,可是不久網(wǎng)絡(luò)值班電話又響了起來,原來是客戶發(fā)現(xiàn)網(wǎng)絡(luò)不可用而打過來的投訴電話??墒歉釉愀獾氖菐追昼娨院笪易⒁獾轿业腎nternet連接線路又開始出現(xiàn)嚴(yán)重阻塞。我仔細(xì)察看原來是Bob使用了新的IP地址進行攻擊行動。我只好不得不再次修改防火墻啟動腳本來阻止它的攻擊。我就這樣一直在Bob的屁股后面疲于奔命。
問題出在哪里呢?雖然我建立了功能完備的、滿足安全需求的防火墻系統(tǒng)并且快速的發(fā)現(xiàn)了網(wǎng)絡(luò)出現(xiàn)問題的原因,但是我卻不能在第一時間內(nèi)對我的防火墻規(guī)則進行調(diào)整來響應(yīng)Bob的攻擊。當(dāng)網(wǎng)絡(luò)被攻擊時,被動慌亂地快速對攻擊做出防范反應(yīng),對防火墻規(guī)則配置腳本進行修改不但是壓力巨大,而且效率低下。
ipdrop
如果能創(chuàng)建一個特殊的"ipdrop"腳本,其被設(shè)計為能方便地插入一個規(guī)則來阻塞指定的IP,那么將上面的工作將非常容易。通過該腳本阻塞某個IP將是非常容易的工作,只需要幾秒鐘就可以實現(xiàn)。而且通過該腳本還可以防止手工加入規(guī)則時容易出現(xiàn)的錯誤。因此阻塞Bob的攻擊將變?yōu)榇_定其攻擊源地址。然后通過如下命令:
# ipdrop 129.24.8.1 on
IP 129.24.8.1 drop on.
ipdrop腳本將立即阻塞129.24.8.1。通過使用該腳本能顯著地提高你的防衛(wèi)能力。下面就是ipdrop腳本的實現(xiàn):
The ipdrop bash script
#!/bin/bash
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" ]
then
#rules will be appended or inserted as normal
APPEND="-A"
INSERT="-I"
rec_check ipdrop $1 "$1 already blocked" on
record ipdrop $1
elif [ "$2" == "off" ]
then
#rules will be deleted instead
APPEND="-D"
INSERT="-D"
rec_check ipdrop $1 "$1 not currently blocked" off
unrecord ipdrop $1
else
echo "Error: "off" or "on" expected as second argument"
exit 1
fi
#block outside IP address thats causing problems
#attackers incoming TCP connections will take a minute or so to time out,
#reducing DoS effectiveness.
iptables $INSERT INPUT -s $1 -j DROP
iptables $INSERT OUTPUT -d $1 -j DROP
iptables $INSERT FORWARD -d $1 -j DROP
iptables $INSERT FORWARD -s $1 -j DROP
echo "IP ${1} drop ${2}."
ipdrop:解釋
#p#
從上面的腳本源代碼中最后四行內(nèi)容可以看到實際的命令是在防火墻表中插入適當(dāng)?shù)囊?guī)則??梢钥吹?INSERT變量的值取決于在命令行參數(shù)中是使用"on"還是"off"模式。當(dāng)iptables行被執(zhí)行時特定的規(guī)則將被適當(dāng)?shù)牟迦牖騽h除。
現(xiàn)在我們看看這些規(guī)則本身的功能,它們能和任何類型的防火墻一起發(fā)揮作用,甚至在沒有部署防火墻的系統(tǒng)上。需要的條件僅僅是支持iptables的 Linux2.4版本的內(nèi)核。我們阻塞來自惡意IP的攻擊數(shù)據(jù)報(第一條iptables語句),阻塞發(fā)向惡意攻擊IP的數(shù)據(jù)報(第二條iptables 語句),并且對該IP關(guān)閉任意方向的數(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)絡(luò)服務(wù)的使用進行限制(例如在端系統(tǒng)上產(chǎn)生嚴(yán)重負(fù)載時),則tcplimit腳本則可以幫助你達到這個目的,該腳本使用TCP端口、一個率值和"on"或"off"作為參數(shù):
# tcplimit 873 5 minute on
Port 873 new connection limit (5/minute, burst=5) on.
tcplimit使用iptables的"state"模塊(應(yīng)確保在內(nèi)核中打開該選項或加載模塊)來實現(xiàn)在某段時間內(nèi)只允許特定數(shù)目的連接請求通過。在本例中防火墻將限制每分鐘只允許5個新連接到我的rsync服務(wù)器(port 873)。當(dāng)然你可以根據(jù)需要選擇時間單位為秒鐘/分鐘/小時。
tcplimit提供了一個限制對非關(guān)鍵服務(wù)的使用的非常好的方法-這樣大量到非關(guān)鍵服務(wù)的數(shù)據(jù)不會破壞服務(wù)器。在上面的例子中使用tcplimit 來設(shè)置使用rsync的限制,以防止tsync數(shù)據(jù)占用了Internet連接的所有帶寬。其中連接服務(wù)限制信息記錄在文件/root/.dynfw- tcplimit中。若想關(guān)閉該限制只需要鍵入如下命令:
# tcplimit 873 5 minute off
Port 873 new connection limit off.
tcplimit通過在"filter"表中創(chuàng)建一個新的規(guī)則鏈來實現(xiàn)。這個新的規(guī)則鏈將拒絕所有超過指定限制的數(shù)據(jù)報,同時將一個規(guī)則插入到 INPUT規(guī)則鏈中,其將所有的到目標(biāo)端口(在本例中是873端口)的新連接數(shù)據(jù)報定向到這個新的規(guī)則鏈。新規(guī)則鏈只會影響新的超過限制的連接而不會影響已經(jīng)建立的連接。
當(dāng)tcplimit定義的規(guī)則被關(guān)閉,INPUT規(guī)則和新規(guī)則鏈則會被刪除。象ipdrop一樣其tcplimit可以和任何類型的防火墻一起工作。
host-tcplimit
host-tcplimit和tcplimit非常類似,但是它是限制來自一個特定的IP的到服務(wù)器上某個特定端口的TCP連接數(shù)量。host -tcplimit在防止某個特定的人濫用你的網(wǎng)絡(luò)資源時非常有用處。例如你維護有一個CVS服務(wù)器,有一天突然發(fā)現(xiàn)一個特殊的新開發(fā)者出現(xiàn)了,他好像建立了一個腳本每十分鐘更新它的資源。占用了大量的網(wǎng)絡(luò)資源。然后你就給他發(fā)送信件說明他的行為的錯誤之處。但是你收到他如下的回信:
Hi guys!
Im really excited to be part of your development project. I just set up a
script to update my local copy of the code every ten minutes. Im about to
leave on a two-week cruise, but when I get back, my sources will be totally
up-to-date and Ill be ready to help out! Im heading out the door now...see
you in two weeks!
Sincerely,
Mr. Newbie
對于這種情況,使用host-tcplimit可以非常容易的解決問題:
# host-tcplimit 1.1.1.1 2401 1 day on
現(xiàn)在Newbie先生(IP地址為1.1.1.1)被限制為每天只能進行一次CVS連接從而節(jié)省了網(wǎng)絡(luò)帶寬。
user-outblock
最后一個,也是這幾個防火墻腳本中最有趣的是user-outblock。這個腳本提供了一種實現(xiàn)允許某個用戶通過SSH或telnet登錄到系統(tǒng)上但是不允許它通過命令行命令建立向外連接去的一個很理想的方法。下面是一個應(yīng)用user-outblock的一個示例場合。假設(shè)一個特殊的家庭在我們的ISP擁有一個賬號。媽媽和爸爸使用圖形化的email客戶端程序閱讀自己的信件,偶爾會沖浪Internet,但是他們的兒子卻是一個熱衷的 hacker分子,他常常使用它的shell訪問權(quán)限來對其他的機器做一些淘氣的事情。
通過文章,我們可以清楚的知道動態(tài)iptables防火墻dynfw,希望對大家有用!
【編輯推薦】