天天看點

iptables的詳細介紹及配置方法

Firewall(防火牆):元件,工作在網絡邊緣(主機邊緣),對進出網絡資料包基于一定的規則檢查,并在比對某規則時由規則定義的處理進行處理的一組功能的元件。

防火牆類型:根據工作的層次的不同來劃分,常見的防火牆工作在OSI第三層,即網絡層防火牆,工作在OSI第七層的稱為應用層防火牆,或者代理伺服器(代理網關)。

網絡層防火牆又稱包過濾防火牆,在網絡層對資料包進行選擇,選擇的依據是系統内設定的過濾邏輯,被稱為通路控制清單(ACL),通過檢查資料流中每個資料的源位址,目的位址,所用端口号和協定狀态等因素,或他們的咋喝來确定是否允許該資料包通過。

優點:對使用者來說透明,處理速度快且易于維護。

缺點:一旦黑客突破防火牆,就可以輕易地僞造資料包的源位址,目的位址和IP的端口号,即“IP位址僞造”。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549867znuL.png"></a>

包過濾防火牆圖示

代理服務型防火牆(Proxy Service)将所有跨越防火牆的網絡通信鍊路分為兩段。當代理伺服器接收到使用者對某個站點的通路請求後會檢查該請求是否符合控制規則。如果規則允許,則代理伺服器會替使用者去那個站點取回所需要的資訊,轉發給使用者。内外網使用者的通路都是通過代理伺服器上的“連結”來實作的,進而起到了隔離防火牆内外計算機系統的作用。特點:在應用層對資料進行檢查,比較安全。但是會增加防火牆的負載。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549870oXqT.png"></a>

代理服務型防火牆圖示

現實生産環境中所使用的防火牆一般都是二者結合體。即先檢查網絡資料,通過之後再送到應用層去檢查。

netfilter元件稱為核心空間,它被內建在linux核心中。netfilter是一種核心中用于擴充各種網絡服務的結構化底層架構。它是在核心中選取五個位置放了五個hook function,而這五個hook function向使用者開放,使用者可以通過一個工具(iptables)向其寫規則。

netfilter 主要由資訊過濾表(table)組成,包含了控制IP包處理的規則集(rules)。根據規則所處理的IP包的類型,規則被分組放在鍊(chain)中,進而使核心對來自某些源,前往某些目的地或具有某些協定類型的資訊包處置方法,如完成資訊包的處理、控制和過濾等工作。

iptables也稱為使用者空間,是一個工作在使用者層用來寫規則的工具,寫好的規則被送往netfilter。這些規則告訴核心中的netfilter元件如何去處理資訊包。

五個hook function(規則鍊):Input ,Output,Forward,prerouting,postrouting。

filter:Input,Output,Forward

四種處理機制(表):過濾(filter) 主要用于過濾資料包,該表根據管理者預定義的一組規則過濾符 

                    合條件的資料包。filter表是iptables預設的表。

l INPUT:主要與想要進入我們 Linux 本機的資料包有關;

l OUTPUT:主要與我們 Linux 本機所要送出的資料包有關;

l FORWARD:與 Linux 本機比較沒有關系, 他可以傳遞資料包到背景的計算機中,與下列 nat table 相關性較高。

                    位址轉換(NAT) 主要用于網絡位址轉換,該表可實作一對一。一對多,多對多               

                    等工作,iptables就是使用該表實作共享上網功能。

l PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)

l POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE)

l OUTPUT:與發送出去的資料包包有關

                    包重構(mangle)對指定的資料包進行修改,例如更改TTL和TOS等,實際中很

                    少使用。

                    RAW  很少使用

一條鍊可以包含一條或者數條規則。

nat:prerouting,postrouting,output

mangle:Input ,Output,Forward,prerouting,postrouting。

