基於Linux系統的包過濾防火牆

第1 章、基於路由器的包過濾防火牆

1.1 包過濾防火牆的一般概念
1.1.1 什麼是包過濾防火牆
包過濾防火牆是用一個軟件查看所流經的數據包的包頭(header),由此決定整個包的命運。它可能會決定丟棄(DROP)這個包,可能會接受(ACCEPT)這個包(讓這個包通過),也可能執行其它更復雜的動作。
在Linux系統下,包過濾功能是內建於核心的(作爲一個核心模塊,或者直接內建),同時還有一些可以運用於數據包之上的技巧,不過最常用的依然是查看包頭以決定包的命運。
1.1.2 包過濾防火牆的工作層次
包過濾是一種內置於Linux內核路由功能之上的防火牆類型,其防火牆工作在網絡層。
1.1.3 包過濾防火牆的工作原理
(1)使用過濾器。數據包過濾用在內部主機和外部主機之間,        過濾系統是一臺路由器或是一臺主機。過濾系統根據過濾規則來決定是否讓數據包通過。用於過濾數據包的路由器被稱爲過濾路由器。
數據包過濾是通過對數據包的IP頭和TCP頭或UDP頭的檢查來實現的,主要信息有:
* IP源地址
* IP目標地址
* 協議(TCP包、UDP包和ICMP包)
* TCP或UDP包的源端口
* TCP或UDP包的目標端口
* ICMP消息類型
* TCP包頭中的ACK位
* 數據包到達的端口
* 數據包出去的端口
在TCP/IP中,存在着一些標準的服務端口號,例如,HTTP的端口號爲80。通過屏蔽特定的端口可以禁止特定的服務。包過濾系統可以阻塞內部主機和外部主機或另外一個網絡之間的連接,例如,可以阻塞一些被視爲是有敵意的或不可信的主機或網絡連接到內部網絡中。
(2)過濾器的實現。數據包過濾一般使用過濾路由器來實現,這種路由器與普通的路由器有所不同。
普通的路由器只檢查數據包的目標地址,並選擇一個達到目的地址的最佳路徑。它處理數據包是以目標地址爲基礎的,存在着兩種可能性:若路由器可以找到一個路徑到達目標地址則發送出去;若路由器不知道如何發送數據包則通知數據包的發送者“數據包不可達”。
過濾路由器會更加仔細地檢查數據包,除了決定是否有到達目標地址的路徑外,還要決定是否應該發送數據包。“應該與否”是由路由器的過濾策略決定並強行執行的。
路由器的過濾策略主要有:
* 拒絕來自某主機或某網段的所有連接。
* 允許來自某主機或某網段的所有連接。
* 拒絕來自某主機或某網段的指定端口的連接。
* 允許來自某主機或某網段的指定端口的連接。
* 拒絕本地主機或本地網絡與其它主機或其它網絡的所有連接。
* 允許本地主機或本地網絡與其它主機或其它網絡的所有連接。
* 拒絕本地主機或本地網絡與其它主機或其它網絡的指定端口的連接。
* 允許本地主機或本地網絡與其它主機或其它網絡的指定端口的連接。
1.1.4 包過濾器操作的基本過程
下面做個簡單的敘述:
(1)包過濾規則必須被包過濾設備端口存儲起來。
(2)當包到達端口時,對包報頭進行語法分析。大多數包過濾設備只檢查IP、TCP、或UDP報頭中的字段。
(3)包過濾規則以特殊的方式存儲。應用於包的規則的順序與包過濾器規則存儲順序必須相同。
(4)若一條規則阻止包傳輸或接收,則此包便不被允許。
(5)若一條規則允許包傳輸或接收,則此包便可以被繼續處理。
(6)若包不滿足任何一條規則,則此包便被阻塞。
1.1.5 包過濾技術的優缺點
(1)優點:
→對於一個小型的、不太複雜的站點,包過濾比較容易實現。
→因爲過濾路由器工作在IP層和TCP層,所以處理包的速度比代理服務器快。
→過濾路由器爲用戶提供了一種透明的服務,用戶不需要改變客戶端的任何應用程序,也不需要用戶學習任何新的東西。因爲過濾路由器工作在IP層和TCP層, 而IP層和TCP層與應用層的問題毫不相關。所以,過濾路由器有時也被稱爲“包過濾網關”或“透明網關”,之所被稱爲網關,是因爲包過濾路由器和傳統路由 器不同,它涉及到了傳輸層。
→過濾路由器在價格上一般比代理服務器便宜。
(2)缺點:
→一些包過濾網關不支持有效的用戶認證。
→規則表很快會變得很大而且複雜,規則很難測試。隨着表的增大和複雜性的增加,規則結構出現漏洞的可能  性也會增加。
→這種防火牆最大的缺陷是它依賴一個單一的部件來保護系統。如果這個部件出現了問題,會使得網絡大門敞開,而用戶其至可能還不知道。
→在一般情況下,如果外部用戶被允許訪問內部主機,則它就可以訪問內部網上的任何主機。
→包過濾防火牆只能阻止一種類型的IP欺騙,即外部主機僞裝內部主機的IP,對於外部主機僞裝外部主機的IP欺騙卻不可能阻止,而且它不能防止DNS欺騙。
雖然,包過濾防火牆有如上所述的缺點,但是在管理良好的小規模網絡上,它能夠正常的發揮其作用。一般情況下,人們不單獨使用包過濾網關,而是將它和其他設備(如堡壘主機等)聯合使用。
1.2 Netfilter/iptables架構
1.2.1 Linux下的包過濾防火牆管理工具
從1.1內核開始,Linux系統就已經具有包過濾功能了,隨着Linux內核版本的不斷升級,Linux下的包過濾系統經歷瞭如下3個階段:
→ 在2.0的內核中,採用ipfwadm來操作內核包過濾規則。
→ 在2.2的內核中,採用ipchains來控制內核包過濾規則。
→  在2.4內核中,採用一個全新的內核包過濾管理工具—iptables.
Linux因其健壯性、可靠性、靈活性以及幾乎無限範圍的可定製性而在IT界變得非常受歡迎。Linux具有許多內置的能力,使開發人員可以根據自己的需 要定製其工具、行爲和外觀,而無需昂貴的第三方工具。如果Linux系統連接到因特網或LAN、服務器或連接LAN和因特網的代理服務器,所要用到的一種 內置能力就是針對網絡上Linux系統的防火牆配置。可以在Netfilter/iptables IP信息包過濾系統(它集成在2.4.x版本的Linux內核中)的幫助下運用這種能力。Netfilter/iptables是與最新的2.4.x版本 Linux內核集成的IP信息包過濾系統。
與ipfwadm和ipchains這樣的Linux信息包過濾方案相比,Netfilter/iptables信息包過濾系統是最新的解決方案,使用戶 更易於理解其工作原理,也具有更爲強大的功能。對於Linux系統管理員、網絡管理員以及家庭用戶(他們想要根據自己特定的需求來配置防火牆、在防火牆解 決方案上節省費用和對IP信息包過濾具有完全控制權)來說,Netfilter/iptables系統十分理想,且更容易被使用。
1.2.2 新一代的Netfilter網絡底層架構
Netfilter是一種內核中用於擴展各種網絡服務的結構化底層構架。Netfilter的設計思想是生成一個模塊結構使之能夠比較容易的擴展。新的特 性加入到內核中並不需要重新啓動內核。這樣,可以通過簡單的構造一個內核模塊來實現網絡新特性的擴展。爲底層的網絡特性擴展帶來了極大的便利,使更多從事 網絡底層研發的人員能夠集中精力實現新的網絡特性。
事實上,我們可以將Netfilter視爲網絡協議堆棧中可以讓其它模塊操作網絡數據包的一系列“鉤子”,在數據包通過協議堆棧的某些特定的點上, Netfilter框架允許一個模塊轉發或丟棄數據包、通過某種方式改變數據包、在用戶空間(非內核模式)對包進行排隊,當然也可以根本不去幹涉它。
(1)Netfilter/iptables系統的含義。Linux 2.4內核中Netfilter是新的用來實現防火牆的過濾器。 iptables是用來指定Netfilter規則的用戶工具。
Iptables只是一個管理內核包過濾的工具,它爲用戶配置防火牆規則提供了方便。
Iptables可以加入、插入或刪除核心包過濾表格(鏈)中的規則。實際上真正來執行這些規則的netfilter及其相關模塊(如iptables模塊和nat模塊等)。
因此,要使用Netfilter/iptables系統,必須首先有2.4版本內核的相關支持,同時必須安裝iptables軟件包。在Red Hat 9.0發行版中,此係統是默認的配置。
(2)使用Netfilter/iptables替代ipchains的原因:
→連接跟蹤
→自動碎片重裝
→改良的匹配規則
→增強的日誌功能
→允許撕裂包中的任何信息
→用戶隊列允許用戶空間對包進行編程
→支持內置包轉發而捨棄了IPMASQANDM
(3)Netfilter/iptables系統的主要功能
→狀態包過濾(連接跟蹤)
→各種網絡地址翻譯
→靈活、易擴展的急智機制
→大量的增強型補丁包
(4)Netfilter/iptables的用途
→建立Internet防火牆和基於狀態的包過濾
→用NAT和僞裝(masquerading)共享上網
→用NAT實現透明代理
→用修改IP包頭的ToS字段來實現更復雜的功能
→和tc+iprouter2配合使用可以實現QoS路由
(5)Netfilter/iptables系統的優點。Netfilter/iptables的最大優點是它可以配置有狀態的防火牆,這是 ipfwadm和ipchains等以前的工具都無法提供的一種重要功能。有狀態的防火牆能夠指定並記住爲發送或接收信息包所建立的連接的狀態。防火牆可 以從信息包的連接跟蹤狀態獲得該信息。在決定新的信息包過濾時,防火牆所使用的這些狀態信息可以增加其效率和速度。有4種有效狀態,名稱分別爲 ESTABLISHED、INVALID、NEW和RELATED。其中:
→狀態ESTABLISHED指出該信息包屬於已建立的連接,該連接一直用於發送和接收信息包並且完全有效。
→狀態INVALID指出該信息包與任何已知的流或連接都不相關聯,它可能包含錯誤的數據或頭。
→狀態NEW意味着該項信息包已經或將啓動新的連接,或者它與尚味用於發送和接收信息包的連接相關聯。
→狀態RELATED表示該信息包正在啓動新連接,以及它與已建立的連接相關聯。
Netfilter/iptables的另一個重要優點是,它使用戶可以完全控制防火牆配置和信息包過濾。您可以定製自己的規則來懣足您的特定需求,從而只允許您想要的網絡流量進入系統。
此外,Netfilter/iptables是免費的,這對於那些想要節省費用的人來說十分理想,它可以代替昂貴的防火牆解決方案。
總之,最新的Linux內核2.4.x具有Netfilter/iptables系統這種內置的IP信息包過濾工具,它使配置防火牆和信息包過濾變得便宜 且方便。Netfilter/iptables系統使其用戶可以完全控制防火牆配置和信息包過濾。它允許爲防火牆建立可定製化的規則來控制信息包過濾。它 還允許配置有狀態的防火牆。
1.2.3 Netfilter/iptables的內核空間和用戶空間
雖然netfilter/iptables IP信息包過濾系統被稱爲單個實體,但它實際上由兩個組件netfilter和iptables組成。
(1)內核空間。Netfilter組件也稱爲內核空間(KernelSpace),是內核的一部分,由一些“表”(table)組成,每個表由若干“鏈”組成,而每條鏈中可以有一條或數條規則(rule)。
(2)用戶空間。Iptables組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
1.2.4 Netfilter/iptables過濾系統是如何工作的
Netfilter/iptables IP信息包過濾系統是一種功能強大的工具,可用於添加、編輯和除去規則,這些規則是在做包過濾決定時所遵循的依據。這些規則存儲在專用的信息包過濾表中, 而這些表集成在Linux內核中。在信息包過濾表中,規則被分組在鏈(chain)中。
(1)用戶使用iptables命令在用戶空間設置過濾規則。通過使用用戶空間可以構建用戶自己的定製過濾規則,這些規則存儲在內核空間的信息包過濾表 中。這些規則具有目標,它們告訴內核對來自某些源、前往某些目的地或具有某些協議類型的信息包做些什麼。如果某個信息包與規則匹配,那麼使用目標 ACCEPT允許該信息包通過。還可以使用目標DROP或REJECT來阻塞並殺死信息包。對於可對信息包執行的其它操作,還有許多其它目標。
根據規則所處理的信息包的類型,可以將規則分組在鏈中。
→處理入站信息包的規則被添加到INPUT鏈中。
→處理出站信息包的規則被添加到OUTPUT鏈中。
→處理正在轉發的信息包的規則被添加到FORWARD鏈中。
這3個鏈是系統默認的表(filter)中內置的3個默認主鏈。每個鏈都有一個策略,它定義默認目標,也就是要執行的默認操作,當信息包與鏈中的任何規則都不匹配時,執行此操作。
(2)內核空間接管過濾工作。當規則建立並將鏈放在filter表之後,        就可以開始進行真正的信息包過濾工作了。這時內核空間從用戶空間接管工作。
包過濾工作要經過如下的步驟:
1)路由。當信息包到達防火牆時,內核先檢查信息包的頭信息,尤其是信息包的目的地。我們將這個過程稱爲路由。
2)根據情況將數據包送往包過濾表(filter)的不同的鏈。
→如果信息包源自外界並且數據包的目的地址是本機,而且防火牆是打開的,那麼內核將它傳遞到內核空間信息包過濾表的INPUT鏈。
→如果信息包源自系統本機,並且此信息包要前往另一個系統,那麼信息包被傳遞到OUTPUT鏈。
→信息包源自廣域網前往局域網或相反方向的信息包被傳遞到FORWARD鏈。
3)規則檢查。將信息包的頭信息與它所傳遞到的鏈中的每條規則進行比較,看它是否與某條規則完全匹配。
→如果信息包與某條規則匹配,那麼內核就對該信息包執行由該項規則的目標指定的操作。
&如果目標爲ACCEPT,則允許該信息包通過,並將該包發給相應的本地進程處理。
&如果目標爲DROP或REJECT,則不允許該信息包通過,並將該包阻塞並殺死。
→如果信息包與這條規則不匹配,那麼它將與鏈中的下一條規則進行比較。
→最後,如果信息包與鏈中的任何規則都不匹配,那麼內核將參考該鏈的策略來決定如何處理該信息包。理想的策略應該告訴內核DROP該信息包。
1.2.5 Red Hat linux 9中的Netfilter/iptables
Red Hat linux 9使用2.4版本的內核,並且內核的編譯選項中包含對Netfilter的支持,同時iptables軟件包是被默認安裝的,所以可以直接使用。
另外,爲了完成轉發功能,必須打開系統內核的IP轉發功能。使Linux變成路由器。
在Red Hat中有兩種方法:
(1)修改內核變量ip_forward
#echo “1”>;/proc/sys/net/ipv4/ip_forward
(2)修改腳本/etc/sysconfig/network。
將FORWARD_IPV4=false
改爲FORWARD_IPV4=true

