天天看點

iptables淺析

    防火牆一般是指由軟體和硬體裝置組合而成、在内部網和外部網之間、專用網與公共網之間的界面上構造的保護屏障,通過設定防火牆規則來保護我們的内網。

    防火牆的類型有兩種:

    1,網絡層的包過濾防火牆:

    工作在網絡層,可以定義特定的規則禁止或允許某些特定的資料包通過,例如利用封裝包的多樣屬性進行過濾:來源ip,目的ip,來源端口号,目的端口号,通信協定等。

    2,應用層防火牆

    工作在應用層,應用層防火牆可以攔截進出某應用程式(例如qq,迅雷等)的所有封包,并且封鎖其他的封包(通常是直接将封包丢棄)。

     什麼是iptables呢?

    它是一種基于包過濾的防護牆,已經靜态編譯進了kernel中,需要linux kernel 2.4以上的版本支援。但是,可以通過給kernel打更新檔,使我們的iptables具有應用層防火牆的功能。

下面是包過濾防火牆的相關原理及配置:

包過濾防火牆一般包含有3個表(還有一個raw表):

1,filter table:過濾表(預設使用的就是filter表)

   包含三個鍊:

   INPUT:處理輸入資料包

   FORWARD:處理轉發資料包

   OUTPUT:處理輸出資料包     

2,NAT table:用于網絡位址轉換

   POSTROUTING:處理路由後的資料包

   OUTPUT :處理輸出資料包

   PREROUTING:處理路由前的資料包

3,mangle table:矯正表,針對政策路由(不做講解)

我們用下圖來說明iptables的工作原理(netfilter的原理):

首先,我們要知道:iptables隻是linux使用者态下的指令行前台程式,用于操作netfilter,而netfilter真正完成核心态下的資料包的過濾處理。我們可以認為iptables完成了這些工作。

TCP/IP是内置在kernel中的,而iptables又工作在網絡層,故包過濾是在kernel空間中實作的。如果目的ip是本機的話,即從kernel空間轉到使用者空間,進行處理。如果通路的不是本機,則不進入使用者空間,直接在kernel空間進行處理。TCP/IP是在記憶體中完成工作,而使用者空間中的工作也是在記憶體中。故記憶體也是分區的,一部分用于使用者空間,另一部分用于核心空間。

<a href="http://blog.51cto.com/attachment/201203/220339201.jpg" target="_blank"></a>

netfilter通過自己的五個鈎子函數,來實作包過濾,而五個鈎子函數分别應用在如圖所示的五個地方,五個鈎子函數為:

1, NF_IP_LOCAL_IN

2, NF_IP_LOCAL_OUT

3, NF_IP_FORWARD

4, NF_IP_PRE_ROUTING

5, NF_IP_POST_ROUTING

1, filter table:

filter表格不會對資料報進行修改,而隻對資料報進行過濾,它是通過鈎子函數NF_IP_LOCAL_IN, NF_IP_FORWARD及NF_IP_LOCAL_OUT來實作過濾。

2,NAT table:

監聽三個Netfilter鈎子函數:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。 NF_IP_PRE_ROUTING實作對需要轉發的資料報的源位址進行位址轉換而NF_IP_POST_ROUTING則對需要轉發的資料包的目的位址進行位址轉換。對于本地資料報的目的位址的轉換則由NF_IP_LOCAL_OUT來實作

3, mangle table:

在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT中監聽。使用mangle表,可以實作對資料報的修改或給資料報附上一些帶外資料。

而對與iptables的規則,優先級和規則的寫入順序是非常重要的:

處理優先級:mangle&gt;nat&gt;filter

規則:從上到下進行比對,比對到了就不在向下繼續比對

iptables的用法:(規則的順序是非常重要的,下面的例子隻是說明相對應指令的用法)

1, iptables的指令文法:

# iptables [-t table] sub_command [chain]  [num] [cretiria] [-j acction]

-t:用于指定要進行操作的表

    filter :包過濾(預設表)

nat:nat轉換

mangle:政策路由

sub_command:子指令

  -A:在所選擇的鍊末尾添加一條規則

 例:iptables –t filter –A INPUT –j ACCEPT

在filter表的INPUT鍊追加一條規則配置所有通路本地的資料包,比對後丢棄

 -D:從所選鍊中删除一條規則。有兩種方法:把被删除規則指定為鍊中的序号(第一條序号為1),或者指定為要比對的規則内容;

例:iptables –D INPUT 1  (不寫-t,預設是對filter表操作)

删除filter表的INPUT鍊的第一條規則

iptables –D INPUT –s 192.168.0.1 –j DROP

删除filter表中INPUT鍊内容為” –s 192.168.0.1 –j DROP”的規則

-R:從選中的鍊中替換一條規則。規則序号從1開始;

例:iptables –R INPUT 3 –j ACCEPT

将原來的第三條規則内容替換成”-j ACCEPT”

-I:根據給出的規則序号,向所選鍊中插入一條規則。預設插入成第一條規則

例:iptables –I INPUT –j DROP