RAW:prerouting,output

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549873L0JU.png"></a>

                       iptables傳輸資料包的過程

  1   當一個資料包進入網卡時,資料包首先進入PREROUTING鍊,核心根據資料包目的IP判斷是否需要轉送出去。

  2   如果資料包就是進入本機的,資料包就會沿着圖向下移動,到達INPUT鍊。資料包到達INPUT鍊後,任何程序都會收到它。本機上運作的程式可以發送資料包,這些資料包經過OUTPUT鍊,然後到達POSTROTING鍊輸出。

  3  如果資料包是要轉發出去的,且核心允許轉發,資料包就會向右移動,經過FORWARD鍊,然後到達POSTROUTING鍊輸出。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549878SHiS.png"></a>

                      iptables中各表與鍊的互相關系            《鳥哥的私房菜》

書寫規則:

iptables [-t table] command CHAIN [NUM ]   match criteria -j TARGET

CHAIN:  對鍊進行的操作

            -N:new     建立一條鍊

            -X          删除一條使用者自定義鍊(空鍊)

            -F:flush   清空一條鍊,預設清空表中所有鍊

            -Z:zero    清空計數器,iptables中每條規則預設有兩個計數器,用于記錄本條規則所比對到的資料包的個數和本條規則所比對到的資料包的總大小

            -P:policy  定義鍊的預設處理政策

            -E  重命名鍊

RULE:對規則進行的操作

      -A:append   追加,在鍊的最後加一條規則

       -I:insert  插入一條規則  一般使用-I CHAIN NUM 給規則加一個編号。

       -R:replace 替換某條規則,規則被替換并不會改變順序,必須要指定替換的規則編号:-R CHAIN NUM。

       -D:delete  删除一條規則,可以輸入完整規則,或者直接指定标号加以删除:-D CHAIN NUM。

LIST:檢視

    -L:list 列對外連結中的所有規則

輔助性子指令:-n  numeric 以數字的形式來顯示位址,預設顯示主機名稱

-v  verbose 顯示詳細資訊 ,支援-vv  -vvv格式,v越多,資訊越詳細。

-x  顯示原有資訊,不要做機關換算

--line-numbers  顯示規則的行号

Match Creteria(比對規則):

基本比對

     -s,--src,--source  比對資料包的源位址

     -d,--dst,--destination 比對資料包的目标位址

     -i, 指定資料包的流入接口(邏輯接口)

     -o, 指定資料包的流出接口

     -p, 做協定比對 protocol,(tcp|udp|icmp)

擴充比對:對某一種功能的擴充

      隐含擴充 :對某一種協定的擴充

      -p tcp

        --sport 指定源端口

        --dport 指定目的端口

        --tcp-flags(SYN,ACK,FIN,PSH,URG,RST,ALL,NONE)指定TCP的标志位

         需要跟兩個标志位清單,如:SYN,ACK,FIN,RST SYN 第一個清單表示要檢查的位,第二個    

         清單表示第一個清單中出現的位必須為1,未出現的必須為0

--syn  隻允許新連接配接

     -p  udp  無連接配接協定

         --sport   指定源端口

         --dport   指定目的端口

      -p  icmp

          --icmp-type  echo-request,8(ping出去,請求回應,) echo-reply,0(給予回應)

     顯式擴充 :額外附加的更多的比對規則,功能性地擴充

-m state   狀态檢測擴充

        NEW         使用者發起一個全新的請求

        ESTABLISHED 對一個全新的請求進行回應

        RELATED   兩個完整連接配接之間的互相關系,一個完整的連接配接,需要依賴于另一個完整的連接配接

        INVALID   無法識别的狀态

-m multiport   --sports  22,80,443 指定多個源端口

                    --dports  22,80,443 指定多個目标端口

                    --ports    非連續端口

     -m connlimit   限定并發連接配接速率

             !--connlimit-above 5  高于五個将拒絕

     -m string   字元串比對

             --algo bm|kmp 指定算法 

             --string pattern

     -m time  基于時間的比對

        --timestart

        --timestop

        --days

-j  TARGET    處理動作

     ACCEPT    接受

     DROP      悄悄丢棄,請求端沒有任何回應

     REJECT    明确拒絕

     SNAT      源位址轉換

     DNAT      目标位址轉換

     REDIRECT  端口重定向

     LOG       将通路記錄下來

