持之以恒

          記錄本
          posts - 4, comments - 32, trackbacks - 0, articles - 74
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Linux防火墻 配置文件 iptables詳解

          Posted on 2012-04-23 11:07 小白19870626 閱讀(44559) 評論(3)  編輯  收藏 所屬分類: linux

          對于Internet上的系統(tǒng),不管是什么情況都要明確一點:網(wǎng)絡(luò)是不安全的。因此,雖然創(chuàng)建一個防火墻并不能保證系統(tǒng)100%安全,但卻是絕對必要的。 Linux提供了一個非常優(yōu)秀的防火墻工具—netfilter/iptables。它完全免費、功能強大、使用靈活、可以對流入和流出的信息進行細(xì)化控制,且可以在一臺低配置機器上很好地運行。本文將簡單介紹使用netfilter/iptables實現(xiàn)防火墻架設(shè)和Internet連接共享等應(yīng)用。

          netfilter/iptabels應(yīng)用程序,被認(rèn)為是 Linux中實現(xiàn)包過濾功能的第四代應(yīng)用程序。netfilter/iptables包含在2.4以后的內(nèi)核中,它可以實現(xiàn)防火墻、NAT(網(wǎng)絡(luò)地址翻譯)和數(shù)據(jù)包的分割等功能。netfilter工作在內(nèi)核內(nèi)部,而iptables則是讓用戶定義規(guī)則集的表結(jié)構(gòu)。netfilter/iptables 從ipchains和ipwadfm(IP防火墻管理)演化而來,功能更加強大。下文將netfilter/iptabels統(tǒng)一稱為iptables。

          可以用iptables為Unix、Linux和BSD個人工作站創(chuàng)建一個防火墻,也可以為一個子網(wǎng)創(chuàng)建防火墻以保護其它的系統(tǒng)平臺。iptales只讀取數(shù)據(jù)包頭,不會給信息流增加負(fù)擔(dān),也無需進行驗證。要想獲得更好的安全性,可以將其和一個代理服務(wù)器(比如squid)相結(jié)合。

          基本概念 
          典型的防火墻設(shè)置有兩個網(wǎng)卡:一個流入,一個流出。iptables讀取流入和流出數(shù)據(jù)包的報頭,將它們與規(guī)則集(Ruleset)相比較,將可接受的數(shù)據(jù)包從一個網(wǎng)卡轉(zhuǎn)發(fā)至另一個網(wǎng)卡,對被拒絕的數(shù)據(jù)包,可以丟棄或按照所定義的方式來處理。 
          通過向防火墻提供有關(guān)對來自某個源地址、到某個目的地或具有特定協(xié)議類型的信息包要做些什么的指令,規(guī)則控制信息包的過濾。通過使用iptables系統(tǒng)提供的特殊命令iptables建立這些規(guī)則,并將其添加到內(nèi)核空間特定信息包過濾表內(nèi)的鏈中。關(guān)于添加、去除、編輯規(guī)則的命令,一般語法如下: 
          iptables [-t table] command [match] [target]


          1.表(table) 
          [-t table]選項允許使用標(biāo)準(zhǔn)表之外的任何表。表是包含僅處理特定類型信息包的規(guī)則和鏈的信息包過濾表。有三個可用的表選項:filter、nat和 mangle。該選項不是必需的,如果未指定,則filter作為缺省表。各表實現(xiàn)的功能如表1所示。
          表1 三種表實現(xiàn)的功能

                      <!--[if !vml]-->2.命令(command) 
          command部分是iptables命令最重要的部分。它告訴iptables命令要做什么,例如插入規(guī)則、將規(guī)則添加到鏈的末尾或刪除規(guī)則。表2是最常用的一些命令及例子。 
          表2 命令的功能和樣例

          <!--[if !vml]--><!--[endif]-->
          3.匹配(match)

          iptables命令的可選match部分指定信息包與規(guī)則匹配所應(yīng)具有的特征(如源地址、目的地址、協(xié)議等)。匹配分為通用匹配和特定于協(xié)議的匹配兩大類。這里將介紹可用于采用任何協(xié)議的信息包的通用匹配。表3是一些重要且常用的通用匹配及示例說明。 
          表3 通用匹配及示例說明




          <!--[if !vml]--><!--[endif]-->
          4.目標(biāo)(target)

          目標(biāo)是由規(guī)則指定的操作,對與那些規(guī)則匹配的信息包執(zhí)行這些操作。除了允許用戶定義的目標(biāo)之外,還有許多可用的目標(biāo)選項。表4是常用的一些目標(biāo)及示例說明。

          除表4外,還有許多用于建立高級規(guī)則的其它目標(biāo),如LOG、REDIRECT、MARK、MIRROR和MASQUERADE等。

          表4 目標(biāo)及示例說明


          應(yīng)用iptables

          與ipchains和ipfwadm不同的是,iptables可以配置有狀態(tài)的防火墻。iptables可以檢測到源地址和目的地址、源端口和目的端口及流入數(shù)據(jù)包的順序,即iptables記住了在現(xiàn)有連接中,哪些數(shù)據(jù)包已經(jīng)被允許接收。這使得暫時性的端口只有在需要時才會被打開,并且會拒絕所有永久性占用端口的請求,大大地加強了安全性。同時,那些被更改了報頭的數(shù)據(jù)包,即使包含有一個被允許的目的地址和端口,也會被檢測到并被丟棄。此外,有狀態(tài)的防火墻能夠指定并記住為發(fā)送或接收信息包所建立連接的狀態(tài)。防火墻可以從信息包的連接跟蹤狀態(tài)獲得該信息。在決定新的信息包過濾時,防火墻所使用的這些狀態(tài)信息可以增加其效率和速度。

          1.啟動和停止iptables

          下面將正式使用iptables來創(chuàng)建防火墻。啟動和停止iptables的方法取決于所使用的Linux發(fā)行版,可以先查看所使用Linux版本的文檔。

          一般情況下,iptables已經(jīng)包含在Linux發(fā)行版中,運行iptables --version來查看系統(tǒng)是否安裝了iptables。在Red Hat 9.0中,安裝的版本是iptables v1.2.7a。如果系統(tǒng)沒有安裝iptables,則可以從http://www.netfilter.org下載。

          2.查看規(guī)則集

          上面僅對iptables的用法做了一個簡單介紹,使用中可以運行man iptables來查看所有命令和選項的完整介紹,或者運行iptables -help來查看一個快速幫助。要查看系統(tǒng)中現(xiàn)有的iptables規(guī)劃集,可以運行以下命令:

          iptables --list

           

          下面是沒有定義規(guī)劃時iptables的樣子:

          Chain INPUT (policy ACCEPT) 
          target prot opt source destination

          Chain FORWARD (policy ACCEPT) 
          target prot opt source destination

          Chain OUTPUT (policy ACCEPT) 
          target prot opt source destination 
          如上例所示,每一個數(shù)據(jù)包都要通過三個內(nèi)建的鏈(INPUT、OUTPUT和FORWARD)中的一個。

          filter是最常用的表,在filter表中最常用的三個目標(biāo)是ACCEPT、DROP和REJECT。DROP會丟棄數(shù)據(jù)包,不再對其進行任何處理。REJECT會把出錯信息傳送至發(fā)送數(shù)據(jù)包的主機。 
          <!--[if !vml]--><!--[endif]--> 
          在Red Hat 9.0中,提供一個GUI程序來讓用戶對系統(tǒng)的安裝級別進行簡單的配置。該工具的啟動方法是:主選單→系統(tǒng)設(shè)置→安全工具(如圖1所示)。在此將安全級別設(shè)為“高級”,并選擇使用默認(rèn)的防火墻規(guī)則。點擊確定后,再用iptables -list顯示,發(fā)現(xiàn)iptables與沒有定義規(guī)則前已經(jīng)有很大不同,如下所示:

          [root@workstation root]# iptables --list 
          Chain INPUT (policy ACCEPT) 
          target prot opt source destination 
          RH-Lokkit-0-50-INPUT all -- anywhere anywhere

          Chain FORWARD (policy ACCEPT) 
          target prot opt source destination 
          RH-Lokkit-0-50-INPUT all -- anywhere anywhere

          Chain OUTPUT (policy ACCEPT) 
          target prot opt source destination 
          ......

           

          現(xiàn)實中一般不使用這個GUI工具,因為它的功能有限,也不夠透明。相比較而言,SuSE 9.0中相應(yīng)的配置工具要好得多,它可以在GUI下對防火墻進行更加細(xì)化的配置(比如增加了IP轉(zhuǎn)發(fā)和偽裝等功能的配置)。盡管這樣,一般還是自己來增加和刪除規(guī)則。

          .增加規(guī)則

          本例中的規(guī)則將會阻止來自某一特定IP范圍內(nèi)的數(shù)據(jù)包,因為該IP地址范圍被管理員懷疑有大量惡意攻擊者在活動:

          # iptables -t filter -A INPUT -s 123.456.789.0/24 -j DROP

           

          也可以很輕易地阻止所有流向攻擊者IP地址的數(shù)據(jù)包,該命令稍有不同:

          # iptables -t filter -A OUTPUT -d 123.456.789.0/24 -j DROP

           

          注意這里的A選項,如前所述,使用它說明是給現(xiàn)有的鏈添加規(guī)則。

          4.刪除規(guī)則

          網(wǎng)絡(luò)上的惡意攻擊者總是在變化的,因此需要不斷改變IP。假設(shè)一個網(wǎng)上攻擊者轉(zhuǎn)移到新的IP地址,而其老的IP地址被分配給一些清白的用戶,那么這時這些用戶的數(shù)據(jù)包將無法通過你的網(wǎng)絡(luò)。這種情況下,可以使用帶-D選項的命令來刪除現(xiàn)有的規(guī)則:

          # iptables -t filter -D OUTPUT -d 123.456.789.0/24 -j DROP

           

          5.缺省的策略

          創(chuàng)建一個具有很好靈活性、可以抵御各種意外事件的規(guī)則需要大量的時間。對于那些沒有時間這樣做的人,最基本的原則是“先拒絕所有的數(shù)據(jù)包,然后再允許需要的”。下面來為每一個鏈設(shè)置缺省的規(guī)則:

          # iptables -P INPUT DROP 
          # iptables -P FORWARD DROP 
          # iptables -P OUTPUT ACCEPT

           

          這里選項-P用于設(shè)置鏈的策略,只有三個內(nèi)建的鏈才有策略。這些策略可以讓信息毫無限制地流出,但不允許信息流入。很多時候需要接收外部信息,則可使用以下命令:

          # iptables -t filter -A INPUT -s 123.456.789.0/24 -j ACCEPT

           

          6.SYN的使用

          不能關(guān)閉所有端口,也不能只指定某些端口處于打開狀態(tài),那么怎樣才能設(shè)置一個有效的規(guī)則,既可以允許普通用戶正常通過,又可以阻止惡意攻擊者訪問網(wǎng)絡(luò)呢?

          剛開始使用iptables的人可以充分利用syn標(biāo)識來阻止那些未經(jīng)授權(quán)的訪問。iptables只檢測數(shù)據(jù)包的報頭,事實上,除 iptables以外,很多其它有用的數(shù)據(jù)包分析都是基于報頭的。比如,在進行Web沖浪時,一個請求從你的PC發(fā)送至其它地方的Web服務(wù)器上,該服務(wù)器會響應(yīng)請求并發(fā)回一個數(shù)據(jù)包,同時得到你系統(tǒng)上的一個臨時端口。與響應(yīng)請求不同的是,服務(wù)器并不關(guān)心所傳送的內(nèi)容。可以利用這種特點來設(shè)置規(guī)則,讓它阻止所有沒有經(jīng)過你系統(tǒng)授權(quán)的TCP連接:

          # iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP

           

          這里的-i指的是網(wǎng)卡,-p則是指協(xié)議,--syn則表示帶有syn標(biāo)識設(shè)置的TCP數(shù)據(jù)包。SYN用于初始化一個TCP連接,如果自己機器上沒有運行任何服務(wù)器,別人也就不會向你發(fā)送SYN數(shù)據(jù)包。

          7.有狀態(tài)的數(shù)據(jù)包的檢測

          前邊的例子把每一個數(shù)據(jù)包看成是獨立的,而不是相互關(guān)聯(lián)的,依靠的是數(shù)據(jù)包的頭信息。iptables會檢查數(shù)據(jù)包的源和目的IP地址、源和目的端口、流入數(shù)據(jù)包的順序號、TCP先后順序的信息及頭標(biāo)記(SYN、ACK、FIN、RST等)的狀態(tài),即它會跟蹤整個連接會話,從而使整個過濾過程是相互關(guān)聯(lián)的。

          8.共享一個Internet連接

          網(wǎng)絡(luò)地址翻譯和IP偽裝都可以實現(xiàn)多臺主機共享一個Internet連接,這個局域網(wǎng)可以是Linux和Windows系統(tǒng)組成的多系統(tǒng)局域網(wǎng)。假設(shè)現(xiàn)在有一臺機器,配有兩個網(wǎng)卡,其中eth0為“公共”網(wǎng)卡,eth1為“私有”網(wǎng)卡,即eth0被分配了一個靜態(tài)的、可路由的IP地址,而eth1被分配了一個私有的、不能路由的IP,該IP是屬于該局域網(wǎng)子網(wǎng)的。要實現(xiàn)上述功能,需要向nat和filter表中添加一些鏈:

          # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 
          # iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 
          # iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT

           

          這顯示了有狀態(tài)的數(shù)據(jù)包檢測的價值。請注意,這里是如何實現(xiàn)流入數(shù)據(jù)包只有在屬于一個已經(jīng)存在的連接時才被允許,而所有來自局域網(wǎng)內(nèi)流向外的數(shù)據(jù)包則都允許通過。第一條規(guī)則讓所有流出的信息看起來都是來自防火墻機器的,而并不會顯示出防火墻后面還有一個局域網(wǎng)。

          下面的命令為FORWARD和POSTROUTING鏈設(shè)置缺省的策略,在使用偽裝時,有一個缺省的POSTROUTING DROP策略非常重要,否則就可能有心懷惡意的用戶突破網(wǎng)關(guān)后偽裝自己的身份。

          # iptables -t filter -P FORWARD DROP 
          # iptables -t nat -P POSTROUTING DROP

           

          下面的命令為撥號連接設(shè)置,它可以動態(tài)地分配IP地址:

          # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

           

          9.運行服務(wù)器時的情況

          有時也會把服務(wù)器放置在防火墻后面,這時iptables就需要知道從哪兒通過數(shù)據(jù)包,設(shè)置如下所示:

          # iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.10:80 
          # iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 25 -j DNAT -to 192.168.0.11:25

           

          10.規(guī)則的保存

          到現(xiàn)在為止,所有的例子都是在命令行中進行的。在測試新的規(guī)則時,這是一種很好的方式,但一旦測試結(jié)果令人滿意,就可以將它們保存為腳本。可以使用 iptables-save 命令來實現(xiàn):

          $ iptables-save >; iptables-script

           

          信息包過濾表中的所有規(guī)則都被保存在文件iptables-script中。無論何時再次引導(dǎo)系統(tǒng),都可以使用iptables-restore命令將規(guī)則集從該腳本文件恢復(fù)到信息包過濾表。恢復(fù)命令如下所示:

          $ iptables-restore iptables-script

           

          如果愿意在每次引導(dǎo)系統(tǒng)時自動恢復(fù)該規(guī)則集,則可以將上面指定的這條命令放到任何一個初始化Shell腳本中。

          下面的例子并不是一個完整的腳本,它只是描述了如何使用變量及提供了一些附加的規(guī)則樣例。

          #!/bin/sh 
          #為變量賦值 
          IPTABLES=/sbin/iptables 
          LAN_NET="192.168.1.0/24" 
          IFACE= "eth0" 
          LO_IFACE="lo" 
          LO_IP="127.0.0.1" 
          #加載所需的內(nèi)核 
          /sbin/modprobe ip_conntrack 
          /sbin/modprobe iptable_nat 
          #缺省情況下,IP轉(zhuǎn)發(fā)都處于不可用狀態(tài),將其設(shè)置為可用狀態(tài): 
          echo "1" >; /proc/sys/net/ipv4/ip_forward 
          #使IP的動態(tài)分配功能可用 
          echo "1" >; /proc/sys/net/ipv4/ip_dynaddr 
          #每次重啟這個腳本時,最好清除以前所設(shè)的規(guī)則 
          $IPTABLES -P INPUT DROP 
          $IPTABLES -F INPUT 
          $IPTABLES -P OUTPUT ACCEPT 
          $IPTABLES -F OUTPUT 
          $IPTABLES -P FORWARD DROP 
          $IPTABLES -F FORWARD 
          $IPTABLES -F -t nat 
          #只允許在LAN中使用SSH連接 
          $IPTABLES -A INPUT -s LAN_NET -p tcp --destination-port ssh -j ACCEPT 
          #允許loopback! 
          $IPTABLES -A INPUT -i lo -p all -j ACCEPT 
          $IPTABLES -A OUTPUT -o lo -p all -j ACCEPT 
          #丟棄那些流入的宣稱是來自本地機器的數(shù)據(jù)包 
          #丟棄那些流出的不是出自本地機的數(shù)據(jù)包 
          $IPTABLES -A INPUT -i $IFACE -s $LAN_NET -j DROP 
          $IPTABLES -A OUTPUT -o $IFACE -s ! $LAN_NET -j DROP 
          #限制一些流出的信息 
          $IPTABLES -A OUTPUT -o eth0 -p tcp -dport 31337 -j DROP 
          $IPTABLES -A OUTPUT -o eth0 -p tcp -sport 31337 -j DROP 
          #此外,31335、27444、27665、20034 NetBus、9704、137-139(smb)端口也應(yīng)被禁止。



          小白

          評論

          # re: Linux防火墻 配置文件 iptables詳解  回復(fù)  更多評論   

          2012-05-11 15:01 by 小白19870626
          編輯/etc/sysconfig/iptables
          加入一條規(guī)則

          service iptables restart

          # re: Linux防火墻 配置文件 iptables詳解  回復(fù)  更多評論   

          2013-05-08 09:13 by 11
          laji

          # re: Linux防火墻 配置文件 iptables詳解  回復(fù)  更多評論   

          2014-04-24 15:11 by saint
          not too bad !
          主站蜘蛛池模板: 达日县| 惠来县| 衡阳县| 嘉定区| 溧水县| 平定县| 秦安县| 和平县| 韩城市| 桃江县| 岐山县| 满城县| 农安县| 长宁区| 莲花县| 林甸县| 桐庐县| 长岭县| 崇明县| 鞍山市| 游戏| 张北县| 清涧县| 雷山县| 砚山县| 南川市| 通榆县| 芒康县| 武穴市| 平定县| 招远市| 红河县| 上饶县| 玛多县| 宁武县| 定陶县| 荣昌县| 威信县| 西贡区| 锦州市| 中阳县|