第2章、用用戶空間命令iptables實現包過濾


2.1 相關的TCP/IP知識
2.1.1建立TCP連接(通過3次握手實現)
假如服務器A和客戶機B通信。
(1)B->;A。當B要和A通信時,B首先向A發一個SYN標記的包,告訴A請求建立連接。只有當A收到B發來的SYN包,纔可以建立連接,除此之外別無它法。因此,如果你的防火牆丟棄所有的發往外網接口的SYN包,那麼你將不能讓外部任何主機主動建立連接。
(2)B<-A。接着,A收到後會發一個對SYN包的確認包(SYN/ACK)回去,表示對第一個SYN包的確認,並繼續握手操作。
(3)B->;A。B收到SYN/ACK包後,B發一個確認包(ACK),通知A連接已建立。至此,3次握手完成,一個TCP連接完成。
需要注意的是,當3次握手完成、連接建立以後,TCP連接的每個包都會設置ACK位。這就是爲何連接跟蹤很重要的原因了,沒有連接跟蹤,防火牆將無法判斷收到的ACK包是否屬於一個已經建立的連接。
2.1.2 結束TCP連接(通過4次握手實現)
假如服務器A和客戶機B通信。注意,由於TCP連接是雙向連接,因此關閉連接需要在兩個方向上做。
(1)B->;A。當B要與A結束通信時,B首先向A發一個FIN標記的包,告訴A請求結束連接。由於連接還沒有關閉,FIN包總是打上ACK標記。沒有ACK標記而僅有FIN標記的包不是合法的包,並且通常被認爲是惡意的。
(2)B<-A。A送出ACK包給B,表示成功地中止B->;A傳輸通道。不過A->;B可能還有數據包需要傳送,所以A->;B傳輸通道仍舊繼續暢通,直到傳輸完畢纔會進入下一步。
(3)B<-A。當A完成B<-A的傳輸後,便送出ACK/FIN包。
(4)B->;A。B送出ACK包給A進行確認。
2.1.3 發送連接復位包結束TCP連接
4次握手不是結束TCP連接的唯一方法。有時,如果主機需要儘快關閉連接(或連接超時,端口或主機不可達),RST包將被髮送。注意,由於RST包不是 TCP連接中的必須部分,可以只發送RST包(即不帶ACK標記)。但在正常的TCP連接中RST包可以帶ACK確認標記。注意,RST包是可以不要收方 進行確認的。
2.1.4 無效的TCP標記
至此,已經看到了SYN、ACK、FIN、和RST標記。另外,還有PSH和URG標記。
最常見的非法組合是SYN/FIN包。注意,由於SYN包是用來初始化連接的,它不可能和FIN以及RST標記一起出現,這也是一個惡意攻擊。
當網絡中出現別的一些組合(如SYN/FIN/PSH、SYN/FIN/RST、SYN/FIN/RST/PSH),很明顯網絡肯定受到了攻擊。
另外,已知的非法包還有FIN(無ACK標記)和“NULL”包。如同早先討論的,由於ACK/FIN包的出現是爲了結束一個TCP連接,那麼正常的 FIN包總是帶有ACK標記的。“NULL”包就是沒有任何TCP標記的包(URG、ACK、PSH、RST、SYN、FIN都爲0)。
在正常的網絡活動下,到目前爲止TCP協議棧不可能產生帶有上面提到的任何一個標記組合的TCP包。當你發現這些不正常的包時,肯定有人對你的網絡不懷好意。
2.1.5 ICMP類型
ICMP是網間控制消息協議,用來在主機/路由器之間傳遞控制信息的協議。ICMP包可以包含診斷信息(ping 、 tracerouter)、錯誤信息(網絡/主機/端口不可達),信息(時間戳timestamp,地址掩碼address mask等)、或控制信息(source quench、redirect等)。
使用包過濾可以拒絕指定的ICMP類型。
此外,下面類型的ICMP信息建議丟棄。
Redirect(5)、Alternate Host Address(6)、Router Advertisement(9)能用來轉發通信。       
Echo(8)、Timestamp(13)、Address Mask Request(17)能用來分別判斷主機是否啓動、本地時間和地址掩碼。它們是和返回的信息類別有關的。其本身是不能被利用的,但它們泄漏出的信息對攻 擊者是有用的,所以建議丟棄這些類型的ICMP。
關於ICMP類型的更詳細的表述參見RFC792。
2.2 iptables語法
2.2.1 Iptables的優點
→ iptables允許建立狀態(stateful)防火牆,就是在內存中保存穿過防火牆的每條連接。這種模式對於有效地配置FTP和DNS以及其它網絡服務是必要的。
→iptables能夠過濾TCP標誌任意組合報文,還能夠過濾MAC地址。
→系統日誌比ipchains更容易配置,擴展性也更好。
→對於網絡地址轉換(Network Address Translation)和透明代理的支持,Netfilter更爲強大和易於使用。
→iptables能夠阻止某些DoS攻擊,例如SYS洪泛攻擊。
2.2.2 Iptables的規則要素
一條iptables規則基本上應該包含5個要素:
→指定表(table)
→指定操作命令(command)
→指定鏈(chains)
→指定規則匹配器(matcher)
→指定目標動作(target)
(1)表。Iptables從其使用的3個表而得名,分別是filter、nat、mangle。對於包過濾防火牆只使用filter表。表filter是默認的表,無需顯示說明。
(2)操作命令。包括添加、刪除、更新等。
(3)鏈。對於包過濾防火牆可操作filter表中的INPUT鏈、OUTPUT鏈和FORWARD鏈。也可以操作由用戶自己定義的自定義鏈。
(4)規則匹配器。可以指定各種規則匹配,如IP地址、端口、包類型等。
目標動作。當規則匹配一個包時,真正要執行的任務用目標標識。最常用的內置目標分別是:
→ACCEPT表示允許包通過
→DROP表示被丟棄
此外,包過濾防火牆還可以使用擴展的目標:
→REJECT表示拒絕包,丟棄包的同時給發送者發送沒有接受的通知。
→LOG表示包的有關信息被記錄日誌。
→TOS表示改寫包的ToS的值。
要使用上述的擴展目標,必須在內核中激活相應選項或者裝載了相應的內核模塊。
2.2.3 Iptables工具的調用語法
Iptables的語法非常複雜,要查看該工具的完整語法,應該查看其手冊頁。
Iptables的語法通常可以簡化爲下面的形式:
Iptables[-t table]CMD[chain][rule-matcher][-j target]
其中:tables爲表名,CMD爲操作命令,chain爲鏈名,rule-matcher爲規則匹配器,target爲目標動作。
2.2.4 制定永久性規則
  iptables軟件包提供了兩個命令分別用於保存和恢復規則集。可以使用下在的命令轉儲在內存中的內核規則集。其中/etc/sysconfig/iptables是iptables守護進程調用的默認規則集文件:
