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

動態 iptables 防火牆

  內容: 響應攻擊 ipdrop ipdrop:說明 tcplimit host-tcplimit user-outblock 參考資料 關於作者 靈活(有趣)的網絡安全性 Daniel Robbins ([email protected]) 總裁兼 CEO,Gentoo Technologies, Inc. 2001 年 4 月 防火牆非常有趣,但在需要對防火牆規則進行快速且復雜的更改時,您會做些什麼?很簡單。請使用本文中演示的 Daniel Robbins 的動態防火牆腳本。可以使用這些腳本來增加網絡安全性和響應性,並激發您自己的創造性設計。 了解動態防火牆腳本好處的最佳方法是在運行時查看它們。要這樣做,讓我們假設我是一家 ISP 的系統管理員,最近我建立了基於 Linux 的防火牆,用於保護我的客戶和內部系統免遭因特網上惡意用戶的攻擊。為了實現這個目的,我的防火牆使用新的 Linux 2.4 iptables 有狀態功能,以允許我的客戶和服務器建立新的外出連接,當然還允許新的進入連接,但僅限於“公共”服務,如 web、FTP、ssh 和 SMTP。由於我使用了缺省拒絕設計,因此會自動拒絕任何從因特網到非公共服務(如 squid 代理緩存或 Samba 服務器)的連接。現在,我有一個非常不錯的防火牆,它為我公司的所有客戶提供了非常好的保護。 在第一個星期左右,防火牆的工作非常出色,但在這之後卻發生了件討厭的事:我最大的對手 Bob(他為另一家 ISP 工作,是我們的競爭對手)決定用大量信息包攻擊我的網絡,試圖阻止我向客戶提供服務。糟糕的是,Bob 已經仔細研究了我的防火牆,他知道我在保護內部服務時,端口 25 和 80 必定是可以公開訪問的,這樣我才可以接收郵件和響應 HTTP 請求。Bob 決定利用這一點,他想用吸干帶寬的方法來攻擊我的 Web 和郵件服務器。 大約在 Bob 實施攻擊一分鐘之後,我注意到信息包逐漸占滿了上行鏈路。在查看了 tcpdump 的情況之後,我確定這還是 Bob 實施的另一次攻擊,我推算出他用於發起攻擊的 IP 地址。現在我已經有了這個信息,我需要做的就是阻止這些 IP 地址,我想這大概能解決問題 -- 很簡單的解決方案。 響應攻擊 我迅速使用 vi 打開防火牆設置腳本,並開始改動 iptables 規則、修改防火牆,這樣它就可以阻止那些 Bob 發出的惡意進入信息包。大約一分鐘左右,我找到了添加合適 DROP 規則的確切位置,並添加了這些規則。然後,我啟動防火牆,但又馬上停止了它……哎,我在添加規則時犯了一個小錯。我再次裝入防火牆腳本,改正問題,30 秒之後,將已將防火牆調整成阻止這個月內 Bob 發起的所有攻擊。起先,它似乎成功地挫敗了攻擊……直到問訊台的電話鈴聲響起。顯然,Bob 已經中斷我的網絡大約 10 分鐘,現在我的客戶打電話來詢問究竟發生了什麼情況。更遭的是,幾分鐘後,我發現上行鏈路又被占滿了。看來 Bob 這次使用了一組全新的 IP 地址來實施攻擊。我也做出響應,立即開始修改防火牆腳本,只不過這次我有一點驚慌 -- 也許我的解決方案還不那麼完美。 以下就是上述情況中出錯的原因。雖然我有一個不錯的防火牆,還迅速標識了網絡問題的原因,但我無法修改防火牆的行為以使它能夠及時應付威脅。當然,當網絡受到攻擊時,您希望能夠立即響應,在緊急狀態下被迫修改主防火牆設置腳本不僅在時間上很緊迫,而且效率非常低。 ipdrop 如果有一個特別設計的特殊 "ipdrop" 腳本,它可以插入阻止我指定的 IP 地址所需的規則,那麼情況會好多了。有了這樣的腳本,阻止防火牆就不再是兩分鐘的折磨;它只需 5 秒鐘。由於這個腳本可以讓我不必手工編輯防火牆規則,這就消除了出錯的主要根源。我所要做的只是確定要阻止的 IP 地址,然後輸入: # ipdrop 129.24.8.1 on IP 129.24.8.1 drop on.


