如何使用IPTables實(shí)現(xiàn)字符串模式匹配
iptables有許多使用的技巧,實(shí)現(xiàn)字符串模式匹配就是其中一個(gè),我來帶大家看看他是如何實(shí)現(xiàn)的!
自1995年ipfwadm開始進(jìn)入1.2.1的核心,Linux的防火墻實(shí)現(xiàn)有很長的時(shí)間了。Ipfwadm實(shí)現(xiàn)了標(biāo)準(zhǔn)的tcp/ip包過濾功能,比如過濾源地址與目的地址以及端口過濾。早在1999年第一個(gè)穩(wěn)定的2.2.0核心中防火墻的實(shí)現(xiàn)被ipchains替代了,ipchains的新功能包括支持規(guī)則鏈,碎片包控制,較好的網(wǎng)絡(luò)地址翻譯功能(NAT)以及其他一些有用的改進(jìn)。我們需要明白Linux防火墻包括核心級(jí)代碼(通常是可加載核心模塊或者核心源程序的補(bǔ)丁)和用戶級(jí)代碼(一個(gè)配置的工具,比如 /usr/bin/ipchains,這是用來插入包規(guī)則到核心空間的)因此無論如何,只要新的linux防火墻代碼被引入,核心和用戶空間的有關(guān)代碼都要改寫。
2001年2.4的核心完成了,iptables出現(xiàn)了。它引入了很多重要的改進(jìn),比如基于狀態(tài)的防火墻,基于任何 TCP標(biāo)記和MAC地址的包過濾,更靈活的配置和記錄功能,強(qiáng)大而且簡單的NAT功能和透明代理功能,通過速度限制實(shí)現(xiàn)DoS的阻止(更詳細(xì)的資料請(qǐng)參看 A Comparison of iptables Automation Tools一文)。
然而,最重要變化是引入了模塊化的架構(gòu)方式。比如,ipchains和ipfwadm兼容模式是通過一個(gè)核心模塊的設(shè)置實(shí)現(xiàn)的,該模塊能夠在運(yùn)行的核心中插入,以便提供相應(yīng)的通訊功能。在附加的變化中,用戶自定義編碼功能已經(jīng)成為了可能,比如過濾一定范圍的端口,根據(jù)TTL值和包的到達(dá)時(shí)間進(jìn)行判斷,對(duì)自定義的協(xié)議進(jìn)行狀態(tài)監(jiān)視,對(duì)隨機(jī)的數(shù)據(jù)包進(jìn)行監(jiān)視等,這些目前都還不是iptable的一部分,但是在未來將被實(shí)現(xiàn)。很多很有趣的新模塊已經(jīng)完成了。編寫一個(gè)可加載的核心模塊來創(chuàng)建核心級(jí)代碼,通過用戶級(jí)代碼實(shí)現(xiàn)控制過濾器的行為。參見Rusty Russell's Linux iptables HOWTO
本文主要關(guān)注字符串模式匹配的功能,(顯然,是通過模塊實(shí)現(xiàn)的),該功能可以限制和研究數(shù)據(jù)包的有效載荷。這是iptable技術(shù)的一個(gè)非常有意義的突破,它超越了傳統(tǒng)的包過濾防火墻的標(biāo)準(zhǔn)TCP/IP標(biāo)志監(jiān)視功能。傳統(tǒng)的防火墻可以分為包過濾和應(yīng)用代理兩種類型,應(yīng)用代理防火墻可以分別出應(yīng)用層的協(xié)議比如 telnet,HTTP或者SMTP,能夠監(jiān)視這些協(xié)議的有效載荷和檢查命令,但是應(yīng)用代理防火墻帶來了巨大的性能缺陷:當(dāng)通過網(wǎng)絡(luò)協(xié)議棧處理上層即應(yīng)用層的數(shù)據(jù)包。同時(shí)我們需要為每一個(gè)要監(jiān)控的協(xié)議編寫新的代理程序。包過濾防火墻通常只監(jiān)視源地址和目的地址,源端口和目的端口,TCP/IP標(biāo)志等,而完全忽略了高層協(xié)議的有效載荷。由于上述原因,包過濾防火墻通常比應(yīng)用代理防火墻的速度快。應(yīng)用代理提供了更加有力度的安全控制而包過濾可以用于更高的帶寬線路滿足更高的吞吐量。
基于以上的情況,iptables的新增功能提供了跨越兩種防火墻類型的優(yōu)勢,避免了各自的缺陷,這個(gè)功能同時(shí)非常清晰的證明了新的模塊化的架構(gòu)較之老的ipchains的優(yōu)勢,它能夠使得iptables工作在網(wǎng)絡(luò)層(OSI模型的第三層)不必工作在高層協(xié)議,但是卻可以監(jiān)視高層協(xié)議的有效載荷,而不必分析應(yīng)用層的通信結(jié)構(gòu)。
在2001年5月以前,還沒有提出字符串模式匹配模塊以前。有一個(gè)嘗試添加內(nèi)容監(jiān)控的能力給iptables防火墻的工程:Hogwash。該工程結(jié)合了Snort IDS規(guī)則模式匹配引擎,以便于iptable能夠響應(yīng)帶有攻擊信號(hào)的數(shù)據(jù)包。
現(xiàn)在我們提供了一個(gè)Step-By-Step的指導(dǎo),以便于在RedHat Linux上實(shí)現(xiàn)模式匹配的包監(jiān)視功能。標(biāo)準(zhǔn)的RH7.2提供了iptables 1.2.3的版本以及1.2.4的可用RPM升級(jí)包。然而,模式匹配功能沒有被包含在標(biāo)準(zhǔn)的發(fā)行版中,因?yàn)殚_發(fā)人員將它標(biāo)記為試驗(yàn)。
如果你使用的是RH7.1-7.2,你就已經(jīng)使用了2.4的核心。你至少需要2.4.4的核心以便能夠使用iptables 1.2.4的功能。通常推薦你從發(fā)行商那里下載最新的可用的核心。目前,有一個(gè)例外:iptables-1.2.4的字符串模式匹配補(bǔ)丁不能在2.4.9 的核心下工作。你應(yīng)該安裝核心的源碼RPM包(通常被放在/usr/src/linux-2.4.x的源碼樹內(nèi))或者從別處下載的核心源程序(比如 www.kernel.org或者它的一個(gè)鏡像)。
在本文中,將采用最新的2.4.16核心作為例子。測試也能運(yùn)行在使用2.4.7核心的RedHat 7.2上,但是2.4.7的核心并不推薦使用,因?yàn)?.4.7的核心有一些小的安全問題,比如SYN-cookie保護(hù)和iptables的保存/恢復(fù)功能。
接下來需要從http://netfilter.samba.org/iptables-1.2.4.tar.bz2下載iptables。當(dāng)對(duì)壓縮文件進(jìn)行解壓縮之后,需要對(duì)iptables進(jìn)行配置,合并相關(guān)的核心源程序樹??梢允褂冒胱詣?dòng)化的程序來完成這個(gè)目的。首先,可能需要運(yùn)行程序以便包含已經(jīng)考慮過的穩(wěn)定的iptables補(bǔ)丁,但是這個(gè)補(bǔ)丁沒有被包含在kernel的發(fā)行版內(nèi)。從iptables的解壓目錄(在本例中iptables在 /home/anton/iptables-1.2.4,核心源程序在/usr/src/linux-2.4.16)運(yùn)行:
make pending-patches KERNEL_DIR=/usr/src/linux-2.4.16
這將開始運(yùn)行交互式的補(bǔ)丁應(yīng)用程序,雖然你可以安全應(yīng)用所有的補(bǔ)丁,但是沒有一個(gè)補(bǔ)丁是iptables的字符串匹配所必需的。對(duì)任何你認(rèn)為需要的補(bǔ)丁都回答y(yes)。如果你希望能夠安全的使用iptables,則選擇none。
現(xiàn)在我們將準(zhǔn)備應(yīng)用試驗(yàn)部分的補(bǔ)丁,比如字符串模式匹配的支持。運(yùn)行:
make patch-o-matic KERNEL_DIR=/usr/src/linux-2.4.16
在這個(gè)交互式的過程中,回答y(yes)以便應(yīng)用string.patch。程序?qū)⒈闅v所有的可用的補(bǔ)丁,包括那些穩(wěn)定的。
Testing... string.patch NOT APPLIED ( 2 missing files)
The string patch:
Author: Emmanuel Roger
Status: Working, not with kernel 2.4.9
This patch adds CONFIG_IP_NF_MATCH_STRING which allows you to
match a string in a whole packet.
THIS PATCH DOES NOT WORK WITH KERNEL 2.4.9 !
Do you want to apply this patch [N/y/t/f/q/?] y
其余的補(bǔ)丁也許也讓你非常感興趣,不過它們與本文并不相關(guān)。如果你選擇安裝任何別的補(bǔ)丁,請(qǐng)注意開發(fā)者給出的警告信息,其中包括了補(bǔ)丁的功能(比如dropped表的補(bǔ)丁)確定你沒有安裝MAC過濾的補(bǔ)丁,因?yàn)樽罱l(fā)現(xiàn)這個(gè)補(bǔ)丁包含一個(gè)漏洞。
現(xiàn)在我們開始編譯用戶空間程序和相關(guān)的Libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
然后我們安裝它們(iptables在/usr/local/user/sbin,libraries在/usr/local/lib/iptables)在root身份下執(zhí)行以下內(nèi)容:
make install KERNEL_DIR=/usr/src/linux-2.4.16
緊接著我們配置和編譯核心:
Now we are ready to compile the user-space code and the libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
and then install them (iptables program goes in /usr/local/user/sbin and libraries go into /usr/local/lib/iptables). As root:
cd /usr/src/linux-2.4.16
可以使用任何的核心配置方法。有關(guān)詳細(xì)的配置核心的方法,可以查閱Internet資源,Internet上有大量的這方面的文檔,比如kernel HOWTO等。以下簡要介紹一下:
make xconfig
在GUI界面下,選擇Netfilter配置選項(xiàng),然后在Strings match support前選擇m(模塊支持)
然后執(zhí)行通常的操作:
make dep;make bzImage;make modules;make modules_install
現(xiàn)在按照你喜歡的方式安裝核心,并重新啟動(dòng)。重新啟動(dòng)系統(tǒng)以后,測試一下iptables是否支持模式匹配功能,在root身份下執(zhí)行:
/usr/local/sbin/iptables -m string -help
該命令將顯示如下標(biāo)準(zhǔn)的iptables幫助信息:
STRING match v1.2.4 options:
--string [!] string Match a string in a packet
該功能允許你對(duì)匹配數(shù)據(jù)包的內(nèi)容,我們可以通過netcat或者telnet來測試這一功能,從而確定我們確實(shí)可以獲得數(shù)據(jù)包的內(nèi)容。
運(yùn)行:
iptables -A INPUT -m string --string "test" -j LOG --log-level
info --log-prefix "TEST"
然后啟動(dòng)一個(gè)netcat的服務(wù)器:
nc -l -p 3456
然后連接該netcat服務(wù)器:
telnet localhost 3456
然后輸入:
test
whatevertestdoes
這樣將引起iptables產(chǎn)生一個(gè)簡單的記錄,我們?cè)谟涗浳募袑?huì)看到如下的信息(當(dāng)然你需要設(shè)置了記錄信息的級(jí)別為info)
Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00
SRC=127.0.0.1 DST=127.0.0.1 LEN=2154 TOS=0x00 PREC=0x00 TTL=64
ID=42880 DF PROTO=TCP SPT=3128 DPT=33018 WINDOW=32767 RES=0x00 ACK PSH URGP=0
Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00
SRC=127.0.0.1 DST=127.0.0.1LEN=1830 TOS=0x00 PREC=0x00 TTL=64
ID=17451 DF PROTO=TCP SPT=8000 DPT=33017 WINDOW=32767 RES=0x00 ACK PSH URGP=0
在tcp/ip數(shù)據(jù)包中只要出現(xiàn)test字符串,以上的信息就會(huì)產(chǎn)生。這有什么好處呢?太多了。正如 Filtering packets based on string matching這篇文章所建議的那樣,該文章可以在linuxguru.net的sysctl內(nèi)找到。它能夠用來阻止那些討厭的IIS蠕蟲造成得 Unix web服務(wù)器記錄文件記錄大量的對(duì)cmd.exe的請(qǐng)求,這些蠕蟲將不再干擾你,但是如果你的/var分區(qū)(通常是記錄文件存放的分區(qū))不夠大,那么這一功能將有一定的幫助。只要靜靜地丟棄蠕蟲對(duì)80端口的請(qǐng)求或者使用記錄限制功能,對(duì)這些信息進(jìn)行記錄,丟棄這些包的操作如下:
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"
每小時(shí)只記錄一條這樣的信息:
iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -m limit
--limit 1/hour
Bill Steams(Mason firewall building script的作者)提供了一個(gè)極好的建議----轉(zhuǎn)換網(wǎng)絡(luò)IDS Snort的規(guī)則成為iptables字符串模式匹配的規(guī)則。Snort的攻擊信號(hào)數(shù)據(jù)庫中包含了大約1200種信號(hào)and appears to be the biggest publicly available attack database suitable for instant deployment。在iptables上使用現(xiàn)成的信號(hào)是合理的一種方式。http: //www.strearns.org/snort2iptables 是Bill Stearm提供的試驗(yàn)性的軟件。在這里你可以找到shell腳本以便將標(biāo)準(zhǔn)的Snort規(guī)則轉(zhuǎn)換為iptables的規(guī)則。下面是一個(gè)將snort關(guān)于 Linux下針對(duì)mountd的攻擊和bind的攻擊轉(zhuǎn)化為iptables的規(guī)則的例子:
Snort規(guī)則:
1、alert udp $EXTERNAL_NET any -> $HOME_NET 518
(msg:"EXPLOIT ntalkd x86 linux overflow";
content:"|0103 0000 000 0 0001 0002 02e8|";
reference:bugtraq,210; classtype:attempted-admin; sid:313; rev:2;)
2、alert tcp $EXTERNAL_NET any -> $HOME_NET 53
(msg:"EXPLOIT named tsig infoleak";
content: "|AB CD 09 80 00 00 00 01 00 00 00 00 00 00 01 00 01 20 20 20 20 02 61|";
reference:cve,CAN-2000-0010; reference:bugtraq,2302; reference:arachnids,482;
classtype:attempted-admin; sid:303; rev:3;)
3、alert udp $EXTERNAL_NET any -> $HOME_NET 635
(msg:"EXPLOIT x86 linux mountd overflow";
content:"|5eb0 0289 06fe c889 4604 b006 8946|";
reference:cve,CVE-1999-0002; classtype:attempted-admin; sid:315; rev:1;)
轉(zhuǎn)化的iptables規(guī)則:
1、iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 518 -m
string --string " è" -j LOG --log-prefix "SID313 " # "EXPLOIT ntalkd x86
linux overflow" bugtraq,210 classtype:
attempted-admin sid:313
2、iptables -A SnortRules -p tcp -s $EXTERNAL_NET -d $HOME_NET --dport 53 -m
string --string "«Í .a" -j LOG --log-prefix "
SID303 " # "EXPLOIT named tsig infoleak" cve,CAN-2000-0010 bugtraq,2302
arachnids,482 classtype:attempted-admin sid:303
3、iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 635 -m
string --string "^° ‰ þȉF ° ‰F" -j LOG --log-prefix " cve-CVE-1999-0002
" # "EXPLOIT x86 linux mountd overflow" classtype:attempted-admin sid:315
顯而易見,上面的轉(zhuǎn)化使用了針對(duì)漏洞所使用的緩沖區(qū)溢出字符串作為捕獲攻擊的方式,有些規(guī)則不便于轉(zhuǎn)化主要是因?yàn)樵跇E的控制方面snort比iptables要強(qiáng)大一點(diǎn)。
總之,iptables的字符串模式匹配功能能夠被用來保護(hù)那些開放了易受攻擊的而一般的包過濾又無法保護(hù)的網(wǎng)絡(luò)服務(wù)(如WWW服務(wù),mail服務(wù), DNS服務(wù),F(xiàn)TP服務(wù)等)的組織的網(wǎng)絡(luò)(如果將它布置在組織的網(wǎng)關(guān)上)和單個(gè)的主機(jī)(使iptables成為主機(jī)的一部分),另外,iptables的字符串模式匹配功能還能夠幫助實(shí)現(xiàn)強(qiáng)制安全策略,即通過關(guān)鍵字來阻止訪問非法的內(nèi)容。
通過正文,我們知道了如何用iptables實(shí)現(xiàn)字符串模式匹配,看起來復(fù)雜,慢慢來,和朋友一起動(dòng)手吧!
【編輯推薦】
- iptables相關(guān)腳本
- 如何使用 IPTables
- 如何用iptables實(shí)現(xiàn)NAT
- iptables配置工具
- iptables與stun
- iptables 添加模塊HOWTO
- netfilter/iptables模塊功能介紹
- iptables 源碼分析
- iptables 總結(jié)與應(yīng)用心得