歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

動態iptables防火牆dynfw

防火牆是一個非常重要的網絡安全工具,但是如果在需要對防火牆規則進行快速、復雜的動態修改時你該如何實現呢?如果你使用本文介紹的Daniel Robbins 的動態防火牆腳本,這將是一件非常容易的工作。你可以利用這些腳本來增強你網絡的安全性和對網絡攻擊的實時響應性,並基於該腳本進行自己的創造性設計。理解動態防火牆的腳本能夠帶來的益處的最好方法就是看它們在實際中的應用。假設我是某個ISP的系統管理員,我最近架設了一個基於Linux的防火牆來保護我的客戶和內部系統,防止外部惡意用戶的攻擊。為了實現該系統我使用了新版Linux2.4內核的iptables工具來實現,防火牆允許客戶和內部服務器向Internet建立連接,也允許從Internet向內部系統的公共服務如web服務器、FTP服務器等建立新的連接。由於這裡我使用了默認拒絕任何服務,只開放允許的服務的策略,因此從Internet到非公共服務如squid的代理服務、samba服務的連接是被拒絕的。目前我已經有了一個功能完備的、滿足安全需求的防火牆系統,其能對ISP的所有用戶提供很好的保護。 剛剛開始的一個星期防火牆工作情況良好,但是隨後一些糟糕的事情發生了。Bob-一個攻擊者對我的網絡進行了攻擊,它采用了使用垃圾數據報淹沒我的 ISP網絡的方法來對我的客戶進行Dos攻擊。不幸的是Bob已經對我的防火牆進行了仔細的研究,知道雖然我對內部服務進行了保護但是25端口和80端口都是開放的以收發Emai和開放www服務。Bob決定對我的Email和WWW服務器進行Dos的攻擊。 Bob開始攻擊的1-2分鐘以後我發現我的線路出現嚴重的擁塞情況。通過tcpdump察看我發現這是Bob進行的一次攻擊。並且我得到了它的攻擊源地址。現在我就需要阻止這些IP地址對我的公共服務器的連接。下面我就討論一種簡單方便的解決方案。

阻止攻擊

我馬上采取行動,加載我的防火牆啟動腳本並使用vi對 iptables 規則進行編輯,來阻塞這些Bob發出的惡意攻擊數據的源地址的數據報。大約一分鐘以後我找到了在防火牆啟動腳本中添加新的DROP規則的位置,我馬上添加了新的規則並重新啟動了防火牆。很快防火牆發揮了作用,Bob的攻擊得到了遏制。現在看起來我成功的擊潰了Bob的攻擊,可是不久網絡值班電話又響了起來,原來是客戶發現網絡不可用而打過來的投訴電話。可是更加糟糕的是幾分鐘以後我注意到我的Internet連接線路又開始出現嚴重阻塞。我仔細察看原來是Bob使用了新的IP地址進行攻擊行動。我只好不得不再次修改防火牆啟動腳本來阻止它的攻擊。我就這樣一直在Bob的屁股後面疲於奔命。 問題出在哪裡呢?雖然我建立了功能完備的、滿足安全需求的防火牆系統並且快速的發現了網絡出現問題的原因,但是我卻不能在第一時間內對我的防火牆規則進行調整來響應Bob的攻擊。當網絡被攻擊時,被動慌亂地快速對攻擊做出防范反應,對防火牆規則配置腳本進行修改不但是壓力巨大,而且效率低下。

ipdrop

如果能創建一個特殊的"ipdrop"腳本,其被設計為能方便地插入一個規則來阻塞指定的IP,那麼將上面的工作將非常容易。通過該腳本阻塞某個IP將是非常容易的工作,只需要幾秒鐘就可以實現。而且通過該腳本還可以防止手工加入規則時容易出現的錯誤。因此阻塞Bob的攻擊將變為確定其攻擊源地址。然後通過如下命令:

# ipdrop 129.24.8.1 on IP 129.24.8.1 drop on. ipdrop腳本將立即阻塞129.24.8.1。通過使用該腳本能顯著地提高你的防衛能力。下面就是ipdrop腳本的實現: 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:解釋

從上面的腳本源代碼中最後四行內容可以看到實際的命令是在防火牆表中插入適當的規則。可以看到$INSERT變量的值取決於在命令行參數中是使用"on"還是"off"模式。當iptables行被執行時特定的規則將被適當的插入或刪除。 現在我們看看這些規則本身的功能,它們能和任何類型的防火牆一起發揮作用,甚至在沒有部署防火牆的系統上。需要的條件僅僅是支持iptables的 Linux2.4版本的內核。我們阻塞來自惡意IP的攻擊數據報(第一條iptables語句),阻塞發向惡意攻擊IP的數據報(第二條iptables 語句),並且對該IP關閉任意方向的數據轉發(最後兩條iptables工具)。一旦這些規則發揮作用系統將丟棄滿足這些條件的任何數據報。 另外一個需要注意的是:腳本中調用了"rec_check", "unrecord", "record",和"args"。這些都是定義在"dynfw.sh"中的特殊的bash函數。"record"函數實現將被阻塞的IP記錄在文件 /root/.dynfw-ipdrop文件中,而"unrecord"則是將其從文件/root/.dynfw-ipdrop中去除。 "rec_check"函數是在發現試圖重新阻塞某個已經阻塞的IP地址或取消某個沒有被阻塞的IP地址時輸出錯誤信息並停止腳本執行。"args"函數實現確保命令行參數的正確性,並實現打印腳本幫助命令。文件dynfw-1.0.tar.gz包含所有的這些工具,具體情況請見文章最後的資源部分。

tcplimit

