隨筆-200  評(píng)論-148  文章-15  trackbacks-0

          ?——NETFILTER/IPTABLES手冊(cè)
          [文檔編號(hào) SS-ver001]
          上海
          電話:13817668606
          聯(lián)系方式:little_eyes@citiz.net
          互聯(lián)網(wǎng)址:暫無

          前言
          概述
          這是一篇以介紹在Linux操作系統(tǒng)平臺(tái)上構(gòu)建防火墻系統(tǒng)(Netfilter/Iptables)為主的科技文檔,旨在幫助使用者在較短的時(shí)間內(nèi)掌握管理和配置要領(lǐng),為企業(yè)的網(wǎng)絡(luò)安全提供相關(guān)的安全保障。
          本文是《Linux安全應(yīng)用——構(gòu)建以防火墻為核心的安全管理系統(tǒng)》一文的姐妹篇,如果把那篇文章看成是What is it?那么,本文則以技術(shù)細(xì)節(jié)為主,即How to do?關(guān)于為什么要使用基于Linux操作系統(tǒng)平臺(tái)的防火墻系統(tǒng)的原因,
          本文共分為兩部分,第一部分具體介紹了Netfilter/Iptables的運(yùn)行機(jī)制和配置管理方法,這是全文中最核心的一部分。第二部分給出了一些具體的范例腳本供系統(tǒng)管理員參考。
          鑒于筆者水平有限,文中有錯(cuò)誤的地方望不吝賜教。
          適用對(duì)象
          本文首先是為各個(gè)企業(yè)的網(wǎng)絡(luò)系統(tǒng)管理員撰寫的,無論是那些已經(jīng)使用了基于Netfilter/Iptables防火墻系統(tǒng)的企業(yè),還是那些正準(zhǔn)備使用它的企業(yè),本文的內(nèi)容都非常適合為系統(tǒng)管理員們提供參考。
          對(duì)于那些Linux的個(gè)人用戶和愛好者,本文也不失為一篇相當(dāng)有價(jià)值的參考文檔,其中,相當(dāng)一部分內(nèi)容深入淺出的講解能幫助讀者很快的理解和掌握Netfilter/Iptables的精髓。
          對(duì)于希望通過本文了解Netfilter/Iptables的讀者,應(yīng)至少具備一定的Linux操作系統(tǒng)的應(yīng)用基礎(chǔ),比如文件操作、網(wǎng)絡(luò)配置操作等,當(dāng)然,如果使用者還具備一定的編譯核心的能力那是在好不過的了。
          為了更好的配置防火墻系統(tǒng),使用者除了掌握Netfilter/Iptables本身的配置管理技巧外,掌握一定的TCP/IP網(wǎng)絡(luò)知識(shí)也是必須的,比如在缺省情況下,應(yīng)該知道SMTP(Simple Mail Transfer Protocol)協(xié)議使用TCP25端口做為其對(duì)外提供服務(wù)的端口,F(xiàn)TP(File Transfer Protocol)協(xié)議在建立連接的整個(gè)過程中,會(huì)與客戶端建立兩條連接,一條是用戶傳輸數(shù)據(jù)的,另一條則是用戶控制傳輸?shù)摹?br />資源列表
          Netfilter/Iptables的官方網(wǎng)站:
          http://www.netfilter.org

          在Netfilter 的官方網(wǎng)站,用戶能夠下載Iptables的最新的源代碼,Iptables的使用說明文檔,F(xiàn)AQ和Mail List,這個(gè)站點(diǎn)是有關(guān)Netfilter/Iptables最權(quán)威、最全面的地方,在這里,你幾乎能夠找到和Netfilter/iptables相關(guān)的所有幫助和技術(shù)支持。
          術(shù)語(yǔ)
          文中包含了一些術(shù)語(yǔ),也許讀者對(duì)其中的一部分似曾相識(shí),但又并不完全理解其正確的含義,或者和其他相關(guān)安全產(chǎn)品的概念混淆了。這里有一些解釋,并說明了本文中如何使用它們。
          DNAT - Destination Network Address Translation 目的網(wǎng)絡(luò)地址轉(zhuǎn)換。 DNAT是一種改變數(shù)據(jù)包目的IP地址的技術(shù),這種技術(shù)經(jīng)常用于將內(nèi)部網(wǎng)絡(luò)(RFC1918定義的地址段)的服務(wù)器通過公有的可路由IP地址發(fā)布到 Internet上,通過對(duì)同一個(gè)IP地址分配不同的端口,來決定數(shù)據(jù)的流向。
          SNAT - Source Network Address Translation源網(wǎng)絡(luò)地址轉(zhuǎn)換。這是一種改變數(shù)據(jù)包源IP地址的技術(shù),經(jīng)常用來使多臺(tái)計(jì)算機(jī)分享一個(gè)Internet地址。這只在IPv4中使用,因?yàn)镮Pv4的地址已快用完了,IPv6將解決這個(gè)問題。IPv6使得地球上每一粒沙子大小的空間都能夠分配到一個(gè)IP地址,因此IPv6不存在地址空間短缺的問題。
          State - 狀態(tài) 指明數(shù)據(jù)包處于什么狀態(tài)。狀態(tài)在RFC 793 - Transmission Control Protocol中定義,或由用戶在Netfilter/iptables中自定義。需要注意的是Netfilter設(shè)定了一些關(guān)于連接和數(shù)據(jù)包的狀態(tài),但沒有完全使用使用RFC 793的定義。
          User space - 用戶空間,指在內(nèi)核外部或發(fā)生在內(nèi)核外部的任何東西。例如,調(diào)用 iptables -h 發(fā)生在內(nèi)核外部,但iptables -A FORWARD -p tcp -j ACCEPT(部分地)發(fā)生在內(nèi)核內(nèi)部,因?yàn)橐粭l新的規(guī)則加入了規(guī)則集。
          Kernel space - 內(nèi)核空間 ,與用戶空間相對(duì),指那些發(fā)生在內(nèi)核內(nèi)部。
          target - 這個(gè)詞在后文中有大量的應(yīng)用,它表示對(duì)匹配的數(shù)據(jù)包所做的操作,如ACCEPT、DROP、REDIRECT等等。
          約定
          本文中涉及的命令、范例都是以Redhat Linux操作系統(tǒng)平臺(tái)為基礎(chǔ)的,盡管在絕大多數(shù)的情況下,Linux的大多數(shù)命令都是獨(dú)立于發(fā)行版本的,但每個(gè)發(fā)行版本之間或多或少的存在微小的區(qū)別。
          本文中的命令以黑體5號(hào)宋體字表示,如下例:
          #iptables-restore /etc/sysconfig/iptables
          本文中涉及到的命令、范例腳本都經(jīng)過我們的嚴(yán)格測(cè)試,能夠保證使用者按照文中介紹的做法正確配置防火墻,當(dāng)然,每一個(gè)用戶的網(wǎng)絡(luò)環(huán)境都是不一樣的,具體的配置還需要用戶根據(jù)自己的具體情況來適當(dāng)調(diào)整。
          致謝
          在撰寫本文時(shí),參考了Oskar Andreasson的《iptables tutorial 1.1.19》一文,由于本人英語(yǔ)水平有限,因此額外參考了中國(guó)Linux公社里的Linux新鮮社員sllscn的翻譯稿,在此向他們兩人表示謝意。
          第一章 構(gòu)建Netfilter/Iptsbles防火墻系統(tǒng)
          1.1 獲取iptables
          iptables可以從http://www.netfilter.org下載,該網(wǎng)站是netfilter/iptables最專業(yè)的網(wǎng)站,由Harald Welte、Jozsef Kadlecsik、Martin Josefsson、Patrick McHardy等核心成員進(jìn)行維護(hù),此外,還有眾多的iptables的使用者和開發(fā)者為網(wǎng)站提供了大量的文檔和更新代碼。
          1.2 編譯內(nèi)核
          在一般情況下,我們采用的Linux的distribution比如Redhat都會(huì)幫我們安裝好Iptables,而且netfilter的核心層也被以模塊(Modules)的方式編譯進(jìn)了核心,所以,在絕大多數(shù)的情況下,我們是不需要對(duì)核心進(jìn)行重新編譯的。
          當(dāng)然,我們寫這篇文檔的用意決不僅限于教會(huì)用戶使用幾個(gè)命令來管理iptables,所以,我們還是來描述一下如何編譯核心以使Linux在核心層能夠支持?jǐn)?shù)據(jù)包過濾。
          編譯核心的準(zhǔn)備工作當(dāng)然是必需有Linux Kernel的源代碼,在源代碼文件的目錄/usr/src/linux-2.4(這個(gè)目錄一般是個(gè)鏈接文件)中輸入:
          #make menuconfig
          會(huì)出現(xiàn)如下的畫面:

          在圖中高亮顯示的地方回車進(jìn)入Networking options的核心配置頁(yè)面,

          將高亮顯示的部分編譯進(jìn)核心,在該配置頁(yè)面內(nèi),還有一處需要注意,就是Netfilter Configuration的配置頁(yè)面,在該處回車即可進(jìn)入配置界面:

          從圖中可以看到,左面尖括號(hào)內(nèi)的“M”代表該選項(xiàng)被編譯成核心模塊,僅在系統(tǒng)需要時(shí)才被裝載入核心空間,由于模塊化的核心是不占用核心本身的空間的,因此,對(duì)于這些選項(xiàng),除非肯定不會(huì)用到的以外,其他的都可以選擇編譯成核心模塊,但有些是必須的,如
          Connection tracking——用于支持狀態(tài)鏈接跟蹤功能
          FTP protocol support——用于支持對(duì)Ftp協(xié)議的連接跟蹤機(jī)制
          IP tables support——用于支持包過濾
          Connection state match support——用戶支持連接狀態(tài)匹配
          MASQUERADE target support——支持地址偽裝功能
          Multiport match support——支持多端口匹配,這對(duì)于設(shè)置過濾規(guī)則非常有好處
          REDIRECT target support——如果你想使用iptables將特定的流量交給特定的代理程序如squid來處理,這個(gè)選項(xiàng)需要被編譯進(jìn)核心模塊
          這些選項(xiàng)選擇完成后,按照核心編譯的方法對(duì)配置好的核心進(jìn)行編譯即可:
          #make dep
          #make bzImage
          #make install
          #make modules
          #make modules_install
          1.3 iptables的編譯和安裝
          就象我們?cè)谏瞎?jié)中說到的一樣,如果采用諸如Redhat之類的Linux Distribution,在安裝系統(tǒng)時(shí),Iptables已經(jīng)被做為缺省的軟件安裝到系統(tǒng)上了,用戶不需要另行安裝,如果用戶需要另外安裝新版本的iptables軟件,可以到http://www.netfilter.org的網(wǎng)站下...本是1.2.9。
          從網(wǎng)站上下載的源代碼是“tar.bz2”格式的,編譯源代碼的第一步工作是解壓縮,命令如下:
          #/bin/tar xjvf iptables-1.2.9.tar.bz2
          解壓縮后,進(jìn)入源代碼的安裝目錄,開始編譯:
          #make KERNEL_DIR=/usr/src/linux/
          如果一切正常,那么iptables應(yīng)該編譯好了,接下來可以進(jìn)行安裝了,安裝命令非常簡(jiǎn)單:
          #make install KERNEL_DIR=/usr/src/linux/
          怎么樣?簡(jiǎn)單吧,當(dāng)然,如果這時(shí)您的系統(tǒng)核心還沒有將netfilter/iptables編譯進(jìn)去,那么安裝了iptables軟件是沒有多大意義的。
          1.4 iptables的啟動(dòng)和關(guān)閉
          在Redhat Linux上,由于歷史的原因,ipchains和iptables是并存的(ipchains是在kerenl版本2.4.x以前的包過濾防火墻系統(tǒng)),因此ipchains和iptables同時(shí)運(yùn)行是不允許的,我們首先要將ipchains的服務(wù)停掉:
          #/sbin/chkconfig –level 123456 ipchains off
          #/sbin/service ipchains stop
          當(dāng)然,既然不使用ipchains了,我們也可以將ipchains從系統(tǒng)中移除,使用命令:
          #rpm –e ipchains
          第二步是啟動(dòng)Iptables的服務(wù)
          #/sbin/chkconfig –level 345 iptables on
          #/sbin/service iptables start
          chkconfig命令表示在系統(tǒng)啟動(dòng)時(shí),ipchains或iptables在相應(yīng)啟動(dòng)級(jí)別的缺省設(shè)置,如果是off,則代表系統(tǒng)啟動(dòng)時(shí)不啟動(dòng)ipchains或iptables服務(wù)。反之,則啟動(dòng)。
          1.5 iptables的工作原理和基礎(chǔ)架構(gòu)
          iptables 被分為兩部分,一部分被稱為核心空間,另一部分稱為用戶空間,在核心空間,iptables從底層實(shí)現(xiàn)了數(shù)據(jù)包過濾的各種功能,比如NAT、狀態(tài)檢測(cè)以及高級(jí)的數(shù)據(jù)包的匹配策略等,在用戶空間,iptables為用戶提供了控制核心空間工作狀態(tài)的命令集。無論如何,一個(gè)數(shù)據(jù)包都會(huì)經(jīng)過下圖所示的路徑,并在其中的任何一條路徑中被處理。
          首先,當(dāng)一個(gè)包進(jìn)來的時(shí)候,也就是從以太網(wǎng)卡進(jìn)入防火墻,內(nèi)核首先根據(jù)路由表決定包的目標(biāo)。如果目標(biāo)主機(jī)就是本機(jī),則如下圖直接進(jìn)入INPUT鏈,再由本地正在等待該包的進(jìn)程接收,否則,如果從以太網(wǎng)卡進(jìn)來的包目標(biāo)不是本機(jī),再看是否內(nèi)核允許轉(zhuǎn)發(fā)包(可用 echo 1 > /proc/sys/net/ipv4/ip_forward 打開轉(zhuǎn)發(fā)功能如果不允許轉(zhuǎn)發(fā),則包被DROP掉,如果允許轉(zhuǎn)發(fā),則送出本機(jī),這當(dāng)中決不經(jīng)過INPUT或者OUTPUT鏈,因?yàn)槁酚珊蟮哪繕?biāo)不是本機(jī),只被轉(zhuǎn)發(fā)規(guī)則應(yīng)用,最后,該linux防火墻主機(jī)本身能夠產(chǎn)生包,這種包只經(jīng)過OUTPUT鏈被送出防火墻。

          現(xiàn)在,我們來討論為什么iptables叫iptables,這句話挺別扭是嗎?但iptables的名字起的確實(shí)如其名,我們可以叫它ip表,在iptables中共有三類表,分別是mangle、nat和filter。
          mangle表從目前來看,他的作用對(duì)于滿足常規(guī)的防火墻應(yīng)用作用不大,我們?cè)谶@里不進(jìn)行具體的描述。
          nat表的作用在于對(duì)數(shù)據(jù)包的源或目的IP地址進(jìn)行轉(zhuǎn)換,這種應(yīng)用也許只會(huì)在IPv4的網(wǎng)絡(luò)中適用,nat表又可主要分為三條鏈,如下:
          DNAT:DNAT操作主要用在這樣一種情況下,你有一個(gè)合法的IP地址,要把對(duì)防火墻的訪問重定向到其他的機(jī)子上,比如DMZ。也就是說,我們改變的是目的地址,以使包能重路由到某臺(tái)主機(jī)上。
          SNAT: SNAT改變包的源地址,這在極大程度上可以隱藏你的本地網(wǎng)絡(luò)或者DMZ等。一個(gè)很好的例子是我們知道防火墻的外部地址,但必須用這個(gè)地址替換本地網(wǎng)絡(luò)地址。有了這個(gè)操作,防火墻就能自動(dòng)地對(duì)包做SNAT,以使LAN能連接到Internet。如果使用類似 192.168.0.0/24這樣的地址,是不會(huì)從Internet得到任何回應(yīng)的。因?yàn)镽FC1918定義了這些網(wǎng)絡(luò)為私有的,只能用于LAN內(nèi)部。
          MASQUERADE: MASQUERADE的作用和SNAT完全一樣,只是計(jì)算機(jī)的負(fù)荷稍微多一點(diǎn)。因?yàn)閷?duì)每個(gè)匹配的包,MASQUERADE都要查找可用的IP地址,而不象 SNAT用的IP地址是配置好的。當(dāng)然,這也有好處,就是如果我們使用諸如PPPOE等撥號(hào)的方式連接Internet,這些地址都是由ISP的隨機(jī)分配的,這時(shí)使用MASQUERADE是非常好的一個(gè)解決方案。
          filter 表用來過濾數(shù)據(jù)包,我們可以在任何時(shí)候匹配包并過濾它們。我們就是在這里根據(jù)包的內(nèi)容對(duì)包做DROP或ACCEPT的。當(dāng)然,我們也可以預(yù)先在其他地方做些過濾,但是這個(gè)表才是設(shè)計(jì)用來過濾的。幾乎所有的target都可以在這兒使用。
          1.6 狀態(tài)機(jī)制
          狀態(tài)機(jī)制是iptables中較為特殊的一部分,這也是iptables和比較老的ipchains的一個(gè)比較大的區(qū)別之一,運(yùn)行狀態(tài)機(jī)制(連接跟蹤)的防火墻稱作帶有狀態(tài)機(jī)制的防火墻,以下簡(jiǎn)稱為狀態(tài)防火墻。狀態(tài)防火墻比非狀態(tài)防火墻要安全,因?yàn)樗试S我們編寫更嚴(yán)密的規(guī)則。
          在iptables上一共有四種狀態(tài),分別被稱為NEW、ESTABLISHED、INVALID、RELATED,這四種狀態(tài)對(duì)于TCP、UDP、ICMP三種協(xié)議均有效。下面,我們來分別闡述四種狀態(tài)的特性。
          NEW:NEW說明這個(gè)包是我們看到的第一個(gè)包。意思就是,這是conntrack模塊看到的某個(gè)連接的第一個(gè)包,它即將被匹配了。比如,我們看到一個(gè)SYN 包,是我們所留意的連接的第一個(gè)包,就要匹配它。
          ESTABLISHED: ESTABLISHED已經(jīng)注意到兩個(gè)方向上的數(shù)據(jù)傳輸,而且會(huì)繼續(xù)匹配這個(gè)連接的包。處于ESTABLISHED狀態(tài)的連接是非常容易理解的。只要發(fā)送并接到應(yīng)答,連接就是ESTABLISHED的了。一個(gè)連接要從NEW變?yōu)镋STABLISHED,只需要接到應(yīng)答包即可,不管這個(gè)包是發(fā)往防火墻的,還是要由防火墻轉(zhuǎn)發(fā)的。ICMP的錯(cuò)誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我們所發(fā)出的信息的應(yīng)答。
          RELATED: RELATED是個(gè)比較麻煩的狀態(tài)。當(dāng)一個(gè)連接和某個(gè)已處于ESTABLISHED狀態(tài)的連接有關(guān)系時(shí),就被認(rèn)為是RELATED的了。換句話說,一個(gè)連接要想是RELATED的,首先要有一個(gè)ESTABLISHED的連接。這個(gè)ESTABLISHED連接再產(chǎn)生一個(gè)主連接之外的連接,這個(gè)新的連接就是 RELATED的了,當(dāng)然前提是conntrack模塊要能理解RELATED。ftp是個(gè)很好的例子,F(xiàn)TP-data 連接就是和FTP-control有關(guān)聯(lián)的,如果沒有在iptables的策略中配置RELATED狀態(tài),F(xiàn)TP-data的連接是無法正確建立的,還有其他的例子,比如,通過IRC的DCC連接。有了這個(gè)狀態(tài),ICMP應(yīng)答、FTP傳輸、DCC等才能穿過防火墻正常工作。注意,大部分還有一些UDP協(xié)議都依賴這個(gè)機(jī)制。這些協(xié)議是很復(fù)雜的,它們把連接信息放在數(shù)據(jù)包里,并且要求這些信息能被正確理解。
          INVALID:INVALID說明數(shù)據(jù)包不能被識(shí)別屬于哪個(gè)連接或沒有任何狀態(tài)。有幾個(gè)原因可以產(chǎn)生這種情況,比如,內(nèi)存溢出,收到不知屬于哪個(gè)連接的ICMP錯(cuò)誤信息。一般地,我們DROP這個(gè)狀態(tài)的任何東西,因?yàn)榉阑饓φJ(rèn)為這是不安全的東西。
          每個(gè)狀態(tài)相對(duì)于不同的第四層協(xié)議來講,稍微有些區(qū)別,對(duì)于TCP協(xié)議來說,當(dāng)防火墻收到第一個(gè)數(shù)據(jù)包,也就是SYN報(bào)文時(shí),將該會(huì)話標(biāo)記為NEW狀態(tài),在系統(tǒng)的/proc/net/目錄下,可以查閱文件ip_conntrack,這是在內(nèi)存空間里存放防火墻當(dāng)前狀態(tài)表的臨時(shí)文件,對(duì)于NEW狀態(tài)的記錄如下:
          tcp 6 117 SYN_SENT src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 [UNREPLIED] src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
          從上面的記錄可以看出,SYN_SENT狀態(tài)被設(shè)置了,這說明連接已經(jīng)發(fā)出一個(gè)SYN包,但應(yīng)答還沒發(fā)送過來,這可從[UNREPLIED]標(biāo)志看出,當(dāng)服務(wù)器端回應(yīng)了SYN/ACK包后,狀態(tài)表改寫為:
          tcp 6 57 SYN_RECV src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
          現(xiàn)在我們已經(jīng)收到了相應(yīng)的SYN/ACK包,狀態(tài)也變?yōu)镾YN_RECV,這說明最初發(fā)出的SYN包已正確傳輸,并且SYN/ACK包也到達(dá)了防火墻。 這就意味著在連接的兩方都有數(shù)據(jù)傳輸,因此可以認(rèn)為兩個(gè)方向都有相應(yīng)的回應(yīng)。
          接下來,TCP三次握手的隨后一個(gè)報(bào)文ACK包也到達(dá)了防火墻,防火墻上的狀態(tài)表變成了:
          tcp 6 431999 ESTABLISHED src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
          現(xiàn)在,我們來看看UDP協(xié)議的狀態(tài)描述方法,從協(xié)議本身的特性來看,UDP連接是無狀態(tài)的,因?yàn)樗鼪]有任何的連接建立和關(guān)閉過程。以某個(gè)順序收到的兩個(gè)數(shù)據(jù)包是無法確定它們的發(fā)出順序的。但內(nèi)核仍然可以對(duì)UDP連接設(shè)置狀態(tài)。我們來看看是如何跟蹤UDP連接的,以及在核心目錄 /proc/net/ip_conntrack的相關(guān)記錄。
          當(dāng)?shù)谝粋€(gè)UDP的數(shù)據(jù)包到達(dá)防火墻后,防火墻在他的狀態(tài)表中留下了這樣的記錄:
          udp 17 20 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 [UNREPLIED] src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1
          UNREPLIED代表這是一個(gè)狀態(tài)為NEW的數(shù)據(jù)包,當(dāng)這條連接的回應(yīng)數(shù)據(jù)包到達(dá)防火墻后,防火墻立即將修改這條狀態(tài)記錄:
          udp 17 160 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1
          在這條新的狀態(tài)記錄中,UNREPLIED被刪除了,這代表現(xiàn)在防火墻已經(jīng)建立了一條UDP協(xié)議的會(huì)話,但這里并沒有象TCP協(xié)議那樣顯示 ESTABLISHED標(biāo)記,這是TCP的狀態(tài)記錄和UDP的狀態(tài)記錄稍微不同的一個(gè)地方,當(dāng)然,還有一個(gè)地方需要注意,在測(cè)試中,還需要有一些數(shù)據(jù)包經(jīng)過,防火墻才會(huì)將狀態(tài)記錄改寫成:
          udp 17 179 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 [ASSURED] use=1
          ASSURED狀態(tài)表示當(dāng)前有數(shù)據(jù)在進(jìn)行傳輸,表面當(dāng)前連接的狀態(tài)是ACTIVE的。如果,在這個(gè)狀態(tài)下數(shù)據(jù)停止了傳輸,則這條記錄會(huì)有一個(gè)計(jì)時(shí)器,也就是記錄中的第三個(gè)字段,上面這條記錄的第三個(gè)字段是179,代表當(dāng)前的ASSURED狀態(tài)還能夠保持179秒,如果還有新的數(shù)據(jù)包經(jīng)過,那么計(jì)時(shí)器會(huì)被重新設(shè)置成缺省的180秒,如果在180秒內(nèi)都沒有流量,那么這條狀態(tài)記錄就會(huì)從狀態(tài)表中被刪除。
          最后,我們?cè)趤砜纯碙inux kernel是如何標(biāo)示ICMP協(xié)議的狀態(tài)的,ICMP也是一種無狀態(tài)協(xié)議,它只是用來控制而不是建立連接。ICMP包有很多類型,但只有四種類型有應(yīng)答包,它們是回顯請(qǐng)求和應(yīng)答(Echo request and reply),時(shí)間戳請(qǐng)求和應(yīng)答(Timestamp request and reply),信息請(qǐng)求和應(yīng)答(Information request and reply),還有地址掩碼請(qǐng)求和應(yīng)答(Address mask request and reply),這些包有兩種狀態(tài),NEW和ESTABLISHED 。時(shí)間戳請(qǐng)求和信息請(qǐng)求已經(jīng)廢除不用了,回顯請(qǐng)求還是常用的,比如ping命令就用的到,地址掩碼請(qǐng)求不太常用,但是可能有時(shí)很有用并且值得使用。看看下面的圖,就可以大致了解ICMP連接的NEW和ESTABLISHED狀態(tài)了。

          如圖所示,主機(jī)向目標(biāo)發(fā)送一個(gè)回顯請(qǐng)求,防火墻就認(rèn)為這個(gè)包處于NEW狀態(tài)。目標(biāo)回應(yīng)一個(gè)回顯應(yīng)答,防火墻就認(rèn)為包處于ESTABLISHED了。當(dāng)回顯請(qǐng)求被發(fā)送時(shí),ip_conntrack里就有這樣的記錄了:
          icmp 1 25 src=192.168.1.6 dst=192.168.1.10 type=8 code=0 id=33029 [UNREPLIED] src=192.168.1.10 dst=192.168.1.6 type=0 code=0 id=33029 use=1
          可以看到,ICMP的記錄和TCP、UDP的有點(diǎn)區(qū)別,協(xié)議名稱、超時(shí)時(shí)間和源、目地址都一樣,不同之處在于沒有了端口,而新增了三個(gè)新的字段: type,code和id。字段type說明ICMP的類型。code說明ICMP的代碼,這些代碼在附錄ICMP類型里有說明。id是 ICMP包的ID。每個(gè)ICMP包被發(fā)送時(shí)都被分配一個(gè)ID,接受方把同樣的ID 分配給應(yīng)答包,這樣發(fā)送方能認(rèn)出是哪個(gè)請(qǐng)求的應(yīng)答。
          [UNREPLIED] 的含義和前面一樣,說明數(shù)的傳輸只發(fā)生在一個(gè)方向上,也就是說未收到應(yīng)答。再往后,是應(yīng)答包的源、目地址,還有相應(yīng)的三個(gè)新字段,要注意的是type和 code是隨著應(yīng)答包的不同而變化的,id和請(qǐng)求包的一樣。和前面一樣,應(yīng)答包被認(rèn)為是ESTABLISHED的。然而,在應(yīng)答包之后,這個(gè)ICMP 連接就不再有數(shù)據(jù)傳輸了。所以,一旦應(yīng)答包穿過防火墻,ICMP的連接跟蹤記錄就被銷毀了。因此,要想在/proc/ip_conntrack文件中抓到 ICMP協(xié)議的狀態(tài)記錄實(shí)在不是一件容易的事。您可以用如下的命令來嘗試獲取這些記錄:
          #cat /proc/net/ip_conntrack | grep icmp
          如果沒有輸出,那么就不停的重復(fù)這個(gè)命令,直到發(fā)現(xiàn)icmp的記錄為止。
          以上各種情況,請(qǐng)求被認(rèn)為NEW,應(yīng)答是ESTABLISHED。換句話說,就是當(dāng)防火墻看到一個(gè)請(qǐng)求包時(shí),就認(rèn)為連接處于NEW狀態(tài),當(dāng)有應(yīng)答時(shí),就是ESTABLISHED狀態(tài)。
          1.7 規(guī)則的保存和恢復(fù)
          iptables提供了兩個(gè)命令來對(duì)策略進(jìn)行保存和恢復(fù):iptables-save和iptables-restore,iptables-save用來保存當(dāng)前內(nèi)存空間的策略,iptables-restore用來將iptables配置文件的策略寫入內(nèi)存空間。
          iptables-save的命令格式非常簡(jiǎn)單:
          #iptables-save –c > /etc/sysconfig/iptables
          上面的命令表示將內(nèi)存中的策略寫入/etc/sysconfig/iptables文件中,同時(shí)將當(dāng)前內(nèi)存中針對(duì)每條策略的流量統(tǒng)計(jì)值也寫入該文件。
          #iptables-save –t nat > /etc/sysconfig/iptables
          這條命令表明只保存當(dāng)前內(nèi)存中的nat表。
          #iptables-restore /etc/sysconfig/iptables
          這條命令表明將/etc/sysconfig/iptables配置文件中的內(nèi)容寫入內(nèi)存空間,并覆蓋當(dāng)前內(nèi)存空間中的所有配置。如果不希望更改當(dāng)前內(nèi)存空間中的配置,可以添加-n參數(shù),如下:
          #iptables-restore –n /etc/sysconfig/iptables
          這表明配置文件只將內(nèi)存空間中沒有的策略添加到內(nèi)存空間。
          另一種運(yùn)行iptables的方法是使用腳本,使用腳本能夠?qū)崿F(xiàn)一些更靈活的、結(jié)構(gòu)化的配置策略,對(duì)于一些習(xí)慣使用腳本管理防火墻的系統(tǒng)管理員來說,這是一個(gè)更好的選擇,后面,我們會(huì)提供一些腳本范例。
          1.8 編寫詳細(xì)的規(guī)則表
          本節(jié)我們開始揭開iptables的神秘面紗,當(dāng)我們真正進(jìn)入iptables的世界,我們發(fā)現(xiàn),這里的世界原來也很精彩。
          iptables的所有命令都是以iptables開頭,其總體的命令結(jié)構(gòu)如下:
          iptables [-t table] command [match] [target/jump]
          1.8.1 table
          -t table表示當(dāng)前的策略屬于哪個(gè)table,前面,我們提到了,一共有三種table:mangle、filter和nat,由于iptables的主要工作是過濾進(jìn)出本地網(wǎng)絡(luò)適配器的數(shù)據(jù)包,因此,很自然的,如果一條策略是關(guān)于過濾的,那么在缺省情況下,“-t filter”是可以省略的,而mangle和nat是一定要注明的,在實(shí)際的應(yīng)用環(huán)境當(dāng)中,mangle幾乎是用不到的,因此,在本文中,我們著重討論 nat表和filter表。
          1.8.2 command
          command指定iptables 對(duì)我們提交的規(guī)則要做什么樣的操作。這些操作可能是在某個(gè)表里增加或刪除一些東西,或做點(diǎn)兒其他什么。以下是iptables可用的command:
          命令 -A,--append
          范例 iptables –A INPUT……
          注解 添加規(guī)則
          命令 -D,--delete
          范例 iptables –D INPUT 8,iptables –D FORWARD –p tcp –s 192.168.1.12 –j ACCEPT
          注解 從所選的鏈中刪除規(guī)則,有兩種方法:一種是以編號(hào)來表示被刪除的規(guī)則,另一種是以整條的規(guī)則來匹配策略。
          命令 -R,--replace
          范例 iptables –R FORWARD 2 –p tcp –s 192.168.1.0 –j ACCEPT
          注解 替換相應(yīng)位置的策略,這時(shí)有一點(diǎn)需要注意,如果源或目的地址是以名字而不是以IP地址表示的,如果解析出的IP地址多于一個(gè),那么這條命令是失效的。
          命令 -I,--insert
          范例 iptables –I FORWARD 2 –p tcp –s 192.168.1.0 –j ACCEPT
          注解 這個(gè)命令和上面一個(gè)命令只差一個(gè)參數(shù),而不同之處在于這個(gè)命令是在相應(yīng)的位置前面插入一條命令,而不是替換。
          命令 -L,--list
          范例 iptables –t nat –L,iptables –L INPUT
          注解 列出當(dāng)前內(nèi)存空間的策略。
          命令 -F,flush
          范例 iptables –F,iptables –t nat -F
          注解 清空所選的鏈的配置規(guī)則。
          命令 -N,--new-chain
          范例 iptables –N tcp_allowed
          注解 添加新的鏈,在默認(rèn)情況下,iptables有ACCEPT、DROP、REJECT、LOG、REDIRECT等,如果希望對(duì)數(shù)據(jù)包做定制的處理,可以自己定義新的鏈。
          命令 -X,--delete-chain
          范例 iptables –X tcp_allowed
          注解 這條命令用于刪除自定義的鏈。
          命令 -P,--pollicy
          范例 iptables –P INPUT DROP
          注解 為鏈設(shè)置缺省的target,通常為ACCEPT和DROP,可以理解為防火墻的缺省策略:除非特定的被運(yùn)行,其他的都被禁止或除非特定的被禁止,其他的都被允許。
          上表列出了一些主要的iptables的命令,此外還有其他的一些命令不很常用,我們?cè)谶@里不作介紹。這些命令有一些選項(xiàng),要想詳細(xì)了解選項(xiàng)的具體內(nèi)容,可以查看iptables的manpage頁(yè)。
          1.8.3 match
          在iptables 的一條策略中,如何匹配一個(gè)數(shù)據(jù)包是非常關(guān)鍵的。這一節(jié),我們會(huì)詳細(xì)討論一些matche,大致可以歸為五類。第一類是generic matches(通用的匹配),適用于所有的規(guī)則;第二類是TCP matches,顧名思義,這只能用于TCP包;第三類是UDP matches,當(dāng)然它只能用在UDP包上了;第四類是ICMP matches ,針對(duì)ICMP包的;第五類比較特殊,針對(duì)的是狀態(tài)(state),所有者(owner)和訪問的頻率限制(limit)等。
          通用匹配:無論我們使用的是何種協(xié)議,也不管我們又裝入了匹配的何種擴(kuò)展,通用匹配都是可用的。也就是說,它們可以直接使用,而不需要什么前提條件,在后面你會(huì)看到,有很多匹配操作是需要其他的匹配作為前提的。
          -p, –protocol,匹配指定的協(xié)議,協(xié)議可以用名字來表示,比如tcp、udp、icmp等,名字是部分大小寫的,也可以使用他們的整數(shù)值,比如tcp 對(duì)應(yīng)的是整數(shù)1、udp對(duì)應(yīng)17,tcp對(duì)應(yīng)6。在缺省情況下,如果不寫這個(gè)匹配,代表所有ALL,但要注意,ALL表示tcp、udp、icmp這三種協(xié)議,而不包括/etc/protocol中的所有協(xié)議。如果有多個(gè)協(xié)議需要匹配,可以使用逗號(hào)分割,例如:
          #iptables –A INPUT –p tcp,udp –j ACCEPT
          在協(xié)議的前面用“!”標(biāo)示,代表除了“邏輯非”,例如:
          #iptables –A INPUT –p ! tcp –j DROP
          這個(gè)表達(dá)式代表只允許tcp協(xié)議通過,而udp和icmp全部被禁止通過。
          -s, --src, --source,匹配數(shù)據(jù)包的源地址,地址的表示形式如下:
          單個(gè)地址,如192.168.1.1,也可寫成192.168.1.1/32或192.168.1.1/255.255.255.255
          網(wǎng)絡(luò)地址,如192.168.1.0,也可寫成192.168.1.0/24或192.168.1.0/255.255.255.0
          在地址前加“!”表示去反,如 ! 192.168.1.0表示除這個(gè)地址段外的所有地址。
          如果不在一條策略中注明地址,表示所有地址,也可以表示成0.0.0.0/0
          -d, --dst, –destination,匹配數(shù)據(jù)包的目的地址,表示方法于源地址的表示方法一致。
          -i, --in-interface,以包進(jìn)入本地所使用的接口來匹配數(shù)據(jù)包,注意,這個(gè)匹配只適用于INPUT、FORWARD、PREROUTING鏈中,而用在其他任何地方都會(huì)出錯(cuò)。可以使用接口的名稱來標(biāo)示數(shù)據(jù)包的入口,如eth0、ppp0等,也可以使用通配符,如eth+,表示匹配從所有的以太接口進(jìn)入的數(shù)據(jù)包,和前面的一些匹配特性一樣,我們可以使用去反符號(hào)“!”來標(biāo)示除了被列出的接口的所有接口。
          -o, --out-interface,以包離開本地所使用的接口來匹配數(shù)據(jù)包,匹配方法和-i的匹配方法完全一致
          #iptables –A FORWORD –i eth0 –o eth1 –p tcp –j ACCEPT
          上例說明了凡是從eth0接口進(jìn)入,從eth1接口流出的tcp數(shù)據(jù)流被允許通過。
          隱含匹配:這種匹配操作是自動(dòng)地或隱含地裝載入內(nèi)核的。例如我們使用參數(shù)-p tcp 時(shí),不需再裝入任何東西就可以匹配只有IP包才有的一些特點(diǎn)。有三種隱含的匹配針對(duì)三種不同的協(xié)議,即TCP matches,UDP matches和 ICMP matches。它們分別包括一套只適用于相應(yīng)協(xié)議的判別標(biāo)準(zhǔn)。相對(duì)于隱含匹配的是顯式匹配,它們必須使用-m或--match被明確地裝載,而不能是自動(dòng)地或隱含地,下一節(jié)會(huì)介紹到。
          tcp matches,該匹配只匹配tcp包的細(xì)節(jié),它們必須有-p tcp做為前提條件。主要有以下幾種匹配參數(shù):
          --sport,--source-port,匹配源端口,有幾個(gè)原則需要注意:
          1、不使用此項(xiàng),則表示匹配所有端口。
          2、可以使用服務(wù)名或端口號(hào),使用服務(wù)名是為了簡(jiǎn)化用戶的配置,也許用戶知道服務(wù)名,但不一定知道服務(wù)對(duì)應(yīng)的端口號(hào),服務(wù)名必須在 /etc/services 文件中進(jìn)行標(biāo)注,當(dāng)然簡(jiǎn)化配置的代價(jià)是iptables必須花費(fèi)額外的系統(tǒng)資源在/etc/services文件中查詢服務(wù)名對(duì)應(yīng)的端口號(hào),如果用戶知道服務(wù)名對(duì)應(yīng)的端口號(hào),我們還是建議用戶直接使用端口號(hào)來定義。
          3、可以使用連續(xù)的端口來表示一個(gè)服務(wù),比如 –sport 135:139,這表明是從135端口到139端口,也有這樣的表示方法 –sport 1024:,表示匹配源端口從1024到65535。
          4、可以在端口號(hào)前添加“!”表示除了該端口以為的其他所有端口。
          5、不能用這種匹配來標(biāo)識(shí)端口不連續(xù)的情況,我們會(huì)在后面的部分介紹如何匹配端口不連續(xù)的情況。
          --dport,--destination-port,匹配目的端口,使用方法與源端口的匹配方法一致。
          #iptables –A FORWARD –p tcp –dport 21:25 –j ACCEPT
          上例中的語(yǔ)句表明允許tcp 21到25端口的服務(wù)通過防火墻。
          udp matches:鑒于udp協(xié)議與tcp協(xié)議的相似之處:都用端口號(hào)來表示一個(gè)應(yīng)用或服務(wù),因此,udp matches的使用方法也和tcp matches的使用方法基本一致,它也有 --sport 、--dport 的匹配原則,但與tcp matches不同的是,udp matches必須與 –p udp配合使用,這是非常容易理解的問題。我們?cè)谶@里就不需要多說了。
          icmp matches:與tcp和udp不同,icmp matches是根據(jù)ICMP類型匹配包,類型的指定可以使用十進(jìn)制數(shù)值或相應(yīng)的名字,數(shù)值在RFC792中有定義,名字可以用iptables --protocol icmp --help 查看。這個(gè)匹配也可用英文感嘆號(hào)取反,如:--icmp-type ! 8就表示匹配除類型8之外的所有ICMP包。人們經(jīng)常會(huì)使用到icmp協(xié)議,但最常用的可能要屬icmp echo-request和icmp echo-reply了,也就是我們檢測(cè)網(wǎng)絡(luò)連通性的ping命令了。
          顯示匹配:顯示匹配就必須用-m或--match裝載,比如要使用狀態(tài)匹配就必須使用-m state。有些匹配還需要指定協(xié)議,有些就不需要,比如連接狀態(tài)就不要。這些狀態(tài)是NEW(還未建立好的連接的第一個(gè)包),ESTABLISHED(已建立的連接,也就是已經(jīng)在內(nèi)核里注冊(cè)過的),RELATED(由已經(jīng)存在的、處于已建立狀態(tài)的連接生成的新連接),等等。有些匹配還處在開發(fā)階段,或者還只是為了說明iptables的強(qiáng)大能力。這說明不是所有的匹配一開始就是實(shí)用的,但以后你可能會(huì)用到它。隨著iptables 新版本的發(fā)布,會(huì)有一些新的匹配可用。隱含匹配和顯式匹配最大的區(qū)別就是一個(gè)是跟隨協(xié)議匹配自動(dòng)裝載的,一個(gè)是顯式裝載的。
          limit匹配:這個(gè)匹配操作必須由-m limit明確指定才能使用。有了它的幫助,就可以對(duì)指定的規(guī)則的日志數(shù)量加以限制,以免系統(tǒng)記錄大量重復(fù)的日志信息。比如,你可以事先設(shè)定一個(gè)限定值,當(dāng)符合條件的包的數(shù)量不超過它時(shí),就記錄;超過了,就不記錄。我們可以控制某條規(guī)則在一段時(shí)間內(nèi)的匹配次數(shù)(也就是可以匹配的包的數(shù)量),這樣就能夠減少 DoS syn flood攻擊的影響。
          --limit-burst:這個(gè)參數(shù)定義了當(dāng)前策略的峰值,也就是單位時(shí)間內(nèi)匹配的數(shù)據(jù)包的最大數(shù)量,每匹配一個(gè),數(shù)值就減一,直到0為止,新來的數(shù)據(jù)包將不被進(jìn)行匹配操作,也可以將這一數(shù)值理解為允許建立連接的閥值。
          --limit:這個(gè)參數(shù)定義了一個(gè)相當(dāng)于頻率的概念,在—limit-burst這個(gè)匹配項(xiàng)中我們已經(jīng)提到,當(dāng) --limit-burst定義的數(shù)值被耗盡,在單位時(shí)間內(nèi)是會(huì)得到適當(dāng)?shù)难a(bǔ)充的,這個(gè)頻率和數(shù)量就是在 --limit中定義的。
          舉個(gè)例子也許更容易幫你理解 –limit-burst和 –limit組合使用的功效。具有再充值功能的電話卡(比如神州行卡)想必許多人都用過,設(shè)想這樣一種情況,某個(gè)人在新買的手機(jī)上一次性的充了300元錢的話費(fèi),然后以后每月月底都往卡里充100元的話費(fèi),但有兩個(gè)前提:
          1、充值后的卡內(nèi)余額不得超過300元。
          2、當(dāng)月能且只能充100元的話費(fèi)。即便最初的300元話費(fèi)全部用光了,也只能補(bǔ)充這么多的話費(fèi)。
          在上例中我們可以將那個(gè)300元話費(fèi)看成 --limit-burst 定義的數(shù)值,將每月的100元話費(fèi)看成 --limit定義的數(shù)值,記住 --limit 是有單位的,在iptables中,這個(gè)單位可以是second、min、hour、day。
          我們可以用limit功能來做一些防止Dos攻擊的工作,看下面的例子:
          #iptables –A INPUT –p tcp --dport 80 –m limit --limit 10/second --limit-burst 200 –j ACCEPT
          上面的例子是在傳達(dá)這樣一個(gè)意思,主機(jī)的80端口對(duì)外開放,系統(tǒng)資源允許每秒新建立250個(gè)會(huì)話,主機(jī)通過iptables設(shè)置了能夠提供每秒200個(gè)新會(huì)話的容量(通常情況下,我們需要為服務(wù)器或主機(jī)本身考慮一些冗余),在正常情況下,這個(gè)數(shù)值完全能夠滿足應(yīng)用的要求,但如果有某個(gè)攻擊者對(duì)主機(jī)的80端口進(jìn)行拒絕服務(wù)攻擊,每秒200個(gè)新會(huì)話的容量也許一會(huì)的功夫就被用光了,對(duì)于一個(gè)沒有保護(hù)措施的主機(jī)來講,系統(tǒng)馬上就會(huì)癱瘓,但由于我們?cè)O(shè)置了一定的保護(hù)措施,即便有攻擊過來,在iptables這一關(guān)就會(huì)被丟棄。在這之后,iptables會(huì)每秒重新給主機(jī)10個(gè)新的會(huì)話名額,使之能夠處理新的連接。在新來的連接請(qǐng)求中,有正常的連接請(qǐng)求,也有一些是攻擊,但無論如何,通過這種方式,我們保證了服務(wù)器始終不會(huì)被攻癱掉,在更有效的對(duì)付拒絕服務(wù)攻擊的新技術(shù)出現(xiàn)以前,這也許是最有效的方法。
          MAC匹配:基于包的MAC源地址匹配包,地址格式只能是XX:XX:XX:XX:XX:XX,當(dāng)然它也可以用英文感嘆號(hào)取反,如--mac- source ! 00:00:00:00:00:01,意思很簡(jiǎn)單了,就是除此之外的地址都可接受。注意,因?yàn)?MAC addresses只用于Ethernet類型的網(wǎng)絡(luò),所以這個(gè)match只能用于Ethernet接口。而且,它還只能在PREROUTING, FORWARD 和INPUT鏈里使用。
          MAC匹配有一個(gè)非常好的應(yīng)用就是可以進(jìn)行IP地址和MAC地址的綁定,對(duì)于一些安全要求較高的網(wǎng)絡(luò),這是一個(gè)有效的配置策略。
          #iptables –A FORWARD –s 192.168.1.23 –m mac –mac-source 00:e0:4c:3d:5e:4f –j ACCEPT
          上例表明源IP地址為192.168.1.23,源MAC地址為00:e0:4c:3d:5e:4f的計(jì)算機(jī)能夠通過防火墻,如果這個(gè)用戶將自己的IP地址改成了192.168.1.24,而該地址同樣也做了MAC地址的match,那么要想通過更改IP地址而獲取上網(wǎng)權(quán)限的企圖是徒勞的。
          說明:可以通過iptables實(shí)現(xiàn)IP地址與MAC地址綁定的功能,但還有一種更加高效的方法,我們?cè)谶@里簡(jiǎn)要的說明一下,在/etc/目錄下編輯文件ethers,在文件中添加如下內(nèi)容:
          192.168.1.1 00:e0:4c:3d:5e:4f
          192.168.1.1 00:e0:4c:3d:5b:3d
          …….
          文件編輯完成后執(zhí)行命令:
          #/sbin/arp –f
          state匹配:state匹配在防火墻配置過程中非常重要的,如果沒有state的配置,那么需要配置雙向的規(guī)則才能滿足通訊的需要,但防火墻既然有狀態(tài)檢測(cè)功能,我們?yōu)槭裁床缓煤檬褂盟兀?br />--state:state的狀態(tài)有四種,指定要匹配包的的狀態(tài),當(dāng)前有4種狀態(tài)可用:INVALID,ESTABLISHED,NEW和RELATED。四種數(shù)據(jù)包的狀態(tài)我們?cè)谇懊嬉呀?jīng)做了詳細(xì)的描述本節(jié)我們只進(jìn)行state的用法描述,如下例所示:
          #iptables –A FORWARD –p tcp –m state --state RELATED,ESTABLISHED –j ACCEPT
          本例表明凡是數(shù)據(jù)包狀態(tài)為“RELATED”、“ESTABLISHED”的tcp包允許通過防火墻,在一般情況下,基于狀態(tài)的策略都是配置在每一條 chain的最前面,因?yàn)楫?dāng)包被匹配到以后,就能夠直接被處理了,這是一種比較高效的配置方法。關(guān)鍵字ESTABLISHED比較容易理解,即匹配狀態(tài)為 “已經(jīng)建立連接”的數(shù)據(jù)包,那么怎么理解“RELATED”呢,RELATED表示不屬于已經(jīng)建立的那條連接,但和那條連接有關(guān),比如ftp,ftp在建立連接的過程中會(huì)首先建立一條ftp-control連接用以傳輸指令等,真正傳輸數(shù)據(jù)的是一條叫做ftp-data的連接,而傳輸數(shù)據(jù)的連接是和傳輸控制信號(hào)的連接相關(guān)的,因此“RELATED”是用于類似這些特殊服務(wù)的。在正常情況下,對(duì)于每一種協(xié)議:TCP、UDP、ICMP都可以單獨(dú)的配置狀態(tài)策略,但一種比較簡(jiǎn)單高效的做法是:
          #iptables –A INPUT –p all –m state --state RELATED,ESTABLISHED –j ACCEPT
          multiport:這個(gè)匹配選項(xiàng)為我們解決了如何在一條策略種匹配那些端口不連續(xù)的服務(wù),在一般情況下,一個(gè)公司或企業(yè)的安全策略是允許內(nèi)部網(wǎng)絡(luò)使用有限的Internet服務(wù),如收發(fā)電子郵件、上網(wǎng)瀏覽網(wǎng)頁(yè)、msn聊天等,看看下面的例子:
          #iptables –A FORWARD –i eth0 –p tcp –m multiport --dports 25,80,110,443,1863 –j ACCEPT
          #iptables –A FORWARD –i eth0 –p udp --dport 53 –j ACCEPT
          僅僅兩條命令就解決了內(nèi)部用戶上網(wǎng)收發(fā)E_mail、瀏覽網(wǎng)頁(yè)、使用msn聊天等需求,怎么樣,就這么簡(jiǎn)單。
          1.8.4 target和jump
          從字面的意思來理解,target表示目標(biāo),jump表示跳轉(zhuǎn),兩個(gè)結(jié)合起來表示被匹配到的數(shù)據(jù)包將跳轉(zhuǎn)的哪個(gè)目標(biāo)去,并執(zhí)行那個(gè)目標(biāo)相應(yīng)的動(dòng)作,DROP、ACCEPT或其他。還是舉個(gè)例子有助于我們理解target和jump。
          #iptables –N power_users
          #iptables –A power_users –p all –j ACCEPT
          #iptables –A FORWARD –s 192.168.1.0 –j power_users
          上面的例子中,第一句表示新建一條chain,名稱叫做power_users,第二句是對(duì)power_users鏈定義策略,該策略表明接受所有協(xié)議的數(shù)據(jù)包,確實(shí)如此,否則我們也不會(huì)將這條鏈成為power_users了,第三條語(yǔ)句定義了一個(gè)轉(zhuǎn)發(fā)策略,將原地址為192.168.1.0/24網(wǎng)段的用戶產(chǎn)生的數(shù)據(jù)包被跳轉(zhuǎn)至power_users鏈處理。
          在本節(jié)中,我們將對(duì)比較常用的幾個(gè)targets進(jìn)行詳細(xì)的描述,他們分別是DROP、ACCEPT、SNAT、DNAT、MASQUERADE、LOG。
          DROP: DROP target表示被匹配的數(shù)據(jù)包將要被執(zhí)行的動(dòng)作是丟棄,也就是說,在這里,包的生命走到了終點(diǎn),在這種情況下,iptables對(duì)包的處理只是將包丟棄,它不會(huì)對(duì)包的發(fā)送者返回任何信息,也不會(huì)向路由器發(fā)送任何錯(cuò)誤信息,這在某些情況下會(huì)造成一些問題,比如發(fā)送者還在苦苦等待回包的到來,而發(fā)送出去的包早就在半路上夭折了,可以通過REJECT target來避免這個(gè)問題,REJECT和DROP的差別在于它不僅僅丟棄包,而且還禮節(jié)性的告訴發(fā)送者,這樣就不至于發(fā)送者苦苦等待了。其實(shí)對(duì)于一般的應(yīng)用,我們并不建議使用REJECT,既然包總是要被DROP的,那就讓發(fā)送者去等吧,這和我們有什么關(guān)系呢??
          ACCEPT:這個(gè)target沒有任何選項(xiàng)和參數(shù),使用也很簡(jiǎn)單,指定-j ACCEPT即可。一旦包滿足了指定的匹配條件,就會(huì)被ACCEPT,并且不會(huì)再去匹配當(dāng)前鏈中的其他規(guī)則或同一個(gè)表內(nèi)的其他規(guī)則。
          SNAT:這個(gè)target是用來做源網(wǎng)絡(luò)地址轉(zhuǎn)換的,就是重寫包的源IP地址。當(dāng)我們有若干臺(tái)計(jì)算機(jī)共享一個(gè)Internet 連接時(shí),就能用到它了,而且這也是絕大多數(shù)企業(yè)用戶所采用的Internet互聯(lián)方案。先在內(nèi)核里打開ip轉(zhuǎn)發(fā)功能,然后再寫一個(gè)SNAT規(guī)則,就可以把所有從本地網(wǎng)絡(luò)出去的包的源地址改為Internet連接的地址了。如果我們不這樣做而是直接轉(zhuǎn)發(fā)本地網(wǎng)的數(shù)據(jù)包的話,Internet上的機(jī)子就不知道往哪兒發(fā)送應(yīng)答了,因?yàn)樵诒镜鼐W(wǎng)里我們一般使用的是IANA組織專門指定的一段地址,它們是不能在Internet上使用的,還記得那些地址范圍嗎?讓我們來回憶一下:
          10.0.0.0 - 10.255.255.255 (10/8 prefix)
          172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
          192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
          SNAT target的作用就是讓所有從本地網(wǎng)出發(fā)的包看起來都是從一臺(tái)機(jī)子發(fā)出的,這臺(tái)機(jī)子一般就是防火墻或路由器之類的三層設(shè)備。
          SNAT只能用在nat表的POSTROUTING鏈里。只要連接的第一個(gè)符合條件的包被SNAT了,那么這個(gè)連接的其他所有的包都會(huì)自動(dòng)地被SNAT,而且這個(gè)規(guī)則還會(huì)應(yīng)用于這個(gè)連接所在流的所有數(shù)據(jù)包。
          既然提到了ip包轉(zhuǎn)發(fā)的問題,我們也不妨費(fèi)一些文字做一些簡(jiǎn)要的說明,當(dāng)iptables被用來安裝在一個(gè)提供WWW或E_mail服務(wù)的主機(jī)上以期為主機(jī)提供保護(hù)時(shí)是不涉及包轉(zhuǎn)發(fā)的,但當(dāng)iptables被用在網(wǎng)絡(luò)的邊界節(jié)點(diǎn)充當(dāng)一個(gè)安全網(wǎng)關(guān)時(shí),就涉及到包轉(zhuǎn)發(fā)的問題了,這時(shí),iptables需要通過不同的網(wǎng)卡來轉(zhuǎn)發(fā)數(shù)據(jù)包,在linux系統(tǒng)中,控制是否允許轉(zhuǎn)發(fā)數(shù)據(jù)包是有一個(gè)開關(guān)的,0表示不轉(zhuǎn)發(fā),1表示轉(zhuǎn)發(fā),只要更改 /etc/sysct.confl文件中的如下內(nèi)容:
          #Controls IP Packets Forwarding
          net.ipv4.ip_forward = 1
          然后重啟系統(tǒng),這時(shí)系統(tǒng)就能夠進(jìn)行包轉(zhuǎn)發(fā)了,還有一種方法是在內(nèi)核空間內(nèi)直接更改,通過改下列文件的參數(shù):
          #echo 1 > /proc/sys/net/ipv4/ip_forward
          注意,這個(gè)文件一旦更改,立即生效,但如果重啟系統(tǒng),將回到默認(rèn)設(shè)置,所以/etc/sysctl.conf文件無論如何都應(yīng)該將轉(zhuǎn)發(fā)開關(guān)置位為“1”。
          看看下面的范例,一般一個(gè)SNAT的命令是這樣完成的:
          #iptables –t nat –A POSTROUTING –s 192.168.1.0 –j SNAT --to-source 1.1.1.1
          這條命令表示將內(nèi)部網(wǎng)絡(luò)的192.168.1.0/24網(wǎng)段的地址翻譯成1.1.1.1,這樣內(nèi)部地址就可以使用一個(gè)公有IP(Public IP address)地址共享上網(wǎng)了,當(dāng)然,還要有額外的策略允許內(nèi)部用戶上網(wǎng)才行哦,別忘了。
          SNAT只有一個(gè)參數(shù),--to-source,它有幾種使用方法:
          1、單獨(dú)的地址,就象上面的例子所示。
          2、一段連續(xù)的地址,用連字符分隔,如1.1.1.1-1.1.1.10,這樣可以實(shí)現(xiàn)負(fù)載平衡。每個(gè)流會(huì)被隨機(jī)分配一個(gè)IP,但對(duì)于同一個(gè)流使用的是同一個(gè)IP。當(dāng)然,前提是你要有這么多的公有ip才行啊!
          3、在指定-p tcp 或 -p udp的前提下,可以指定源端口的范圍,如1.1.1.1:1024-32000,這樣包的源端口就被限制在1024-32000了。
          DNAT:這個(gè)target是用來做目的網(wǎng)絡(luò)地址轉(zhuǎn)換的,意思是重寫包的目的IP地址。如果一個(gè)包被匹配了,那么和它屬于同一個(gè)流的所有的包都會(huì)被自動(dòng)轉(zhuǎn)換,然后就可以被路由到正確的主機(jī)或網(wǎng)絡(luò)。DNAT target是非常有用的。比如,你的Web服務(wù)器在LAN內(nèi)部,而且沒有可在Internet上使用的真實(shí)IP地址,那就可以使用這個(gè) target讓防火墻把所有到它自己HTTP端口的包轉(zhuǎn)發(fā)給LAN內(nèi)部真正的Web服務(wù)器。目的地址也可以是一個(gè)范圍,這樣的話,DNAT會(huì)為每一個(gè)流隨機(jī)分配一個(gè)地址。因此,我們可以用這個(gè)target做某種類型的負(fù)載平衡。
          DNAT也和SNAT一樣只有一個(gè)參數(shù),--to-destination,看看下面的例子:
          #iptables –t nat –A PREROUTING –d 1.1.1.1 –j DNAT --to-destination 192.168.1.24
          上面的例子說明凡是訪問1.1.1.1的數(shù)據(jù)包都轉(zhuǎn)給內(nèi)網(wǎng)的192.168.1.24,這樣內(nèi)部的服務(wù)器就可以發(fā)布出去了。現(xiàn)在問題來了,如果僅僅這樣配置還是存在一點(diǎn)問題的,假設(shè)內(nèi)部網(wǎng)絡(luò)的其他用戶也訪問這個(gè)經(jīng)過映射后的地址會(huì)怎樣?當(dāng)然他們完全可以直接訪問服務(wù)器的真實(shí)地址,但在一些具體的情況下,比如 dns的解析就是指向了映射后的地址。可以加一條這樣的語(yǔ)句:
          #iptables –t nat –A POSTROUTING –d 1.1.1.1 –j SNAT –to-source 192.168.1.254
          在這里,假設(shè)防火墻的內(nèi)網(wǎng)地址是192.168.1.254,通過這樣的配置,問題解決了,想一想為什么會(huì)這樣?看看下面的示意圖:也許你就明白了:

          知道問題出在哪里了嗎?很明顯,當(dāng)客戶機(jī)192.168.1.23發(fā)起一個(gè)訪問請(qǐng)求給映射后的地址1.1.1.1,防火墻收到這個(gè)請(qǐng)求后根據(jù)策略表匹配發(fā)現(xiàn)是一個(gè)對(duì)內(nèi)部服務(wù)器192.168.1.24的映射,如果不加上面的那一行語(yǔ)句,防火墻會(huì)通過純路由的方式將數(shù)據(jù)包轉(zhuǎn)發(fā)給服務(wù)器 192.168.1.24,服務(wù)器收到請(qǐng)求后,發(fā)現(xiàn)源地址為192.168.1.23的客戶機(jī)發(fā)來了一個(gè)請(qǐng)求,并且這臺(tái)主機(jī)與自己在同一個(gè)網(wǎng)段內(nèi),于是直接將回應(yīng)包SYN+ACK發(fā)送給主機(jī)192.168.1.23,主機(jī)收到這個(gè)包后會(huì)感覺很奇怪,因?yàn)樗鼜膩砭蜎]有給192.168.1.24發(fā)送過連接請(qǐng)求報(bào)文,所以就會(huì)將回應(yīng)報(bào)文丟棄,現(xiàn)在,我們對(duì)內(nèi)網(wǎng)主機(jī)通過映射后地址訪問內(nèi)網(wǎng)服務(wù)器的需求進(jìn)行一些修改,如上面的哪條命令,我們對(duì)所有到1.1.1.1 的連接都做一個(gè)原地址路由,將連接的原地址改變成防火墻的內(nèi)網(wǎng)接口地址,于是問題解決了。
          當(dāng)然,問題總有兩面性,對(duì)于服務(wù)器而言,所有訪問者這時(shí)都變成了防火墻內(nèi)網(wǎng)的接口地址,這對(duì)于服務(wù)器的審計(jì)是有影響的,在具體的配置過程中,使用者需要權(quán)衡利弊,在做配置決定。
          MASQUERADE:這個(gè)鏈與SNAT的差別不大,回憶一下在進(jìn)行SNAT的配置時(shí)需要指明一個(gè)固定的映射地址,但如果用戶的網(wǎng)絡(luò)使用的是ADSL這種動(dòng)態(tài)獲取IP地址的方式,SNAT就不適用了,這時(shí)只能使用MASQUERADE(地址偽裝),在具體的處理過程中,系統(tǒng)需要讀取當(dāng)前的動(dòng)態(tài)地址,然后用當(dāng)前的地址對(duì)數(shù)據(jù)包進(jìn)行重新封裝:
          #iptables –A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE
          MASQUERADE可以添加參數(shù)--to-ports 1024-30000,可以通過這個(gè)參數(shù)指定映射后的源端口范圍。
          LOG:顧名思義,這條鏈?zhǔn)怯脕碛涗浫罩镜摹S涗浫罩居兄诒匾菫槲覀兲峁┮恍┯杏玫男畔ⅲ热绫环阑饓ROP的數(shù)據(jù)包就有可能包含一些危險(xiǎn)的動(dòng)作,網(wǎng)絡(luò)發(fā)生故障時(shí),我們也能夠通過LOG發(fā)現(xiàn)一些潛在的問題。
          有兩個(gè)常用的選項(xiàng),--log-level 、--log-prefix
          --log-level 告訴iptables和 syslog使用哪個(gè)記錄等級(jí)。記錄等級(jí)的詳細(xì)信息可以查看文件syslog.conf,一般來說有以下幾種,它們的級(jí)別依次是:debug,info, notice,warning,warn,err,error,crit,alert, emerg,panic。其中,error和err、warn和warning、panic和emerg分別是同義詞,也就是說作用完全一樣的。注意這三種級(jí)別是不被贊成使用的,換句話說,就是不要使用它們(因?yàn)樾畔⒘刻螅P畔⒓?jí)別說明了被記錄信息所反映的問題的嚴(yán)重程度。所有信息都是通過內(nèi)核的功能被記錄的,也就是說,先在文件 syslog.conf里設(shè)置
          kern.info /var/log/iptables
          然后再讓所有關(guān)于iptables的LOG信息使用級(jí)別info,就可以把所有的信息存入文件/var/log/iptables內(nèi)。注意,其中也可能會(huì)有其他的信息,它們是內(nèi)核中使用info 這個(gè)等級(jí)的其他部分產(chǎn)生的。有關(guān)日志的詳細(xì)信息,可以syslog和syslog.conf的man page。
          --log-prefix 描述日志的前綴,這樣和grep或其他工具一起使用時(shí)就容易追蹤特定的問題,而且也方便從不同的規(guī)則輸出。前綴最多能有29個(gè)英文字符,這已經(jīng)是包括空白字符和其他特殊符號(hào)的總長(zhǎng)度了。
          #iptables –A FORWARD –p tcp –j LOG –log-prefix “tcp_packets “ –log-level info
          這條語(yǔ)句表示需要記錄所有tcp協(xié)議的數(shù)據(jù)包,并以“tcp_packets”做為標(biāo)記。
          第二章 范例
          網(wǎng)絡(luò)環(huán)境

          如上所示:這是一個(gè)非常典型的企業(yè)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),通過固定IP地址接入Internet,內(nèi)部網(wǎng)絡(luò)通過防火墻與Internet互連并進(jìn)行安全控制,只允許內(nèi)部網(wǎng)絡(luò)的用戶通過ftp、http、smtp、和pop3與Internet連接,而禁止所有從外網(wǎng)到內(nèi)網(wǎng)的連接,內(nèi)部用戶通過防火墻的外網(wǎng)接口地址共享上網(wǎng)。運(yùn)行腳本firewall.sh如下:
          #!/bin/sh
          # example.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables
          ###########################################################################
          # Configuration options.
          # Internet Configuration.
          INET_IP="194.236.50.155"
          INET_SERVER=”194.236.50.156”
          INET_IFACE="eth0"
          INET_BROADCAST="194.236.50.255"
          ###########################################################################
          #Lan configuration
          # your LAN's IP range and localhost IP. /24 means to only use the first 24
          # bits of the 32 bit IP address. the same as netmask 255.255.255.0
          LAN_IP="192.168.0.254"
          LAN_SERVER=”192.168.0.1”
          LAN_IP_RANGE="192.168.0.0/24"
          LAN_BROADCAST=”192.168.0.255”
          LAN_IFACE="eth1"
          ###########################################################################
          # Localhost Configuration.
          LO_IFACE="lo"
          LO_IP="127.0.0.1"
          ###########################################################################
          # IPTables Configuration.
          IPTABLES="/usr/sbin/iptables"
          ###########################################################################
          # Module loading.
          # Needed to initially load modules
          /sbin/depmod -a
          # Required modules
          /sbin/modprobe ip_tables
          /sbin/modprobe ip_conntrack
          /sbin/modprobe iptable_filter
          /sbin/modprobe iptable_nat
          /sbin/modprobe ipt_LOG
          /sbin/modprobe ipt_limit
          /sbin/modprobe ipt_state
          ##########################################################################
          # Non-Required modules
          #/sbin/modprobe ipt_owner
          #/sbin/modprobe ipt_REJECT
          #/sbin/modprobe ipt_MASQUERADE
          /sbin/modprobe ip_conntrack_ftp
          #/sbin/modprobe ip_conntrack_irc
          /sbin/modprobe ip_nat_ftp
          ###########################################################################
          # /proc set up.
          # Required proc configuration
          echo "1" > /proc/sys/net/ipv4/ip_forward
          ###########################################################################
          # rules set up.
          # Filter table
          # Set default policies
          $IPTABLES -P INPUT DROP
          $IPTABLES -P OUTPUT DROP
          $IPTABLES -P FORWARD DROP
          ###########################################################################
          # Create userspecified chains
          # Create chain for bad tcp packets
          $IPTABLES -N bad_tcp_packets
          # Create separate chains for ICMP, TCP and UDP to traverse
          $IPTABLES -N allowed
          $IPTABLES -N tcp_packets
          $IPTABLES -N udp_packets
          $IPTABLES -N icmp_packets
          ###########################################################################
          # Create content in userspecified chains
          # bad_tcp_packets chain
          $IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \
          -m state --state NEW -j REJECT --reject-with tcp-reset
          $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \
          --log-prefix "New not syn:"
          $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
          ###########################################################################
          # allowed chain
          $IPTABLES -A allowed -p TCP --syn -j ACCEPT
          $IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
          $IPTABLES -A allowed -p TCP -j DROP
          ############################################################################
          # TCP rules for the services of ftp, ssh, smtp,http,pop3
          #
          $IPTABLES -A tcp_packets -p TCP –m multiport --dports 21,22,25,80,110 -j allowed
          ############################################################################
          # UDP rules for the services of dns
          #
          $IPTABLES -A udp_packets -p UDP --destination-port 53 -j ACCEPT
          #
          # In Microsoft Networks you will be swamped by broadcasts. These lines
          # will prevent them from showing up in the logs. Uncomment the following
          # line to make the policy active if you have such a network
          #
          #$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST \
          #--destination-port 135:139 -j DROP
          #$IPTABLES -A udp_packets -p UDP -i $LAN_IFACE -d $LAN_BROADCAST \
          #--destination-port 135:139 -j DROP
          ###########################################################################
          # ICMP rules
          #
          $IPTABLES -A icmp_packets -p ICMP --icmp-type 8 -j ACCEPT
          ###########################################################################
          # INPUT chain
          #
          # Bad TCP packets you don't want.
          #
          $IPTABLES -A INPUT -p tcp -j bad_tcp_packets
          #
          # Rules for special networks not part of the Internet
          #
          $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
          $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
          $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
          $IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
          # Drop the packet from Internet
          #
          $IPTABLES -A INPUT -p ALL -i $INET_IFACE –j DROP
          # Log weird packets that don't match the above.
          #
          $IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
          --log-level DEBUG --log-prefix " INPUT packet died: "
          ###########################################################################
          # FORWARD chain
          #
          # Bad TCP packets we don't want
          #
          $IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
          #
          # Accept the packets we actually want to forward
          #
          $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
          $IPTABLES -A FORWARD –p tcp -i $LAN_IFACE -j tcp_packets
          $IPTABLES -A FORWARD –p udp -i $LAN_IFACE -j udp_packets
          $IPTABLES -A FORWARD -p icmp -i $LAN_IFACE -j icmp_packets
          #
          # Log weird packets that don't match the above.
          #
          $IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \
          --log-level DEBUG --log-prefix "FORWARD packet died: "
          #
          # OUTPUT chain
          #
          # Bad TCP packets we don't want.
          #
          $IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
          #
          # Special OUTPUT rules to decide which IP's to allow.
          #
          $IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
          $IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
          $IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
          #
          # Log weird packets that don't match the above.
          #
          $IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
          --log-level DEBUG --log-prefix "OUTPUT packet died: "
          ###########################################################################
          # nat table
          -j DNAT --to-destination $LAN_SERVER
          # POSTROUTING chain
          $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
          編輯好腳本后,為其添加可執(zhí)行權(quán)限:
          #chmod ugo+x firewall.sh
          將firewall.sh腳本移動(dòng)到/etc目錄下:
          #mv firewall.sh /etc/
          確保系統(tǒng)在啟動(dòng)是能夠運(yùn)行該腳本,添加如下語(yǔ)句到/etc/rc.d/rc.local文件中:
          #echo sh /etc/firewall.sh >> /etc/rc.d/rc.local
          第三章 Iptables的新功能
          在netfilter 的官方網(wǎng)站,2004年03月02日,發(fā)布了新的patch,在新的patch中公布了一些iptables可以使用的新的功能,有一些還是非常實(shí)用的。比如可以用來定義IP地址范圍段的iprange、定義連續(xù)或不連續(xù)端口范圍的mport、定義時(shí)間規(guī)則的time,定義網(wǎng)絡(luò)流量配額的quota等,這些功能本人已經(jīng)測(cè)試過,基本上還不錯(cuò),但其他的一些功能,在本人來看還不是特別實(shí)用,因此沒有測(cè)試,讀者如果感興趣,也可以自己用用看,別忘了告訴我結(jié)果哦?.
          在使用這些新的功能前,首先需要將這些patch編譯進(jìn)核心,當(dāng)然也可以將他們做為Modules使用,至于如何編譯核心,我在前面已經(jīng)講過了。
          寫到這里,花了我好幾天的功夫,實(shí)在是累了,這一章就不仔細(xì)寫了,就好像維納斯缺一個(gè)胳膊卻是美的化身,本文也在第三章留一些缺憾,相信如果您已經(jīng)仔細(xì)的閱讀了本文的前兩章,并進(jìn)行了實(shí)際的操作,相信在第三章,您可以憑借自己的能力搞定我沒有仔細(xì)闡述的那些問題的。

          posted on 2007-05-22 11:36 無聲 閱讀(1097) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 陆丰市| 师宗县| 临沭县| 张家港市| 洮南市| 文水县| 工布江达县| 镇原县| 丰城市| 南丰县| 饶平县| 怀集县| 顺平县| 汉阴县| 甘谷县| 仪陇县| 易门县| 会同县| 穆棱市| 东至县| 墨江| 宁远县| 宿松县| 拜城县| 开封市| 科技| 衡南县| 抚松县| 枣阳市| 黔南| 舟山市| 扶绥县| 岳普湖县| 德钦县| 天祝| 阿克陶县| 车致| 永清县| 互助| 专栏| 吴桥县|