原作者:Anton Chuvakin 在過去幾年中,Linux作為防火牆平台的應用顯著增長。從早期1.2版內核的ipfwadm開始,Linux的防火牆代碼也走過了很長一段路程了。在2.4版的Linux內核中,使用了netfilter體系。在最新的2.4版中,Linux大大加強了安全性,例如:更好的加密支持和netfilter體系的使用。netfilter具有完全的向後兼容性。 本文將對iptables的配置做一個綜述並且重點介紹一些iptables的配置工具。本文的討論將著眼於Linux內核的IP防火牆以及其各種界面的配置工具,比如:GUI或者腳本(shell、Perl或者特定的配置語言)。使用這些工具能夠簡化iptables的配置減少配置的錯誤。關於iptables的知識請參考Rusty Russell寫的Linux iptables HOWTO。 使用命令行配置iptables的困難 使用iptables的命令行接口來配置iptables防火牆對一個人來說是一個挑戰,用戶很難指定所有IP報文的行為。用戶需要對TCP/IP和應用層協議有較深的了解。象其前輩ipchains一樣,iptables把IP過濾規則歸並到鏈中,IP報文遍歷規則鏈接受處理,還可以送到另外的鏈接受處理,或者最後由默認策略(ACCEPT、DROP、REJECT)處理。有些網絡應用程序比其它一些程序更容易穿過防火牆,因此需要理解網絡連接的建立和斷開。 我們看一下POP3協議,這是最簡單的協議之一。允許所有向內目標端口是110的報文通過通過無法解決所有的管理問題,因為這樣只能使客戶端向發出申請,而服務器卻無法應答。另外,如果使用網絡地址轉換(NAT)和其它方式的報文轉發,也存在許多問題。因為防火牆的配置將影響到整個企業的安全,所以應該特別小心。下面將大概地討論iptables的配置,要獲得更多細節請參考Linux iptables HOWTO iptables的命令行選項 在進入這時的討論之前,我們看一下iptables命令行選項的一個總結。 規則鏈維護選項 1.建立新的規則鏈(-N) 2.刪除一個空的規則鏈(-X) 3.改變一個內置規則鏈的策略(-P) 4.列出一條規則鏈中的規則(-L) 5.擦寫一條規則鏈中的規則(-F) 規則維護 1.在一條規則鏈中加入一條新的規則(-A) 2.刪除一條規則鏈中某個位置的規則(-D) iptables的優點 在討論各種iptables配置工具之前,讓我們看一下iptables的優點,尤其是netfilter比ipchains具有的優勢。 iptables允許建立狀態(stateful)防火牆,就是在內存中保存穿過防火牆的每條連接。這種模式對於有效地配置FTP和DNS以及其它網絡服務是必要的。 iptables能夠過濾TCP標志任意組合報文,還能夠過濾MAC地址。 系統日志比ipchains更容易配置,擴展性也更好。 對於網絡地址轉換(Network Address Translation)和透明代理的支持,netfilter更為強大和易於使用。 iptable能夠阻止某些DOS攻擊,例如SYS洪泛攻擊。 iptables配置工具 現在,我們看一下Linux iptables的一些配置工具。我主要關注每個工具的特征、彈性和易用性。我們將討論以下的工具: MonMotha's Firewall 2.3.5 作者:MonMotha Firewallscript (iptables 4.4c-3 devel) 作者:Patrik Hildingsson Ferm-0.0.18 作者:Auke Kok AGT-0.83 作者:Andy Gilligan Knetfilter-1.2.4 作者:Luigi Genoni gShield-2.0.2 作者:R. Gregory MonMotha的Firewall 2.3.5 MonMotha寫的Firewall 2.3.5是一個大約30K的shell腳本。目前,主要適用於基於主機的保護,因為一些基於網絡的選項正在開發中。這個腳本的界面(例如:給iptables傳遞配置選項的方法)有點混亂。不過,它不需要配置文件而且安裝容易,直接復制到任何地方都可以。默認情況下,它根本不做什麼,實際上根本就不執行,也缺少文檔。這個腳本對於撥號用戶可能有點用處。 Firewallscript Firewallscript(IFS 4.4d)也是一個bash腳本,大約有85K。這個腳本可以用於基於主機和網絡的防護。首次運行時,它會直接產生一個配置文件。不過,在默認情況下,這個文件不起什麼作用,只有測試作用。這個腳本可以配置NAT和地址偽裝。這個腳本非常復雜,但是缺少文檔,因此最好能夠仔細閱讀它的代碼,使用iptables -L命令哪個鏈已經生效,什麼被允許/拒絕。這個腳本的IP報文追蹤功能還可以為你提供娛樂。此外,它還會自動探測、加載iptables需要的內核模塊。這個腳本和上一個腳本還具有取消(undo)功能,能夠恢復iptables原來的配置文件。 Ferm Ferm是一個Perl腳本,使用一種類C語言寫成的配置文件。這種語言非常容易閱讀和理解。這個腳本有很好的文檔和豐富的示例作為參考。 這是一個例子: ----------------------------------------------------------------------------- # simple workstation example for ferm chain input { if ppp0 # put your outside interface here { proto tcp goto fw_tcp; proto udp goto fw_udp; proto icmp goto fw_icmp; } } chain fw_tcp proto tcp { dport ssh ACCEPT; syn DENY log; dport domain ACCEPT; dport 0:1023 DENY log; } chain fw_udp proto udp { DENY log; } chain fw_icmp proto icmp { icmptype ( destination-unreachable time-exceeded ) ACCEPT; DENY log; } ----------------------------------------------------------------------------- 這個配置文件將使ferm產生iptables如下規則:允許向外的ssh和DNS報文通過;阻塞所有的UDP報文;只允許兩種類型的ICMP消息通過:目的不可達和超時,並絕拒絕和日志其它類型的ICMP消息。 AGT AGT是一個使用C語言編寫的程序。從它的代碼來看,目前還處於開發階段。不支持automake,需要手工編輯Makefile文件,文檔也不是很豐富,但是其配置文件非常簡單。下面就是一個配置文件: NEW FROM-INT NEW RESET FROM-INT icmp ACCEPT FROM-INT tcp ACCEPT pop3 FROM-INT tcp ACCEPT imap RESET tcp REJECT --reject-with tcp-reset 這樣的文件格式,加上缺乏必要的文檔,對使用者來說是一個很大的挑戰。而且最好多花些時間學學iptables。 knetfilter knetfilter是一個非常棒的圖形化iptables配置工具,它是基於KDE的(有KDE1和KDE2兩個版本)。knetfilter非常易於上手,你可以很容易地使用它來配置基於主機保護的規則和規則列表;保存和恢復測這些規則和規則列表;測試規則和規則列表(在同一個面板上運行tcpdump網絡嗅探器),這一切只要點幾下鼠標就可以了。它也支持NAT和網絡地址偽裝的配置。但是,對於撥號工作站,knetfilter工作的不太好,因為它需要本地IP,而且只探測eth0網絡接口,不進行PPP探測。這個工程的文檔也很少,不過因為是基於圖形界面,所以即使不用手冊也可以很好地使用。 gShield gShield是一個bash shell腳本,可能是當前最成熟的一個工具。它的文檔非常豐富,配置文件也比較合理直觀,還能夠設置NAT。它不但能夠處靜態IP地址,還能夠處理動態IP地址(例如:PPP)。 gShield還有圖形界面,目前仍然處於早期開發階段,可以從http://members.home.com/vhodges/gshieldconf.Html下載。不過,它似乎只兼容gShield的早期版本(1.x)。 下面是一個示例配置文件: FW_ROOT="/etc/firewall" IPTABLES=`which iptables` LOCALIF="eth0" DNS="24.31.195.65" LTIME="20/m" ALLOW_DHCP_LEASES="YES" ... gShield使用的默認配置非常安全,特別適合不願意擺弄配置文件的用戶,不過軟件的編者建議用戶最好能夠通讀整個配置文件。據README文件講,gShield實現了"類tcpwrapper風格的服務訪問控制功能",使用這個功能用戶可以很容易地阻塞/允許某項服務,而不必考慮報文方向之類的問題,只要關心什麼客戶連接到服務器就可以了。 結論 雖然本文介紹了一些防火牆配置工具,但是實際上目前還沒有理想的配置工具。最好的配置工具還是iptables命令,這裡介紹的這些工具,只適用於對於使用iptables命令行感覺困難的用戶。 聲明:如果您認為這篇文章有點轉載的價值,那麼在轉載時請注明文章的出處和作者(包括譯者)。請不要拿出: lion蠕蟲分析 作者:Max Vision 作為自己沒有侵犯版權的依據,因為Max Vision是美國人,他不會自己用漢語寫一篇分析lion蠕蟲的文章,雖然lion蠕蟲是中國人寫的。(讀到這裡,您可能會感到莫名其妙,已經抄起雞蛋、西紅柿了,但是請相信:我沒有發燒,絕對是有感而發,通過這種方式表達自己的憤怒而已)。'