如果你需要對某個特殊的基於TCP的網絡服務的使用進行限制(例如在端系統上產生嚴重負載時),則tcplimit腳本則可以幫助你達到這個目的,該腳本使用TCP端口、一個率值和"on"或"off"作為參數:

# tcplimit 873 5 minute on Port 873 new connection limit (5/minute, burst=5) on.

tcplimit使用iptables的"state"模塊(應確保在內核中打開該選項或加載模塊)來實現在某段時間內只允許特定數目的連接請求通過。在本例中防火牆將限制每分鐘只允許5個新連接到我的rsync服務器(port 873)。當然你可以根據需要選擇時間單位為秒鐘/分鐘/小時。 tcplimit提供了一個限制對非關鍵服務的使用的非常好的方法-這樣大量到非關鍵服務的數據不會破壞服務器。在上面的例子中使用tcplimit 來設置使用rsync的限制,以防止tsync數據占用了Internet連接的所有帶寬。其中連接服務限制信息記錄在文件/root/.dynfw- tcplimit中。若想關閉該限制只需要鍵入如下命令:

# tcplimit 873 5 minute off Port 873 new connection limit off.

tcplimit通過在"filter"表中創建一個新的規則鏈來實現。這個新的規則鏈將拒絕所有超過指定限制的數據報,同時將一個規則插入到 INPUT規則鏈中,其將所有的到目標端口(在本例中是873端口)的新連接數據報定向到這個新的規則鏈。新規則鏈只會影響新的超過限制的連接而不會影響已經建立的連接。 當tcplimit定義的規則被關閉,INPUT規則和新規則鏈則會被刪除。象ipdrop一樣其tcplimit可以和任何類型的防火牆一起工作。

host-tcplimit

host-tcplimit和tcplimit非常類似,但是它是限制來自一個特定的IP的到服務器上某個特定端口的TCP連接數量。host -tcplimit在防止某個特定的人濫用你的網絡資源時非常有用處。例如你維護有一個CVS服務器,有一天突然發現一個特殊的新開發者出現了,他好像建立了一個腳本每十分鐘更新它的資源。占用了大量的網絡資源。然後你就給他發送信件說明他的行為的錯誤之處。但是你收到他如下的回信:

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

現在Newbie先生(IP地址為1.1.1.1)被限制為每天只能進行一次CVS連接從而節省了網絡帶寬。

user-outblock

最後一個,也是這幾個防火牆腳本中最有趣的是user-outblock。這個腳本提供了一種實現允許某個用戶通過SSH或telnet登錄到系統上但是不允許它通過命令行命令建立向外連接去的一個很理想的方法。下面是一個應用user-outblock的一個示例場合。假設一個特殊的家庭在我們的ISP擁有一個賬號。媽媽和爸爸使用圖形化的email客戶端程序閱讀自己的信件,偶爾會沖浪Internet,但是他們的兒子卻是一個熱衷的 hacker分子,他常常使用它的shell訪問權限來對其他的機器做一些淘氣的事情。 有一天你發現他和若干系統建立ssh連接,發現目標地址是屬於巴基斯坦軍事網站。你希望幫助這個小孩子走向正道,因此你采取了以下的行動: 首先,你檢查自己的系統並確保去掉了所有和網絡相關的程序的suid位,例如ssh:

# chmod u-s /usr/bin/ssh 現在他企圖使用的任何和網絡相關的進程都會擁有自己的UID。你現在可以使用user-outblock來阻塞所有該UID發出的的向外TCP連接(假設其UID為2049):



# user-outblock 2049 on UID 2049 block on.

現在他只能登錄到系統中閱讀自己的信件,但是他不能使用你的服務器建立SSH連接。

資源

* 由於發現動態這些防火牆腳本非常有用,因此將它們打包(http://www.vfocus.net/blog/archives/tools/dynfw-1.0.tar.gz)以供下載安裝。 要進行安裝只需要解壓縮包,運行其中的install.sh文件。該腳本將安裝一個共享bash腳本為 /usr/local/share/dynfw.sh,並且安裝動態防火牆腳本到/usr/local/sbin目錄下。若希望安裝在其他腳本中,則只需要在執行install.sh以前執行: # export PREFIX=/usr 還可以在dynamic firewall scripts section to the Gentoo Linux Web site下載dynfw的最新版本1.0.1。

* tcpdump是一個非常重要的探測底層的IP報交換的工具,使用它可以驗證防火牆工作是否正常。



# chmod u-s /usr/bin/ssh 現在他企圖使用的任何和網絡相關的進程都會擁有自己的UID。你現在可以使用user-outblock來阻塞所有該UID發出的的向外TCP連接(假設其UID為2049):

# user-outblock 2049 on UID 2049 block on.

現在他只能登錄到系統中閱讀自己的信件,但是他不能使用你的服務器建立SSH連接。

資源

* 由於發現動態這些防火牆腳本非常有用,因此將它們打包(http://www.vfocus.net/blog/archives/tools/dynfw-1.0.tar.gz)以供下載安裝。 要進行安裝只需要解壓縮包,運行其中的install.sh文件。該腳本將安裝一個共享bash腳本為 /usr/local/share/dynfw.sh,並且安裝動態防火牆腳本到/usr/local/sbin目錄下。若希望安裝在其他腳本中,則只需要在執行install.sh以前執行: # export PREFIX=/usr 還可以在dynamic firewall scripts section to the Gentoo Linux Web site下載dynfw的最新版本1.0.1。

* tcpdump是一個非常重要的探測底層的IP報交換的工具,使用它可以驗證防火牆工作是否正常。



Copyright © Linux教程網 All Rights Reserved