#/sbin/iptables-save >; /etc/sysconfig/iptables
要恢復原來的規則庫,需使用命令:
#/sbin/iptables-restore < /etc/sysconfig/iptables
爲了使得用iptables命令配置的規則在下次啓動機器時還能被使用,有兩種主法。
(1)使用iptables的啓動腳本實現。Iptables的啓動腳本/etc/rc.d/init.d/iptables每次啓動時都使用/etc/sysconfig/iptables所提供的規則進行規則恢復,並可以使用如下的命令保存規則:
#service iptables save
(2) 在自定義腳本中用iptables命令直接創建規則集。可以直接用iptables命令編寫一個規則腳本,並在啓動時執行這個腳本。
例如:若規則腳本的文件名爲/etc/fw/rules,則可以在啓動腳本/etc/rd.d/init.d/rc.local中加入下面的代碼:
if[-x /etc/fw/rules];then /etc/fw/rules;fi;
這樣,機器每次啓動時即可執行該規則腳本。
如果使用此種方式,建議使用ntsysv命令關閉系統的iptables守護進程。
2.3 iptables命令使用舉例
2.3.1 鏈的基本操作
(1)清除所有的規則。通常在開始配置包過濾防火牆之初清除所有的規則,重新開始配置,以免原有的規則影響新的設定。使用如下命令進行:
1)        清除預設表filter中所有規則鏈中的規則。
#iptables -F
2)清除預設表filter中使用者自定義鏈中的規則。
#iptables -X
3)將指定鏈所有規則的包字節記數器清零。
#iptables -Z
(2)設置鏈的默認策略。一般地,配置鏈的默認策略有兩種方法。
1)        首先允許所有的包,然後再禁止有危險的包通過防火牆。即“沒有被拒絕的都允許”。這種方法對於用戶而言比較靈活方便,但對系統而言,容易引起嚴重的安全問題。
爲此,應該使用如下的初始化命令:
#iptables -P INPUT ACCEPT
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD ACCEPT
2)        首先禁止所有的包,然後再根據需要的服務允許特定的包通過防火牆。即“沒有明確允許的都被拒絕”。這種方法最安全,但不太方便。爲了使得系統有足夠的安全性,一般採用此種策略進行iptables防火牆的配置。
爲此,應該使用如下的初始化命令:
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWAED DROP
3)列出表/鏈中的所有規則。包過濾防火牆只使用filter表,此表爲默認的表,因此可以使用下面的命令列出filter表中所有規則:
#iptables -L
使用上面的命令時,iptables將逆向解析IP地址,這將發費很多時間,從而造成信息出來的非常慢。爲了解決這個問題,可以使用下面的帶有-n參數的命令(-n參數用於顯示數字化的地址和端口):
#iptables -L -n
4)向鏈中添加規則。下面的語句用於開放網絡接口:
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A  INPUT -i  eth0 -j ACCEPT  
#iptables -A OUTPUT -o eth0 -j ACCEPT
#iptables -A FORWARD -i eth0 -j ACCEPT
#iptables -A FPRWAED -o eth0 -j ACCEPT
5)使用用戶自定義鏈。下面是一個用戶自定義鏈的創建、修改和調用的簡單命令序列:
#iptables -N custom
#iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP
#iptables -A INPUT -s 0/0 -d 0/0 -j custom
首先使用帶-N參數的iptables命令新建了一個名爲custom的用戶逢定義鏈。然後使用帶-A參數的命令添加了一條用戶自定義的堵截規則,該規則 丟棄全部的ICMP包。最後向默認的INPUT鏈加入一條規則,使所有的包都由custom自定義鏈處理。結果全部的ICMP包都將被丟棄。
2.3.2 設置基本的規則匹配
下面舉例說明iptables的基本規則匹配(忽略目標動作):
(1)指定協議匹配
1)匹配指定的協議
#iptables -A INPUT -p tcp
2)匹配指定協議之外的所有協議
#iptables -A INPUT -p !tcp
(2)指定地址匹配
1)指定匹配的主機
#iptables -A INPUT -s 192.168.1.1
2)指定匹配的網絡
#iptables -A INPUT -s 192.168.1.0/24
3)匹配指定主機之外的地址。
#iptables -A FORWARD -s ! 192.168.0.1
4)匹配指定網絡之外的網絡
#iptables -A FORWARD -s ! 192.168.0.0/24
(3)指定網絡接口匹配。
1)指定單一的網絡接口匹配。
#iptables -A INPUT -i eth0
#iptables -A FORWARD -o eth0
2)指定同類型的網絡接口匹配
#iptables -A FORWARD -o ppp+
(4)指定端口匹配
1)指定單一的端口匹配。
#iptables -A INPUT -p tcp-sport www
#iptables -A INPUT -p tcp-sport 80
#iptables -A INPUT -p tcp-sport 53
#iptables -A INPUT -p udp-dport 53
2)匹配指定端口之外的端口。
#iptables -A INPUT -p tcp-dport ! 22
3)匹配指定端口的範圍。
#iptables -A INPUT -p tcp-soprt 22:80
4)匹配ICMP端口和ICMP類型。
#iptables -A INPUT -p icmp --icmp-type 8
5)指定ip碎片
在TCP/IP通信過程中,每一個網絡接口都有一個最大的傳輸單元(MTU),這個參數定義了可以通過的數據包的最大尺寸。如果一個數據包大於這個參數值時,系統會將其劃分成更小的數個數據包(稱之爲ip碎片)來傳輸,而接收方則對這些ip碎片再進行重組以還原整個包。
但是在進行包過濾的時候,ip碎片會導致這樣一個問題:當系統將大數據包劃分成ip碎片傳送時,第一個碎片含有完整的包頭信息(IP+TCP、UDP和 ICMP),但是後續的碎片只有包頭的部分信息(如源地址、目的地址)。因此,檢查後面的ip碎片的頭部(就像有TCP、UDP和ICMP一樣)是不可能 的。假如有這樣一條規則:
#iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --dport 80 -j ACCEPT
並且這時的FORWARD的策略(policy)爲DROP時,系統只會讓第一個ip碎片通過,而丟掉其餘的ip碎片,因爲第一個碎片含有完整的包頭信息,可以滿足該規則的條件,而餘下的碎片因爲包頭信息不完整而無法滿足規則定義的條件,因而無法通過。
可以通過-fragment/-f選項來指定第二個及其以後的ip碎片,以上面的例子爲例,我們可以再加上這樣一條規則來解決這個問題:
#iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
但是需要注意的是,現在已經有許多進行ip碎片攻擊的實例(例如向Win98 NT4SP5,6 Win2K發送大量的ip碎片進行DoS攻擊),因此允許ip碎片通過是有安全隱患的,對於這一點可以採用iptables的匹配擴展來進行限制。
2.3.3 設置擴展的規則匹配
要獲得匹配的簡要說明,可以使用如下的命令:
#iptables -m name_of_match -help
下面舉例說明iptables的擴展規則匹配(忽略目標動作):
(1)多端口匹配擴展。
1)匹配多個源端口。
#iptables -A INPUT -p tcp -m multiport-source-port 22,53,80,110
2)匹配多個目的端口
#iptables -A INPUT -p tcp -m multiport-destionation-port 22,53,80,110
3)匹配多個端口(無論源源端口還是目的端口)。
#iptables -A INPUT -p tcp -m multiport -port 22,53,80,110
(2)指定TCP匹配擴展
通過使用-tcp-flags選項可以根據tcp包的標誌位進行過濾,該選項後接兩個參數:第一個參數爲要檢查的標誌位,可以是SYN、ACK、FIN、URG、PSH的組合,可以用ALL指定所有標誌位:第二個參數是標誌位值爲1的標誌。
#iptables -A INPUT -p tcp-tcp-flags SYN,FIN,ACK SYN
表示SYN、ACK、FIN的標誌都要被檢查,但是隻有設置了SYN的才匹配。
#iptables -A INPUT -p tcp-tcp-flags ALL SYN,ACK
表示ALL(SYN,ACK,FIN,RST,URG,PSH)的標誌都要被檢查,但是隻有設置了SYN和ACK的才匹配。
選項-syn是以上的一種特殊情況,相當於“--tcp-flags SYN,RST,ACK SYN“的簡寫。
#iptables -p tc-syn
(3)limit速率匹配擴展。
1)指定單位時間內允許通過的數據包的個數。
單位時間可以是/second、/minute、/hour、/day或使用第一個字母。例如:
#iptables -A INPUT -m limit-limit 300/hour
表示限制每小時允許通過300個數據包。
2)指定觸發事件的閥值。
使用-limit-burst指定觸發事件的閥值(默認是5),用來比對瞬間大量數據包的數量。
#iptables -A INPUT -m limit-limit-burst 10
上面的例子是用來比對一次同時涌入的封包是否超過10個,超過此上限的包將被直接丟棄。
3)同時指定速率限制和觸發閥值。
#iptables -A INPUT -p icmp -m limit-limit 3/m-limit-burst 3
假設均勻通過,平均每分鐘3個,那麼觸發閥值burst保持爲3個,如果每分鐘通過的包的數目小於3,那麼觸發閥值burst將在每個週期(若每分鐘允許 通過3個,則週期數爲20秒)後加1,但最大值爲3。每分鐘要通過的包的數量如果超過3,那麼觸發閥值burst將減掉超出的數值,例如第二分鐘有4個 包,那麼觸發閥值burst變成2,同時4個包都可以通過,第三分鐘有6個包,則只能通過5個,觸發閥值burst將變成0。之後,每分鐘如果包數小於等 於3,則觸發閥值burst將加1,如果每分鐘包數大於3,觸發閥值burst將逐漸減小最終維持爲0。
即每分鐘所允許的最大包數量爲限制速率(本例爲3)加上當前的觸發閥值burst數。在任何情況下,都可以保證3個包通過,觸發閥值burst相當於是允許額外的包數量。
(4)基於狀態的匹配擴展(連接跟蹤)。  
每個網絡連接包括以下信息:源地址、目的地址、源端口、目的湍口,稱爲套接字對(socket pairs);協議類型、連接狀態(TCP協議)和超時時間等。防火牆把這些信息稱爲狀態(stateful),能夠檢測每個連接狀態的防火牆叫作狀態包 過濾防火牆。它除了能夠完成簡單包過濾防火牆的包過濾工作外,還在自己的內存中維護一個跟蹤連接狀態的表,比簡單包過濾防火牆具有更大的安全性。 iptables與ipchains的不同之處在於iptables可以使用連接狀態信息,創建基於包的狀態的規則匹配。
基於狀態匹配創建規則的命令格式如下:
iptables -m state-state [!]state [,state,state,state]
其中,state表是一個用逗號分割的列表,用來指定的連接狀態可以是如下的4種:
→NEW:該包想要開始一個連接(重新連接或將連接重定向)。
→RELATED:該包是屬於某個已經建立連接所建立的新連接。例如:FTP的數據傳輸連接和控制連接之間就是RELATED關係。
→ESTABLISHED:該包屬於某個已經建立的連接。
→INVALID:該包不匹配於任何連接,通常這些包會被DROP。
例如:
1)在INPUT鏈添加一條規則,匹配已經建立的連接或由已經建立的連接所建立的新連接。即匹配所有的TCP迴應包。
#iptables -A INPUT -m state-state RELATED,ESTABLISHED
2)在INPUTP鏈添加一條規則,匹配所有從非eth0接口來的連接請求包。
#iptables -A INPUT -m state-state NEW -i ! eth0
又如,對於ftp連接可以使用下面的連接跟蹤:1)被動ftp連接模式。
#iptables -A INPUT -p tcp-sport 1024: --dport 1024: -m state-state ESTABLES -j ACCEPT
#iptables -A OUTPUT -p tcp-sport 1024: --dport 1024: -m state-state ESTABLISHED,RELATED -j ACCEPT
2)主動ftp連接模式。
#iptables -A INPUT -p tcp-sport 20 -m state-state ESTABLISHED,RELATED -j ACCEPT -m state-state ESTABLISHED -j ACCEPT
(5)TOS匹配擴展。
所有數據包的首部都有一個稱爲服務類型的專用字段。該字段用於當數據包經過路由器時區分優先順序。
使用ToS字段,可以使用某種類型的數據包優先於其它的數據包。有標記的數據包在路由器中進行不同的處理。設置ToS字段的工作是在網絡層進行的。有關ToS的具體工作過程請參專考RFC1349。
在數據包中設置ToS字段的主要原因是:對不同類型的數據包加以區分,從而在流量較高的網絡上減少網絡擁塞。
數據包的ToS字段用一個字節表示。此字節的高3位捨棄不用,最低位使用固定值0,因此,有效位共有4個。有效位分別用來控制數據包的最小延時,最大吞吐量,最大可靠度和最小成本。其中,
→最小延時:用於減少數據包從路由到達主機的時間。
→最大吞吐量:用於提高數據傳輸量。適用於FTP數據端口,HTTP大文件傳輸和大量的POP3傳輸。
→最大可靠度:用來試圖減少數據重傳。
→最小成本:通常只在商業產品中使用。
要創建與ToS字段匹配的規則,可以使用下面的語法:
iptables [-t table]CMD[chain]-m tos tos_value [-j target]
其中tos_value可以是0x02、0x04、0x06、0x08、0x10。
例如:
#iptables -A INPUT -p tcp -m tos 0x08
表示匹配在ToS字段中設置了最大吞吐量的包。
2.3.4 設置目標擴展
要獲得目標的簡要說明,可以使用如下的命令:
#iptables -j name_of_TARGET-help
目標擴展由內核模塊組成,而且iptables的一個可選擴展提供了新的命令行選項。在幾個擴展是包含在默認netfilter發佈中的。
(1)設置包的ToS值。爲了設置數據包的ToS值,需要使用ToS目標擴展。設置ToS的值,只能對FORWARD、OUTPUT和PREROUTING鏈進行。語法如下:
iptables [-t table]CMD[chain][rule-matcher]-j TOS-set-tos tos_value
其中tos_value可以是0x02、0x04、0x06、0x08、0x10。
下面是使用ToS目標擴展設置ToS值的一些例子:
#iptables -A OUTPUT -p tcp -m tcp-dport 21 -j TOS-set-tos 0x10
#iptables -A OUTPUT -p tcp -m tcp-dport 22 -j TOS-set-tos 0x10
#iptables -A OUTPUT -p tcp -m tcp-dport 110 -j TOS-set-tos 0x08
(2)日誌記錄。iptables使用新的目標擴展LOG來實現日誌記錄。LOG目標用syslogd記錄此包並繼續傳播。LOG目標擴展還可以使用如下的一些參數:
→ --log-level
跟蹤一個級別名稱或數字。合適的名字是'debug'、'info'、'notice'、'warning'、'err'、'crit'、'alert' 和'emerg',相當於數字7到0。參考syslog.conf的手冊可獲取這些級別的說明。默認是'warning'。
→ --log-prefix
跟蹤一個最多29個字符的字符串,它被寫入到log信息的開始處,這樣可以方便地使用grep對日誌進行過濾。
另外,在使用LOG目標擴展的同時,還可以使用limit match,這樣可以使記錄有用日誌的同時確保日誌記錄不會變得冗長。
下面是使用LOG目標擴展的一些例子:
#iptables -A FORWARD -m tcp -p tcp -j LOG
#iptables -A FORWARD -m icmp -p icmp-sport echo-reply -j LOG
#iptables -A INPUT -m limit-limit 3/m-limit-burst 3 -j LOG-log-prefix "INPUT packet died:"

