新概念運維之REJECT和DROP的區別
原創【有關新概念運維】在日常的系統管理運維工作中,每個人對于系統、工具、應用、命令、架構等方面都會有自己的理解。理解方式的不同也意味著不同的認知,因此,這種理解方式的交流,也可能碰撞出更多思維的火花,讓每個人從另一個角度了解自己每天從事的工作。51CTO系統頻道從日常和運維人員的交流中收集這些理解方式,組合成短文集,名為《新概念運維》。
iptables這個防火墻工具,相信運維朋友們幾乎都在使用。大家都知道iptables對于進來的信息包有三種處理方法,那就是ACCEPT、DROP、REJECT。ACCEPT很容易理解,而REJECT和DROP的區別是什么?某天聽到Sery的解釋,感覺說的很容易理解:
“就好象騙子給你打電話,drop就是直接拒收。reject的話,相當于你還給騙子回個電話。”
其實對于到底是使用DROP還是REJECT,從很久以前開始就非常多的人提出這方面的疑問。REJECT其實就比DROP多返回一個ICMP錯誤信息包,兩個策略各有優劣,簡單總結如下:
DROP比REJECT好在節省資源,而且延緩黑客攻擊的進度(因為不會給黑客返回任何有關服務器的信息);壞在容易讓企業的網絡問題難以排查,而且在DDoS攻擊的情況容易耗盡所有的帶寬。
REJECT比DROP的好處在于容易診斷和調試網絡設備或防火墻造成的問題;壞處上面也說了,你給騙子回個電話,相當于暴露了自己的服務器信息。
所以一般的建議是在上游防火墻中使用REJECT,在比較危險的面向外網的基礎防火墻上,使用DROP要相對安全一些。
再說個跟這事兒有點關系的故事。話說某IT運維群中制定了這樣一條群規:
工作時間 閑聊 drop 非工作時間 閑聊 accept 違反規定 Any kill
可能因為IT運維是男性居多的緣故,隔了幾天,發現群規被修改成了:
露點圖片 any accept 工作時間 閑聊 drop 非工作時間 閑聊 accept 違反規定 Any kill
執行了幾天之后,群主被迫踢出了很多成員,甚至很多老成員也被波及。于是商討之后,現在的群規是:
anytime anytalk accept
經筆者跟群主商討,群主表示歡迎感興趣的ITers加入該群一起討論技術、討論人生。群號是158144617,能遵守初始版群規的人員優先錄取~
更新:由于第一個群已滿,群主正在協調部分人員轉移到新群,群號為 154743972。
《新概念運維》欄目接受投稿,有意者請聯系 yangsai@51cto.com 。
#p#
【相關資料】netfilter/iptables的工作原理
netfilter/iptables IP 信息包過濾系統是一種功能強大的工具,可用于添加、編輯和除去規則,這些規則是在做信息包過濾決定時,防火墻所遵循和組成的規則。這些規則存儲在專用的信息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在我們所謂的 鏈(chain)中。
雖然 netfilter/iptables IP 信息包過濾系統被稱為單個實體,但它實際上由兩個組件 netfilter和 iptables 組成。
netfilter 組件也稱為 內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱為 用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
通過使用用戶空間,可以構建自己的定制規則,這些規則存儲在內核空間的信息包過濾表中。這些規則具有 目標,它們告訴內核對來自某些源、前往某些目的地或具有某些協議類型的信息包做些什么。如果某個信息包與規則匹配,那么使用目標 ACCEPT 允許該信息包通過。還可以使用目標 DROP 或 REJECT 來阻塞并殺死信息包。對于可對信息包執行的其它操作,還有許多其它目標。
根據規則所處理的信息包的類型,可以將規則分組在鏈中。處理入站信息包的規則被添加到 INPUT 鏈中。處理出站信息包的規則被添加到 OUTPUT 鏈中。處理正在轉發的信息包的規則被添加到 FORWARD 鏈中。這三個鏈是基本信息包過濾表中內置的缺省主鏈。另外,還有其它許多可用的鏈的類型(如 PREROUTING 和 POSTROUTING ),以及提供用戶定義的鏈。每個鏈都可以有一個 策略,它定義“缺省目標”,也就是要執行的缺省操作,當信息包與鏈中的任何規則都不匹配時,執行此操作。
建立規則并將鏈放在適當的位置之后,就可以開始進行真正的信息包過濾工作了。這時內核空間從用戶空間接管工作。當信息包到達防火墻時,內核先檢查信息包的頭信息,尤其是信息包的目的地。我們將這個過程稱為 路由。
如果信息包源自外界并前往系統,而且防火墻是打開的,那么內核將它傳遞到內核空間信息包過濾表的 INPUT 鏈。如果信息包源自系統內部或系統所連接的內部網上的其它源,并且此信息包要前往另一個外部系統,那么信息包被傳遞到 OUTPUT 鏈。類似的,源自外部系統并前往外部系統的信息包被傳遞到 FORWARD 鏈。
接下來,將信息包的頭信息與它所傳遞到的鏈中的每條規則進行比較,看它是否與某條規則完全匹配。如果信息包與某條規則匹配,那么內核就對該信息包執行由該規則的目標指定的操作。但是,如果信息包與這條規則不匹配,那么它將與鏈中的下一條規則進行比較。最后,如果信息包與鏈中的任何規則都不匹配,那么內核將參考該鏈的策略來決定如何處理該信息包。理想的策略應該告訴內核 DROP 該信息包。
netfilter/iptables信息包過濾流程(來源)
【編輯推薦】