深入淺出Netfilter/iptables防火墻框架(入門篇)
原創(chuàng)【51CTO獨(dú)家特稿】Linux系統(tǒng)管理員們都接觸過Netfilter/iptables,這是Linux系統(tǒng)自帶的免費(fèi)防火墻,功能十分強(qiáng)大。在這個(gè)《深入淺出Netfilter/iptables防火墻框架》系列中,51CTO安全/Linux專家李洋將對(duì)Netfilter/iptables進(jìn)行詳盡的、條理的介紹。上一篇(基礎(chǔ)篇)介紹了netfilter/iptables的原理,本文是入門篇,介紹Netfilter/iptables框架的安裝、啟動(dòng)和簡(jiǎn)單應(yīng)用。
1、安裝和啟動(dòng)Netfilter/iptables系統(tǒng)
因?yàn)镹etfilter/iptables的netfilter組件是與內(nèi)核2.4.x集成在一起的,高版本的Linux都配備了netfilter這個(gè)內(nèi)核工具,所以一般不須要下載,而只要下載并安裝iptables用戶空間工具的源代碼包:http://www.netfilter.org/projects/iptables/downloads.html。目前,最新源代碼安裝包是:iptables-1.4.10.tar.bz2。
在開始安裝iptables用戶空間工具之前,要對(duì)系統(tǒng)做某些修改,主要有如下選項(xiàng)須要配置修改:
- CONFIG_PACKET:如果要使應(yīng)用程序和程序直接使用某些網(wǎng)絡(luò)設(shè)備,那么這個(gè)選項(xiàng)是有用的。
- CONFIG_IP_NF_MATCH_STATE:如果要配置有狀態(tài)的防火墻,那么這個(gè)選項(xiàng)非常重要而且很有用。這類防火墻會(huì)記得先前關(guān)于信息包過濾所做的決定,并根據(jù)它們做出新的決定。
- CONFIG_IP_NF_FILTER:這個(gè)選項(xiàng)提供一個(gè)基本的信息包過濾框架。如果打開這個(gè)選項(xiàng),則會(huì)將一個(gè)基本過濾表(帶有內(nèi)置的INPUT、FORWARD和OUTPUT鏈)添加到內(nèi)核空間。
- CONFIG_IP_NF_TARGET_REJECT:這個(gè)選項(xiàng)允許指定:應(yīng)該發(fā)送ICMP錯(cuò)誤消息來響應(yīng)已被DROP掉的入站信息包,而不是簡(jiǎn)單地殺死這些信息包。
安裝源代碼包:
//將源代碼文件解壓縮 #bzip2 -d iptables-1.4.10-tar.bz2 #tar -xvf iptables 1.4.10.tar //切換目錄 #cd iptables 1.4.10 //編譯該工具,指定編譯的內(nèi)核目錄為/usr/src/linux-2.6.4-8 #make KERNEL_DIR=/usr/src/linux-2.4.16-8 //執(zhí)行make install命令,同樣設(shè)定內(nèi)核目錄為/usr/src/linux-2.6.4-8 #make install KERNEL_DIR=/usr/src/linux-2.6.4-8
安裝完成后,就可以啟動(dòng)防火墻了:
//使用service命令手工啟動(dòng) # service iptables start
如果想要在系統(tǒng)啟動(dòng)的時(shí)候也啟動(dòng)該防火墻服務(wù),那么可以使用setup命令,然后進(jìn)入System service選項(xiàng),選擇iptables守護(hù)進(jìn)程即可。
2、 Iptables簡(jiǎn)單應(yīng)用
1) 基本規(guī)則應(yīng)用
下面將給出運(yùn)用上述框架理論形成規(guī)則的一些簡(jiǎn)單示例,以供讀者在實(shí)際的應(yīng)用過程中進(jìn)行模仿和使用:
(1)接受來自指定IP地址的所有流入的數(shù)據(jù)包:
#iptables -A INPUT -s 203.159.0.10 -j ACCEPT
(2)只接受來自指定端口(服務(wù))的數(shù)據(jù)包:
#iptables -D INPUT --dport 80 -j DROP
(3)允許轉(zhuǎn)發(fā)所有到本地(198.168.10.13)smtp服務(wù)器的數(shù)據(jù)包:
#iptables -A FORWARD -p tcp -d 198.168.10.13 --dport smtp -i eth0 -j ACCEPT
(4)允許轉(zhuǎn)發(fā)所有到本地的udp數(shù)據(jù)包(諸如即時(shí)通信等軟件產(chǎn)生的數(shù)據(jù)包):
#iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
(5)拒絕發(fā)往WWW服務(wù)器的客戶端的請(qǐng)求數(shù)據(jù)包:
#iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j REJECT
(6)允許目的為指定端口的tcp數(shù)據(jù)包進(jìn)入:
#iptables -A INPUT -p tcp -m multiport --destination-port 21,53,80,25,110 ACCEPT
(7)允許來源為指定端口的tcp數(shù)據(jù)包進(jìn)入:
#iptables -A INPUT -p tcp -m multiport --source-port 21,53,80,25,110 ACCEPT
(8)丟掉SYN和ACK標(biāo)志位置位的數(shù)據(jù)包:
#iptables -A INPUT-p tcp --tcp-flags ALL SYN,ACK DROP
2) 碎片檢測(cè)及流量控制
(1)檢查IP碎片:在TCP/IP網(wǎng)絡(luò)中,鏈路層具有最大傳輸單元MTU這個(gè)特性,它限制了數(shù)據(jù)幀的最大長度,不同的網(wǎng)絡(luò)類型都有一個(gè)上限值。以太網(wǎng)的MTU是1500。如果IP層有數(shù)據(jù)包要傳,而且數(shù)據(jù)包的長度超過了MTU,那么IP層就要對(duì)數(shù)據(jù)包進(jìn)行分片(fragmentation)操作,使每一片的長度都小于或等于MTU,這些被分段的片段就成為IP碎片。那么,如果在防火墻處不對(duì)IP碎片進(jìn)行特別處理的話,那么有可能部分IP碎片會(huì)被防火墻攔截,從而影響到接受端對(duì)這些碎片的還原,并最終影響到信息的完整性和可用性問題,所以,下面的例子給出防火墻允許IP碎片通過的規(guī)則:
#iptables -A FORWARD -p tcp -f -s 172.168.96.0/24 -d 172.168.97.18 -j ACCEPT
需要特別留意上述規(guī)則中的-f選項(xiàng),它指定了第二個(gè)以及以后的IP碎片將由防火墻來處理通過,否則的話,考慮下面的規(guī)則,防火墻有可能對(duì)其第二個(gè)及其以后的IP碎片進(jìn)行攔截,從而影響正常的信息流通:
#iptables -A FORWARD -p tcp -s 172.168.96.0/24 -d 172.168.97.18 -j ACCEPT
(2)速率限制:iptables提供了非常健全的速率控制機(jī)制,主要用來限制由外向內(nèi)的單位時(shí)間內(nèi)通過的數(shù)據(jù)包個(gè)數(shù),這樣做的一個(gè)直接的好處就是盡可能地抑制前面多次提到的拒絕服務(wù)攻擊或者是分布式拒絕服務(wù)攻擊,因?yàn)檫@兩種攻擊的一個(gè)非常典型的表現(xiàn)就是單位時(shí)間內(nèi)有很多數(shù)據(jù)包涌向目的地。所以,我們可以使用下面的規(guī)則來限制單位時(shí)間內(nèi)允許通過防火墻,從而進(jìn)入被保護(hù)網(wǎng)絡(luò)的數(shù)據(jù)包個(gè)數(shù):
#iptables -A INPUT -m limit --limit 200/second #iptables -A INPUT -m limit --limit 10000/minute
上述兩條規(guī)則分別限制1秒內(nèi)和1分鐘內(nèi)通過的數(shù)據(jù)包個(gè)數(shù)不能超過200和10000個(gè)。當(dāng)然,在實(shí)際應(yīng)用中,也可以通過/second、/minute、、/hour、/day這樣的時(shí)間間隔來進(jìn)行設(shè)定,并且,其中諸如200和10000這些具體數(shù)值的設(shè)定需要用戶根據(jù)具體情況和經(jīng)驗(yàn)來進(jìn)行設(shè)定,沒有規(guī)定的數(shù)值可循。
另外,在設(shè)定速率限制后,還可以設(shè)定超過該限制所觸發(fā)的一些處理事件,比如說直接丟棄。下面的規(guī)則表示當(dāng)速率超過200限制后,將直接對(duì)后續(xù)數(shù)據(jù)包進(jìn)行丟棄:
#iptables -A INPUT -m limit --limit-burst 200
【編輯推薦】