在filter表的INPUT鍊插入一條規則,插入成第一條

    iptables -I INPUT 3 -j DROP

在filter表的INPUT鍊插入一條規則,插入成第三條

  -F:清空所選鍊的所有規則(不包括預設規則)

例:iptables –t flter –F INPUT

清空filter表INPUT鍊中所有規則

iptables –F

清空filter表中所有規則

-N:建立自定義的鍊

例:iptables -N clean_in

在filter表上建立一個新鍊clean_in

-X :删除使用者自定義的空鍊,若不空,先清空,再删

例:iptables –X clean_in

-P:設定鍊的預設規則,即資料包在規則中都沒有比對到,就用預設規則處理(預設情況下,鍊的預設規則都死ACCEPT)

例:iptables –P INPUT DROP

設定filter表INPUT鍊預設規則為DROP(丢棄)

iptables –P INPUT REJECT (直接拒絕)

iptables –P INPUT ACCEPT  (接受)

 檢視指令:

-L:顯示所選表的所有鍊的所有規則

例:iptables –L

顯示filter表中所有鍊的所有規則

   -n :隻顯示IP位址,不反解析成FQDN,一般與-L合用

   例:iptables –L –n

   -v:顯示詳細資訊

   例:iptables -t nat –L -vn

   顯示nat表所有鍊的詳細資訊

   -x:顯示精确值,不進行機關換算

   --line-numbers:顯示的時候顯示規則的行号

   例:iptables   -L -n --line-numbers

   cretiria(比對條件):

通用比對:

    -s IP/network    表示某ip包的源位址

    -s ! IP/network   取反

    -d IP/network    表示目标IP

    -d ! IP/network   取反

    -i interface  (input interface)流入接口

    -o interface  (output interface)流出接口

擴充比對:

隐式擴充:一般指對-p選項中指定的協定進行擴充

-p (tcp|udp|icmp)指定協定

   --sport  指定源端口

   可以指定一個端口範圍,用:隔開

   例:--sport 1000:3000 比對源端口1000到3000的資料包

   --dport  指定目的端口

例:iptables –P INPUT  DROP

iptables –A INPUT -d 1.1.1.1 -p tcp --dport 80 –j ACCEPT

這兩條意思為:僅允許任意主機通路本機1.1.1.1的web服務

如果指定的是icmp協定的話,有如下的類型:

   -p icmp –icmp-type 8

   指定icmp的請求包

   -p icmp –icmp-type 0

   指定icmp的應答包

   例:iptables –A INPUT –s 192.168.1.0/24 –d 1.1.1.1 –p icmp –icmp-type 8 –j DROP

禁止192.168.1.0網絡的主機ping主機1.1.1.1

顯式擴充:一般必須指定-m選項明确指定要加載的擴充

-j TARGET     調轉到指定的目标進行處理

    ACCEPT  直接接受

    DROP    直接丢棄

    REJECT  指接拒絕

state:連接配接狀态 

     --state state

     NEW:表示是建立立的連接配接請求

  #iptables –A OUTPUT –o eth1 –m state --state NEW –j DROP     

  禁止本機發送建立連接配接的請求

    ESTABLISHED :表示所有已建立的連接配接

   #iptables –P OUTPUT DROP

   #iptables –A OUTPUT –s 172.16.100.1 –m state --state ESTABLISHED –j ACCEPT

   這兩條的意思為:僅允許本機回應狀态是已建立連接配接的請求

   iptables –P INPUT DROP

   iptables –A INPUT –d 172.16.100.1 –p tcp --dport 80 –m state --state NEW,ESTABLISHED –j ACCPT

   這兩條的意思為:允許目标位址是172.16.100.1,目标端口是80,狀态是建立和已建立連接配接的請求進入

RELATED:   主要用于ftp服務;

INVALIED:   無法識别的狀态

多端口比對:

-m(mport|multiport) 多端口比對

 --source-ports [!] port,port,port...    源端口,加“!”取反

 --desrination-ports [!] port,port,port... 目标端口

 --ports [!] port,port,port...        多個端口,用“,”隔開

--ports:表示源和目的端口

例:iptables -P INPUT DROP

iptables -A INPUT -d 172.16.100.1 -p tcp -m mport --destination-ports 80,22,23 -m state --state NEW,ESTABLISHED -j ACCEPT

隻允許使用tcp協定,目标端口是80,22,23,狀态是建立和已建立的連接配接的請求進入

多位址比對:

-m iprange   IP位址範圍的擴充,指定了如何限定某個特定位址範圍内的IP

    [!] --src-range ip-ip

    [!] --dst-range ip-ip

例:iptables -A INPUT -d 172.16.100.1 -m iprange --src-range 192.16.1.9-192.168.1.200 -p tcp --dport 80 -m state --state NEW -j DROP

不允許192.16.1.9到192.168.1.200範圍内的主機通路172.16.100.1主機的web服務

connlimit:用于限制某個位址并發連接配接請求的個數

[!] --connlimit-above n   放行沒超出範圍的

limit:資料包的發送速率的限制