ipdrop 腳本會立即阻止 129.24.8.1,這是本周 Bob 的當前惡意 IP 地址。這個腳本明顯提高了您的防御能力,因為現在阻止 IP 並不是件費神的事。現在,讓我們看一下 ipdrop 腳本的實現: ipdrop bash 腳本 #!/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 行執行時,會適當插入或刪除特定規則。 現在,讓我們看一下規則本身的功能,規則應該與任何類型的現有防火牆或甚至在沒有防火牆的系統上正常工作;您所需要的只是 2.4 內核中的內置 iptables 支持。我們阻止來自惡意 IP(第一個以 iptables 開頭的行)的進入信息包,阻止標題為惡意 IP(下一個以 iptables 開頭的行)的外出信息包,然後關閉涉及這個特殊 IP(最後兩個以 iptables 開頭的行)的轉發。一旦這些規則就位,系統就只廢棄任何屬於其中一個類別的信息包。 另一個簡短注釋:您還會注意到對 "rec_check"、"unrecord"、"record" 和 "args" 的調用。這些是在 "dynfw.sh" 中定義的 helper bash 函數。"record" 函數將被阻止的 IP 記錄到 /root/.dynfw-ipdrop 文件中,而 "unrecord" 從 /root/.dynfw-ipdrop 中除去記錄項。如果要重新阻止一個已被阻止的 IP,或者取消阻止當前未阻止的 IP,可以使用 "rec_check" 函數來放棄帶錯誤消息的腳本。"args" 函數負責確保我們接收到正確數量的命令行自變量,它還負責打印有幫助的用法信息。我已經創建了包含所有這些工具的 dynfw-1.0.tar.gz;有關詳細信息,請參閱本文結尾的參考資料部分。 tcplimit 如果需要限制使用某個特定基於 TCP 的網絡服務,可能是某些會在終端上產生大量 CPU 負載的服務,那麼下一個動態防火牆腳本會非常有用。這個腳本稱作 "tcplimit",它使用一個 TCP 端口、一個速率、一個比例和 "on" 或 "off" 作為自變量: # tcplimit 873 5 minute on Port 873 new connection limit (5/minute, burst=5) on. tcplimit 使用新的 iptables "state" 模塊(確保已經在內核中啟用了這個模塊或已經裝入了這個模塊),以在某個特定時間周期內只允許一定數量的新進入連接。在本示例中,防火牆只允許每分鐘有 5 個新連接到 rsync 服務器(端口 873) -- 如有必要,可以指定您希望每秒/分鐘/小時或每天有多少連接。 tcplimit 為限制非基本服務提供了一個好方法 -- 因此對非基本服務的大量通信量不會中斷網絡或服務器。在我遇到的情況中,我使用 tcplimit 來設置使用 rsync 的最大上限,以防止太多 rsync 連接占據我的 DSL 線路。限制了連接的服務都記錄在 /root/.dynfw-tcplimit 中,如果我要關閉新連接限制,只要輸入:

# tcplimit 873 5 minute off Port 873 new connection limit off. tcplimit 運行時會在 "filter" 表中創建一個全新的鏈。這個新的鏈將拒絕所有超出指定限度的信息包。然後,一個規則將插入 INPUT 鏈,該 INPUT 鏈將要發送到目標端口(本例中是 873)的所有進入 NEW 連接信息包重定向到這個特定鏈,這樣便有效地限制了新的進入連接,但又不會影響所建立連接中的信息包。 關閉 tcplimit 時,INPUT 規則和該特定鏈將被刪除。這是件奇妙的事,它真正體現了讓經過精心測試的、可靠的腳本來為您管理防火牆規則的重要性。由於使用了 ipblock,tcplimit 腳本將與任何類型的防火牆,甚至沒有防火牆的系統兼容,只要您在內核中啟用了正確的 iptables 功能。 host-tcplimit host-tcplimit 非常類似於 tcplimit,但它限制某些新的 TCP 連接,這些連接來自某個特定 IP 地址並且指向您的服務器上某個特定 TCP 端口。host-tcplimit 特別適用於防止某個人濫用您的網絡資源。例如,假設您在運行 CVS 服務器,而您發現某個新的開發人員似乎建立了一個腳本來每隔 10 分鐘就用資源庫更新它的源碼,這樣每天就消耗了大量的多余網絡資源。然而,當您給他發送電子郵件以指出他的錯誤行為時,卻會收到一條進入消息,全文如下: 嗨,伙計! 我很榮幸能參與您的開



host-tcplimit 非常類似於 tcplimit,但它限制某些新的 TCP 連接,這些連接來自某個特定 IP 地址並且指向您的服務器上某個特定 TCP 端口。host-tcplimit 特別適用於防止某個人濫用您的網絡資源。例如,假設您在運行 CVS 服務器,而您發現某個新的開發人員似乎建立了一個腳本來每隔 10 分鐘就用資源庫更新它的源碼,這樣每天就消耗了大量的多余網絡資源。然而,當您給他發送電子郵件以指出他的錯誤行為時,卻會收到一條進入消息,全文如下: 嗨,伙計! 我很榮幸能參與您的開



Copyright © Linux教程網 All Rights Reserved