[root@server27 ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

下面我們寫兩條規則:

隻允許192.168.0.0網段的主機通過SSH通路該主機

允許本機通過SSH連接配接192.168.0.0網段的其他主機

[root@server27 ~]# iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 22 -j ACCEPT

[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT

ACCEPT     tcp  --  192.168.0.0/24       192.168.0.127       tcp dpt:22

ACCEPT     tcp  --  192.168.0.127        192.168.0.0/24      tcp spt:22

定義預設政策

[root@server27 ~]# iptables -t filter -P INPUT DROP

[root@server27 ~]# iptables -t filter -P OUTPUT DROP

PS:上面規則一定不要寫錯了,否則你将會把自己拒之門外。

允許本機PING本網段任何主機

[root@server27 ~]# iptables -t filter -A OUTPUT -s 192.168.0.127 -d 0.0.0.0/0.0.0.0 -p icmp --icmp-type 8 -j ACCEPT   //**出去的資料包

[root@server27 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.0.127 -p icmp --icmp-type 0 -j ACCEPT   //** 回來的資料包

[root@server27 ~]# ping 192.168.0.236 -c 4

PING 192.168.0.236 (192.168.0.236) 56(84) bytes of data.

64 bytes from 192.168.0.236: icmp_seq=1 ttl=64 time=0.242 ms

64 bytes from 192.168.0.236: icmp_seq=2 ttl=64 time=0.249 ms

64 bytes from 192.168.0.236: icmp_seq=3 ttl=64 time=0.437 ms

64 bytes from 192.168.0.236: icmp_seq=4 ttl=64 time=0.204 ms

允許本網段任何主機PING本機

[root@server27 ~]# iptables -t filter -A OUTPUT -s 192.168.0.127 -d 0.0.0.0/0.0.0.0 -p icmp --icmp-type 0 -j ACCEPT 

[root@server27 ~]# iptables -t filter -A INPUT -d 192.168.0.127 -s 0.0.0.0/0.0.0.0 -p icmp --icmp-type 8 -j ACCEPT

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549881oazS.png"></a>

PS:當目标網絡指定為任意主機時,應該為0.0.0.0/0.0.0.0

凡是來自192.168.0.0/24網段的主機均使用一個自定義的新鍊

先開啟http服務

自定義一條鍊,拒絕192.168.0.0/24網段的主機對http服務的通路

[root@server27 ~]# iptables -N attach-input

[root@server27 ~]# iptables -A attach-input -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 80 -j DROP

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549882IrP0.png"></a>

此時,自定義鍊依舊無法使用,我們隻能在固定鍊上做轉發請求資料包到自定義鍊上,才能實作自定義鍊的功能。

[root@server27 ~]# iptables -A INPUT -s 192.168.0.0/24 -j attach-input

attach-input  all  --  192.168.0.0/24       0.0.0.0/0 

此時已經無法通路到網頁。

将INPUT鍊删除之後,馬上又可以通路了。

[root@server27 ~]# iptables -F INPUT

删除自定義鍊,先清空鍊,再清空規則

[root@server27 ~]# iptables -F attach-input

[root@server27 ~]# iptables -X attach-input

PS:每條規則都可以使用“!”取反。如: -s '!' 192.168.0.0/24,加單引号防止被識别成其他字元。

下面我們來實作顯式擴充狀态檢測的功能:

先将預設政策置為DROP

[root@server27 ~]# iptables -P INPUT DROP

[root@server27 ~]# iptables -P OUTPUT DROP

[root@server27 ~]# iptables -P FORWARD DROP

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 80 -j ACCEPT   //*進來的資料包

[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 80 -j ACCEPT  //*出去的資料包

但是這兩條規則對于反彈式木馬是無效的。

我們可以基于顯式擴充寫這樣兩條規則:

[root@server27 ~]# iptables -I INPUT 1 -d 192.168.0.127 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT   //**進來的資料包

[root@server27 ~]# iptables -I OUTPUT  -s 192.168.0.127 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT     //**出去的資料包

删除我們之前建立的那兩條規則:

[root@server27 ~]# iptables -D INPUT 2

[root@server27 ~]# iptables -D OUTPUT 2

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549884o5p0.png"></a>

此時,已經可以正常通路http服務。

我們試一下ftp服務:

先開啟ftp服務

先建立這樣四條規則,看看能不能達到效果,

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 21 -j ACCEPT

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 20 -j ACCEPT

[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 21 -j ACCEPT

[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 20 -j ACCEPT

用戶端請求是被動模式,實驗證明,我們僅僅開始21 20端口無法達到效果。這樣我們就得用到狀态檢測的RELATED機制。

PS:要想實作FTP的通路需先手動加載額外的子產品:ip_conntrack_ftp,ip_conntrack_tftp,ip_nat_ftp,,ip_nat_tftp(and others)

[root@server27 ~]# modprobe ip_conntrack_ftp

[root@server27 ~]# modprobe ip_nat_ftp

[root@server27 ~]# modprobe ip_nat_tftp

[root@server27 ~]# modprobe ip_conntrack_tftp

實作自動加載的功能:編輯/etc/sysconfig/iptables-config檔案,在“IPTABLES_MODULES=”後面寫上要添加的子產品就可以了。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549885oNeX.png"></a>

[root@server27 ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp -m state --state RELATED -j ACCEPT

[root@server27 ~]# iptables -R OUTPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT  //**修改上一條規則,增加RELATED狀态

[root@server27 ~]# iptables -R INPUT 3 -d 192.168.0.127 -p tcp  -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT    //**修改INPUT第三條規則,增加NEW,ESTABLISHED狀态

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549888sMlu.png"></a>

此時ftp已經可以通路了,要保證所有的規則能夠永久有效需要使用:service iptables save來儲存。

基于字元串比對的顯式擴充功能:

[root@server27 ~]# iptables -A  INTPUT  -d 192.168.0.127  -p  tcp  --dport 80 -m string  --algo  kmp  --string  'qq.com'   -j  REJECT 

PS:iptables工作在OSI第三層,第四層。預設情況下,iptables無法限定第七層的應用程式,要想實作限制七層某些應用程式的功能,需要重編譯核心,在核心上打上更新檔 layer7。.

源位址換換和目标位址轉換:

PS:源位址轉換必須在POSTROUTING鍊上做。

    目标位址轉換必須在PREROUTING鍊上做。

下面我們來實作源位址的功能:

我們假設這樣一種場景:

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549890MWW8.png"></a>

192.168.0.254是工作在外網的一台WEB伺服器,中間的那台是企業裡的NAT伺服器,我們在上面添加iptables的規則,使其實作位址轉換的功能,PC機是工作在企業内部。我們的最終目的是192.168.80.30這台計算機通過NAT伺服器可以通路到192.168.0.254的WEB服務。

實驗環境搭建:192.168.0.254  192.168.0.127使用虛拟機網卡的橋接功能;

              192.168.80.129  192.168.080.130使用虛拟機網卡的僅主機功能;

為PC機設定網關:

[root@station39 ~]# route add default gw 192.168.80.129

下面開始來配置NAT伺服器:

首先要開啟NAT伺服器的核心路由功能:

[root@server27 ~]# echo 1 &gt; /proc/sys/net/ipv4/ip_forward

[root@server27 ~]# cat /proc/sys/net/ipv4/ip_forward

1

設定規則:

[root@server27 ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -d 192.168.0.0/24 -j SNAT --to-source 192.168.0.127

[root@server27 ~]# iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)

Chain POSTROUTING (policy ACCEPT)

SNAT       all  --  192.168.80.0/24      192.168.0.0/24      to:192.168.0.127

OK,我們用192.168.80.130這台主機通路一下192.168.0.254,看,已經可以了!

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549891Mgvm.png"></a>

隻需一條規則就可以搞定,很友善吧!

PS:如果我們使用路由功能來通路254這台主機的話,WEB伺服器的通路日志将記錄的通路位址是192.168.80.130,而如果我們使用位址轉換的功能來通路的話,通路日志記錄的通路位址則是192.168.0.127。.

一般我們上網的時候,所獲得的IP都是動态的,怎麼辦?

做源位址轉換的時候,還有一個小功能MASQUERADE(位址僞裝),使用這個功能,我們不需要

指定目标位址,它會自動探測能夠上網際網路的位址,并自動将内網位址轉換過來。缺陷:比較耗費資源。

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

接下來開始實作目标位址轉換功能:

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549892Vu5H.png"></a>

場景:假設192.168.80網段為一個提供WEB服務的網站的内網,中間的為網站的NAT伺服器,遠端的用戶端192.168.0.26想通過中間的NAT伺服器來通路内部的192.168.80.130提供的WEB服務,這裡就要用到目标位址轉換了。

環境搭設:192.168.80.130  192.168.80.129使用虛拟機網卡的僅主機功能

           192.168.0.26  192.168.0.127使用虛拟機網卡的橋接功能

設定192.168.80.130的網關:

開始在NAT伺服器上設定規則:

這裡依然要打開核心的路由功能。

開始之前先将剛才做的源位址轉換實驗的規則給清除了

[root@server27 ~]# iptables -t nat -F

開始寫規則:

[root@server27 ~]# iptables -t nat -A PREROUTING -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.130

DNAT       tcp  --  192.168.0.0/24       192.168.0.127       tcp dpt:80 to:192.168.80.130

target     prot opt source               destination      

OK!規則已經寫好了,我們使用192.168.0.26來通路一下192.168.0.127試試,已經可以通路了,其實提供WEB服務的是192.168..80.130這台主機,這就是目标位址轉換的功能。

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_12995498948hHe.png"></a>

我們再檢視一下192.168.80.130這台WEB伺服器的通路日志:

<a href="http://lyp0909.blog.51cto.com/attachment/201103/8/508999_1299549895J7bx.png"></a>

看,源位址并沒有發生改變!隻是通路的目标位址被轉換到192.168.80.130上來了,這就是目标位址轉換。

l7-filter 七層過濾,對核心打更新檔之後,能夠支援對應用層資料的過濾。

編譯過程相對繁瑣一些,也不是本文主要講述内容,是以就不在此詳細說明,有興趣的朋友可以去網上查找相關教程。

編譯完成并啟用核心之後,就可以使用l7filter的過濾功能了。

我們添加這樣兩條規則:

[root@server27 ~]# iptables -t nat -A FORWARD -m layer7 --l7proto qq -j REJECT

這裡就不再示範效果了。

儲存iptables規則:

/etc/init.d/iptables save

service iptables save

儲存位置:在/etc/sysconfig/iptables檔案内:

# Generated by iptables-save v1.3.5 on Fri Mar  4 19:44:47 2011

*filter

:INPUT DROP [33:2399]

:FORWARD DROP [0:0]

:OUTPUT DROP [7:540]

-A INPUT -d 192.168.0.127 -p tcp -m tcp --dport 21 -j ACCEPT

-A INPUT -d 192.168.0.127 -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

COMMIT

# Completed on Fri Mar  4 19:44:47 2011                    

指定規則儲存位置:

iptables-save &gt; /etc/sysconfig/iptables/iptables.20110307

生效儲存的規則

iptables-restore &lt; /etc/sysconfig/iptables/iptables.20110307

避免在遠端連接配接寫規則的時候一不小心自己被防火牆拒之門外,可以寫一個小腳本:

#!/bin/bash

iptables -F

iptables -P  INPUT   ACCEPT

iptables -P  OUTPUT  ACCEPT

at now+10min

測試完成之後停掉腳本就可以了。

本文轉自 490999122 51CTO部落格,原文連結:http://blog.51cto.com/lyp0909/509408,如需轉載請自行聯系原作者

繼續閱讀