--limit rate    平均每機關時間内比對多少個資料包

--limit-burst number   預設是5,峰值,突發限制數量的上限

例:

對進來的資料包接受目标位址是172.16.100.1目标端口是80的請求,每秒隻能有1個,最大并發請求量為3個

# iptables -I INPUT 1 -p tcp -d 172.16.100.1 --dport 80 -j ACCEPT

# iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT

# iptables -R INPUT 1 -d 172.16.100.1 -p tcp --dport 80 -m limit --limit 10/second --limit-burst 30 -j ACCEPT

-m time:用于指定在什麼時間段放行請求:

--timestart value   

--timestop value    

--days listofdays     (format: Mon, Tue, Wed, Thu, Fri, Sat, Sun ; default everyday)

--datestart date      

--datestop date       (  format: YYYY[:MM[:DD[:hh[:ss]]]]  )

2月18日-26日,每天的8:30到14:30之間能通路web服務:

iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m time --timestart 08:30:00 --timestop 14:30:00 --datestart 2012:02:18 --datestop 2012:02:26 -j ACCEPT

-m string:做字元串比對(對中文的比對非常有限)

  --algo bm|kmp  比對算法,這個是一個應用層的算法

  --string pattern 

由于在網頁上顯示的内容,是經過編碼的,故要使用某一個字算法把對應的字元串編碼之後再進行比對。這兩個選項都是必須的

允許請求中,如果有通路Web的都不允許通路:

# iptables -A OUTPUT -s 172.16.100.1 -p tcp --sport 80 -m --algo bm --string "web" -j DROP

下面是利用iptables實作網絡位址轉換,需要對NAT表進行操作:

SNAT:源位址轉換,實作代理内網用戶端通路網際網路的

--to-source ipaddr(, ipaddr, ipaddr...)

轉換到的某個源位址上(當有多個網關時,指定多個源位址才有意義)

例:iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m iprange -src-range 192.168.10.1-192.168.10.100 -j SNAT --to-source 1.1.1.1

将192.168.10.1-192.168.10.100網段資料包的源位址轉換成1.1.1.1來通路外網

 MASQUERADE: 位址僞裝,目前主機自動選一個能夠通路網際網路的ip位址作為SNAT。是以不用使用--to-source了。若位址是靜态獲得的,一定不要使用這個,因為效率比較低。

例:iptables -t nat -A POSTROUTING -m iprange --src-range 192.168.100.1-192.168.100.100 -j MASQUERADE

DNAT:目标位址轉換,可以實作多個伺服器通過一個公網位址提供服務,并能保證安全性

--to-destination

 例:iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.6(:8080)

當有使用者通路1.1.1.1主機的80端口時,把請求裝換成通路内網主機192.168.10.6的8080端口

啟動iptables服務:

#service iptables start|stop|restart

iptables本身定義的規則立即生效,但是重新開機iptables服務就會失效。故要用

#service iptables save 來儲存規則,這樣會永久生效,規則會寫在/etc/sysconfig/iptables

項目:如下圖所示,192.168.1.0/24是“狼窩”,在要求為172.16.x.1寫規則,滿足以下求:

1、filter表所有連結的預設規則為DROP;

2、lo接口上進出的所有資料包均放行;

3、Web和ssh開放給非“狼窩”的主機;

       1)ssh僅允許在工作時間(每周一至周五的9:00-18:00)被通路,但172.16.0.0/16網絡中的主機可在任意時段通路;

       2)web服務全時段可被通路,但每秒種接收的新請求的個數不能超過100個;

4、發往本機的ping請求,每秒隻響應兩個資料包,且最高每秒隻響應3個;拒絕來自“狼窩”的ping請求;本機可向任意主機發送Ping請求;

5、本機出口僅将已經建立的連接配接放行;

<a href="http://blog.51cto.com/attachment/201203/220311916.jpg" target="_blank"></a>

# iptables -P INPUT DROP

# iptables -P FORWARD DROP

# iptables -P OUTPUT DROP

# iptables -i lo -j ACCEPT

# iptables -o lo -j ACCEPT

# iptables -A INPUT -s 0.0.0.0/0.0.0.0 -j clean_in

# iptables -A INPUT -s 192.168.1.0/24 -d 172.16.100.1 -j DROP

# iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

# iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -j ACCEPT

# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A INPUT -d 172.16.100.1 -p tcp --dport 22 -m time --timestart 09:00:00 --timestop 18:00:00 --days Mon,Tue,Wed,Thu,Fri -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A INPUT -d 172.16.100.1 -p ICMP --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT

# iptables -A INPUT -d 172.16.100.1 -p ICMP --icmp-type 0 -j ACCEPT

# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -s 172.16.100.1 -p ICMP --icmp-type 0 -j ACCEPT

# iptables -A OUTPUT -s 172.16.100.1 -p ICMP --icmp-type 8 -j ACCEPT

# iptables -N clean_in

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP

# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP

# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

# iptables -A clean_in -d 172.16.100.1 -j RETURN

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

繼續閱讀