第3章、包過濾防火牆配置舉例

3.1 建立包過濾防火牆
3.1.1網絡結構
本節爲一個的網絡結構建立一個包過濾防火牆。
這個網絡結構假設內部網有有效的Internet地址。爲了將內部網段198.168.80.0/24與Internet隔離,在內部網絡和 Internet之間使用了包過濾防火牆。防火牆的網接口是eth1(198.168.80.254),防火牆的Internet接口是eth0 (198.199.37.254)。加外,內網中有3臺服務器對外提供服務。分別爲:
→ WWW服務器:IP地址爲198.168.80.251
→ FTP服務器:IP地址爲198.168.80.252
→ E-mail服務器:IP地址爲198.168.80.253
3.1.2 防火牆的建立過程
本例主要是對內部的各種服務器提供保護。下面採用編輯並執行可執行腳本的方法建立此防火牆。具本過程如下:
#!/sbin/bash
#在屏幕上顯示信息
echo "Starting iptables rules..."
#開啓內核轉發功能
echo "1">;/proc/sys/net/ipv4/ip_forward
#定義變量
IPT=/sbin/iptables
WWW-SERVER=198.168.80.251
FTP-SERVER=198.168.80.252
EMAIL-SERVER=198.168.80.253
IP_RANGE="198.168.80.0/24"
#刷新所有的鏈的規則
$IPT -F
#首先禁止轉發任何包,然後再一步步設置允許通過的包
#所以首先設置防火牆FORWARD鏈的策略爲DROP
$IPT -P FORWARD DROP
#下面設置關於服務器的包過濾規則
#由於服務器/客戶機交互是雙向的,所以不僅僅要設置數據包
#出去的規則,還要設置數據包返回的規則
#
#(1)WWW服務
#服務端口爲80,採用tcp或udp協議
#規則爲eth0=>;允許目的爲內部網WWW服務器的包
$IPT -A FORWARD -p tcp -d $WWW-SERVER-dport www -i eth0 -j ACCEPT
#
#(2)FTP服務
#服務端口爲21,數據端口20
#FTP的傳輸模式有主動和被動之分,FTP服務採用tcp協議
#規則爲:eth0=>;僅允許目的爲內部網ftp服務器的包
$IPT -A FORWARD -p tcp -d $FTP-SERVER -dport ftp -i eth0 -j ACCEPT
#
# (3)EMAIL服務
#包含兩個協議,一個是smtp,另一個是pop3
#出於安全性考慮,通常只提供對內的pop3服務
#所以在這裏我們只考慮對smtp的安全性問題
#smtp端口爲25,採用tcp協議
#規則爲etho=>;僅允許目的爲E-mail服務器的smtp請求
$IPT -A FORWARD -p tcp -d $EMAIL-SERVER-dport smtp -i eth0 -j ACCEPT
#
# 2.下面設置針對Internet客戶的過濾規則
#本例中防火牆位於網關的位置,所以主要是防止來自Internet的攻擊
#不能防止來自Intranet的攻擊
#假如網絡中的服務器都是基於Linux的,也可以在每一部服務器上設置
#相關的過濾規則來防止來自Internet的攻擊
#對於Internet對Intranet客戶的返回包,定義如下規則
#
#(1)允許Intranet客戶採用被動模式訪問Internet的FTP服務器
$IPT -A FORWARD -p tcp -s 0/0 --sport ftp-data -d $IP_RANGE -i eth0 -j ACCEPT
#
#(2)接收來自Internet的非連接請求tcp包
$IPT -A FORWARD -p tcp -d 198.168.80.0/24 ! --syn -i eth0 -j ACCEPT
#
#(3)接收所有udp包,主要是針對oicq等使用udp的服務
$IPT -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
#
#3.然後接受來自整個Intranet的數據包過濾,我們定義如下規則
$IPT -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT
#
#處理ip碎片
#接受所有的ip碎片,但採用limit匹配擴展對其單位時間可以通過的
#ip碎片數量進行限制,以防止ip碎片攻擊
$IPT -A FORWARD -f -m limit-limit 100/s-limit-burst 100 -j ACCEPT
#說明:對不管來自哪裏的ip碎片都進行限制,允許每秒通過100個ip碎片
#該限制觸發的條件是100個ip碎片
#
#設置icmp包過濾
#ipmp包通常用於網絡測試等,故允許所有的icmp包通過
#但是黑客常常採用icmp進行攻擊,如ping of death等
#所以我們採用limit匹配擴展加以限制
$IPT -A FORWARD -p icmp -m limit-limit 1/s-limit-burst 10 -j ACCEPT
#說明:對不管來自哪裏的icmp包都進行限制,允許每秒通過一個包
#該限制觸發的條件是10個包
###################END######################
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章