iptables配置說明

1.iptables的發展:html

 對於TCP/IP的七層模型來說,咱們知道第三層是網絡層,三層的防火牆會在這層對源地址和目標地址進行檢測。iptables是網絡層的防火牆.
 
iptables的前身叫ipfirewall (內核1.x時代),這是一個做者從freeBSD上移植過來的,可以工做在內核當中的,對數據包進行檢測的一款簡易訪問控制工具。可是ipfirewall工做功能極其有限(它須要將全部的規則都放進內核當中,這樣規則纔可以運行起來,而放進內核,這個作法通常是極其困難的)。當內核發展到2.x系列的時候,軟件改名爲ipchains,它能夠定義多條規則,將他們串起來,共同發揮做用,而如今,它叫作iptables,能夠將規則組成一個列表,實現絕對詳細的訪問控制功能。
 
他們都是工做在用戶空間中,定義規則的工具,自己並不算是防火牆。它們定義的規則,可讓在內核空間當中的netfilter來讀取,而且實現讓防火牆工做。而放入內核的地方必需要是特定的位置,必須是tcp/ip的協議棧通過的地方。而這個tcp/ip協議棧必須通過的地方,能夠實現讀取規則的地方就叫作 netfilter.(網絡過濾器)
做者一共在內核空間中選擇了5個位置,
1.內核空間中:從一個網絡接口進來,到另外一個網絡接口去的
2.數據包從內核流入用戶空間的
3.數據包從用戶空間流出的
4.進入/離開本機的外網接口
5.進入/離開本機的內網接口
在內核空間中選擇了5個位置進行過濾。來做爲控制的地方,可是你有沒有發現,其實前三個位置已經基本上能將路徑完全封鎖了,可是爲何已經在進出的口設置了關卡以後還要在內部卡呢? 因爲數據包還沒有進行路由決策,還不知道數據要走向哪裏,因此在進出口是沒辦法實現數據過濾的。因此要在內核空間裏設置轉發的關卡,進入用戶空間的關卡,從用戶空間出去的關卡。那麼,既然他們沒什麼用,那咱們爲何還要放置他們呢?由於咱們在作NAT和DNAT的時候,目標地址轉換必須在路由以前轉換。因此咱們必須在外網然後內網的接口處進行設置關卡。     
這五個位置也被稱爲五個鉤子函數(hook functions),也叫五個規則鏈。
1.PREROUTING (路由前)   進入netfilter後的數據包在進入路由判斷前執行的規則。改變包。
2.INPUT (數據包流入口)    當通過路由判斷後,要進入本機的數據包執行的規則。
3.FORWARD (轉發管卡)  通過路由判斷後,目的地不是本機的數據包執行的規則。與nat 和 mangle表相關聯很高,與本機沒有關聯。
4.OUTPUT(數據包出口)  由本機產生,需向外發的數據包執行的規則。
5.POSTROUTING(路由後) 通過路由判斷後,發送到網卡接口前。即數據包準備離開netfilter時執行的規則。
  這是NetFilter規定的五個規則鏈,任何一個數據包,只要通過本機,必將通過這五個鏈中的其中一個鏈。    
(圖片中的說明單網卡和雙網卡的的過濾位置)

咱們如今用的比較多個功能有3個:
1.filter 定義容許或者不容許的,對於filter來說通常只能作在3個鏈上:INPUT ,FORWARD ,OUTPUT
2.nat 定義地址轉換的  ,對於nat來說通常也只能作在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING
3.mangle功能:用於高級路由信息包,如包頭內有更改(如tos改變包的服務類型,ttl包的生存時間,mark特殊標記),而mangle則是5個鏈均可以作:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
注意:規則的次序很是關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。

 

 

爲了更方便的測試,linux作爲單機防火牆測試,圖中的linux1和linux2以作了nat.具體配置流程查看連接。linux

http://www.cnblogs.com/Yuanbangchen/p/5840297.html服務器

三.規則的寫法:
 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
          iptable  [-t 表名]  -命令        [連接]  [匹配]      [-j 動做/目標]
 -t table :3個filter nat mangle
 COMMAND:定義如何對規則進行管理
 chain:指定你接下來的規則究竟是在哪一個鏈上操做的,當定義策略的時候,是能夠省略的
 CRETIRIA:指定匹配標準
-j ACTION:指定動做
 (一) table  (表)
一、filter表:默認用filter表執行全部的命令。只操做與本機有關的數據包。
二、nat表:主要用於NAT地址轉換。只有數據流的第一個數據包被這個鏈匹配,後面的包會自動作相同的處理。
 分爲:DNAT(目標地址轉換)、SNAT(源地址轉換)、MASQUERADE
(1)DNAT操做主要用在這樣一種狀況,你有一個合法的IP地址,要把對防火牆的訪問 重定向到其餘的機子上(好比DMZ)。也就是說,咱們改變的是目的地址,以使包能重路由到某臺主機。
(2)SNAT 改變包的源地址,這在極大程度上能夠隱藏你的本地網絡或者DMZ等。內網到外網的映射。
(3)MASQUERADE 的做用和SNAT徹底同樣,只是計算機的負荷稍微多一點。由於對每一個匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。
       固然,這也有好處,就是咱們可使用經過PPP、 PPPOE、SLIP等撥號獲得的地址,這些地址但是由ISP的DHCP隨機分配的。
三、mangle表:用來改變數據包的高級特性,通常不用。

(二) command(命令)詳解 
一、 -A或者--append     //將一條或多條規則加到鏈尾  
二、 -D或者--delete     //從鏈中刪除該規則
三、 -R或者--replace   //從所選鏈中替換一條規則
四、 -L或者--list       //顯示鏈的全部規則  
  -v 顯示鏈更詳細的規則     
  -N 顯示鏈全部規則,並以數字形式顯示。跟-L配合使用。
五、 -I或者--inset     //根據給出的規則序號,在鏈中插入規則。按序號的順序插入,如是 「1」就插入鏈首
六、 -X或者--delete-chain  //用來刪除用戶自定義鏈中規則。必須保證鏈中的規則都不在使用時才能刪除鏈。如沒有指定鏈,將刪除全部自定義鏈中的規則。
七、 -F或者--flush        //清空所選鏈中的全部規則。如指定鏈名,則刪除對應鏈的全部規則。如沒有指定鏈名,則刪除全部鏈的全部規則。
八、 -N或者--new-chain      //用命令中所指定的名字建立一個新鏈。
九、 -P或者--policy        //設置鏈的默認目標,即策略。 與鏈中任何規則都不匹配的信息包將強制使用此命令中指定的策略。 
十、-Z或者--zero        //將指定鏈中的全部規則的包字節計數器清零。
測試說明
[linux1]iptables -t filter  -P INPUT ACCEPT  設置 INPUT鏈中的默認規則爲ACCEPT
[linux1]iptables -t filter -L INPUT  查看filter中INPUT鏈的規則
[linux1]iptables -t filter -D INPUT 1  刪除表filter中INPUT鏈的第一條規則
[linux1]iptables -t filter -I INPUT 2 -p icmp -j DROP  插入規則,放在第二條,拒絕icmp協議進入linux
[linux1]iptables -t filter  -R INPUT 2 -p icmp -j ACCEPT  替換INPUT鏈中的規則,
[linux1]iptables -t filter -F INPUT  //清空INPUT鏈中的全部規則
(三) match 匹配
分爲四大類:通用匹配、隱含匹配、顯示匹配、針對非正常包的匹配
一、通用匹配
   不管咱們使用何種協議,裝入何種擴展,通用匹配均可以使用。不須要前提條件
(1) -p(小寫)或--protocol  
用來檢查某些特定協議。協議有TCPUDPICMP三種。可用逗號分開這三種協議的任何組合。也可用「!」號進行取反,表示除該協議外的剩下的協議。也可用all表示所有協議。默認是all,但只表明tcpudpicmp三種協議。
$ iptable -A INPUT -p TCP,UDP
$ iptable -A INPUT -p ! ICMP     //這兩種表示的意思爲同樣的。
 (2) -s 或 --source
以Ip源地址匹配包。根據源地址範圍肯定是否容許或拒絕數據包經過過濾器。可以使用 「!」符號。默認是匹配全部ip地址。
但是單個Ip地址,也能夠指定一個網段。  如: 192.168.1.1/255.255.255.255  表示一個地址。   192.168.1.0/255.255.255.0  表示一個網段。
(3) -d  或 --destination 
用目的Ip地址來與它們匹配。與  source 的格式用法同樣
[linux1]iptables -t filter -I FORWARD -p tcp -s 192.168.80.100/32 -d 192.168.10.200/32 --dport 3389 -jDROP(拒絕IP地址爲80.100,XP遠程win2003.目標端口是3389)
(4)-i  或 --in-interface
   指定數據包從哪一個網絡接口進入。只能用INPUT FORWARD PREROUTING 三個鏈中。用在其餘任何鏈中都會出錯。可以使用「+」  「!」兩種符號。
  只用一個「+"號,表示匹配全部的包,不考慮使用哪一個接口。如: iptable -A INPUT  -i +  //表匹配全部的包。
  放在某類接口後面,表示全部此類接口相匹配。如:    iptable  -A INPUT -i eth+   //表示匹配全部ethernet 接口。
[linux1]iptables -t filter -I INPUT 2 -p icmp -i eth1 -j DROP  插入規則,拒絕icmp協議從eth1進入linux ( 使用xp ping linux1不通,使用xp ping win2003通(使用的是FORWARD),)
(5)  -o  --out-interface
  指定數據包從哪一個網絡接口輸出。與-i同樣的使用方法。只能用OUTPUT FORWARD POSTROUTING 三個鏈中。用在其餘任何鏈中都會出錯.可以使用「+」  「!」兩種符號。
 (6)  -f  ( --fragment )
      用來匹配一個被分片的包的第二片或之後的部分。因一個數據包被分紅多片之後,只有第一片帶有源或目標地址。後面的都不帶 ,因此只能用這個來匹配。可防止碎片攻擊。
二、隱含匹配
   這種匹配是隱含的,自動的載入內核的。如咱們使用 --protocol tcp  就能夠自動匹配TCP包相關的特色。
   分三種不一樣協議的隱含匹配:tcp   udp  icmp
    1 tcp 
       tcp match 只能隱含匹配TCP包或流的細節。但必須有  -p tcp 做爲前提條件。
     TCP --sport  
            基於tcp包的源端口匹配包  ,不指定此項則表示全部端口。
            iptable -A INPUT -p  TCP  --sport   22:80    //TCP源端口號22到80之間的全部端口。
            iptable -A INPUT -p  TCP  --sport   22:      //TCP源端口號22到65535之間的全部端口。     
      TCP --dport  
            基於tcp包的目的端口來匹配包。   與--sport端口用法同樣。
      TCP --flags  
            匹配指定的TCP標記。 
            iptable  -p  TCP --tcp-flags  SYN,FIN,ACK   SYN
   2   UDP match
       UDP --sport  
            基於UDP包的源端口匹配包  ,不指定此項則表示全部端口。
        UDP --dport  
            基於UDP包的目的端口匹配包  ,不指定此項則表示全部端口。
  3   -m icmp  --icmp-type
       根據ICMP類型包匹配。類型 的指定可使用十進制數或相關的名字,不一樣的類型,有不一樣的ICMP數值表示。也能夠用「!」取反。
  類型 8 echo-request    請求
  類型0 echo-reply
  [linux1] iptables -t filter -I FORWARD -s 192.168.10.0/24 -d 192.168.80.0/24 -p icmp -m icmp --icmp-type 8 -j DROP 拒絕win2003與xp新建會話。xp向2003是容許的。
  [linux1] iptables -t filter -I INPUT  -p icmp -m icmp --icmp-type echo-request -j DROP 拒絕ping linux1 ,單向的。
  三、顯示匹配
    顯示匹配必須用  -m裝 載。 
     (0)-m state  --state  基於狀態的數據包。--state {NEW,ESTATBLISHED,INVALID,RELATED}  指定檢測那種狀態
  NEW:表示該封包想要開始一個新的鏈接
  ESTATBLISHED:表示該封包屬於某個已經創建的鏈接。
  INVALID:表示該封包的鏈接編號沒法辨識或編號不正確。
  RELATED:表示該封包屬於某個已經創建的鏈接,所創建的新鏈接。例如   FTP 鏈接一定是源自某個 FTP鏈接。先21鏈接,再22鏈接。
      [linux1]iptables -t filter -I FORWARD  -s 192.168.10.0/24 -d 192.168.80.0/24 -m state --state NEW  -j DROP  拒絕win2003與xp新建會話(單向拒絕)。xp向2003是容許的。
  [linux1]iptables -t filter -I OUTPUT -m state --state NEW  -j DROP  (linux1禁止主動與客戶端口創建會話, 客戶端口能夠與lunux1創建會話)
     (1)-m limit    
       必須用 -m limit 明確指出。  能夠對指定的規則的匹配次數加以限制。即,當某條規則匹配到必定次數後,就再也不匹配。也就是限制可匹配包的數量。這樣能夠防止DOS攻擊。
       限制方法: 設定對某條規則 的匹配最大次數。設一個限定值 。 當到達限定值之後,就中止匹配。但有個規定,在超過限制次數後,仍會每隔一段時間再增長一次匹配次數。但增長的空閒匹配數最大數量不超過最大限制次數。
        --limit rate
          最大平均匹配速率:可賦的值有'/second', '/minute', '/hour', or '/day'這樣的單位,默認是3/hour。
     192.168.10.0網段每分種向192.168.80.0發送數據包不能超過300個。 1500字節*300=450K, 超了就拒絕。
    [linux1]iptables -t filter -I FORWARD  -s 192.168.10.0/24 -d 192.168.80.0/24 -m limit --limit 300/second   -j ACCEPT 
    [linux1]iptables -t filter -A FORWARD  -s 192.168.10.0/24 -d 192.168.80.0/24  -j DROP  
     
    for((i=2;i<254;i++))
    do
    iptables -I FORWARD -s 192.168.10.$i -j DROP
    iptables -I FORWARD -s 192.168.10.$i  -m limit --limit 300/sec --limit-burst 500 -j ACCEPT
    done
        --limit-burst number
         待匹配包初始個數的最大值:若前面指定的極限還沒達到這個數值,則概數字加1.默認值爲5
    iptable -A INPUT -m limit --limt 3/hour    //設置最大平均匹配速率。也就是單位時間內,可匹配的數據包個數。   --limt 是指定隔多 長時間發一次通行證。
    iptable -A INPUT  -m limit --limit-burst 5  //設定剛開始發放5個通行證,也最多隻可匹配5個數據包。
    前5個數據包不限速,第6個開限速。
    iptables -I FORWARD -s 192.168.10.200 -d 192.168.80.100  -m limit --limit 300/sec --limit-burst 5 -j ACCEPT
    容許ping 最多5個數據包。第6個將使用第二條規則來決定數據包的走向。
    [linux1]iptables -t filter -I FORWARD  -s 192.168.10.200 -d 192.168.80.100  -p icmp -m limit --limit-burst 5  -j ACCEPT
       [linux1]iptables -A filter -I FORWARD  -s 192.168.10.200 -d 192.168.80.100  -p icmp  -j DROP
  
  (2) mac   只能匹配MAC源地址。基於包的MAC源地址匹配包  ,OUTPUT和POSTROUTING鏈上不能用。
      [linux1]iptable -A  FORWARD -d 192.168.80.100 -m mac  --mac-source   00:00:eb:1c:24  -j DROP   //MAC地址禁止訪問80.100
  (3)  mark 
       以數據包被 設置的MARK來匹配包。這個值由  MARK TARGET 來設置的。
  (4)  -m  multiport 
         這個模塊匹配一組源端口或目標端口,最多能夠指定15個端口。只能和-p tcp 或者 -p udp 連着使用。
        多端口匹配擴展讓咱們可以在一條規則裏指定不連續的多個端口。若是沒有這個擴展,咱們只能按端口來寫規則了。這只是標準端口匹配的加強版。不能在一條規則裏同時用標準端口匹配和多端口匹配。
    三個選項:   --source-ports   ;  --destination-ports  ;   --ports
   [linux1]iptables -t filter -I FORWARD  -p tcp -s 192.168.10.0/24 -d 192.168.80.0/24   -m multiport --source-ports 1:1022,3389 -j DROP 拒絕1到1024 和3389鏈接。
        iptable  -A INPUT  -p TCP   -m  multiport  --sport 1:1024,115       
        iptable  -A INPUT  -p TCP   -m  multiport  --dport 22,28,115 
        iptable  -A INPUT  -p TCP   -m  multiport  --port 22,28,115
  
(5) -m iprange  指定地址範圍   --src-range ip-ip    --dst-range ip-ip
   [linux1]iptables -t filter -I FORWARD  -m iprange --src-range 192.168.80.1-192.168.80.100 -j  DROP   拒絕192.168.80.1-192.168.80.100訪問
(6) -m connlimit限制最大鏈接個數。 --connlimit-above  
   [linux1]iptables -t filter -I FORWARD  -p tcp --dport 3389  -s 192.168.80.100  -d 192.168.10.200 -m connlimit --connlimit-above 2 -j DROP 拒絕超過2個以上的遠程會話。 
(7)   ttl match
     根據IP頭裏的TTL字段來匹配包。
用來更改包的TTL,有些ISP根據TTL來判斷是否是有多臺機器共享鏈接上網。
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 1
   # 離開防火牆的時候實際上TTL已經-2了,由於防火牆自己要-1一次。
   iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1
   # 離開防火牆的時候不增不減,tracert就很差用了,呵呵。
(8) owner match
基於包的生成者(即全部者或擁有者)的ID來匹配包。 
owner 能夠是啓動進程的用戶的ID,或用戶所在的級的ID或進程的ID,或會話的ID。此只能用在OUTPUT 中。
此模塊設爲本地生成包匹配包建立者的不一樣特徵。並且即便這樣一些包(如ICMP ping應答)還可能沒有全部者,所以永遠不會匹配。
--uid-owner userid
若是給出有效的user id,那麼匹配它的進程產生的包。
--gid-owner groupid
若是給出有效的group id,那麼匹配它的進程產生的包。
--sid-owner seessionid
根據給出的會話組匹配該進程產生的包。
 
( 四) targets/jump    指由規則指定的操做,對與規則匹配的信息包執行什麼動做。
一、accept
這個參數沒有任何選項。指定  -j accept 便可。 
一旦滿 足匹配再也不去匹配表或鏈內定義的其餘規則。但它還可能會匹配其餘表和鏈內的規則。即在同一個表內匹配後就到上爲止,不往下繼續。
二、drop 
-j drop   當信息包與規則徹底匹配時,將丟棄該 包。不對它作處理。而且不向發送者返回任何信息。也不向路由器返回信息。
三、reject
與drop相同的工做方式,不一樣的是,丟棄包後,會發送錯誤信息給發送方。
   iptables -A FORWARD -p icmp -s 192.168.10.100 -j REJECT    目標端口不可到達
   iptables -A FORWARD -p icmp -s 192.168.10.100 -j DROP      超時。
四、DNAT
用在prerouting鏈上。
作目的網絡地址轉換的。就是重寫目的的IP地址。
若是一個包被匹配,那麼和它屬於同一個流的全部的包都會被自動轉換。而後能夠被路由到正確的主機和網絡。
也就是如同防火牆的外部地址映射。把外部地址映射到內部地址上。
iptables -t nat   -A PREROUTING   -d 218.104.235.238 -p TCP  --dport 110,125    -j DNAT --to-destination  192.168.9.1 
//把全部訪問218.104.235.238地址  110.125端口的包所有轉發到 192.168.9.1上。
--to-destination   //目的地重寫
五、SNAT
用在nat 表的postrouting鏈表。這個和DNAT相反。是作源地址轉換。就是重寫源地址IP。 經常使用在內部網到外部網的轉換。
--to-source 
iptables -t nat POSTROUTING  -o eth0 -p tcp  -j SNAT --to-source 218.107.248.127  //從eth0接口往外發的數據包都把源地址重寫爲218.107.248.127
********************
   iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.9
   # 將全部的訪問15.45.23.67:80端口的數據作DNAT發到192.168.1.9:80
   若是和192.168.1.9在同一內網的機器要訪問15.45.23.67,防火牆還須要作設置,改變源IP爲防火牆內網IP 192.168.1.1。不然數據包直接發給內網機器,對方將丟棄。
   iptables -t nat -A POSTROUTING -p tcp --dst 15.45.23.67 --dport 80 -j SNAT --to-source 192.168.1.1
   # 將全部的訪問15.45.23.67:80端口的數據包源IP改成192.168.1.1
   若是防火牆也須要訪問15.45.23.67:80,則須要在OUTPUT鏈中添加,由於防火牆本身發出的包不通過PREROUTING。
   iptables -t nat -A OUTPUT --dst 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.9
********************
六、MASQUERADE
masquerade 的做用和 SNAT的做用是同樣的。 區別是,他不須要指定固定的轉換後的IP地址。專門用來設計動態獲取IP地址的鏈接的。
MASQUERADE的做用是,從服務器的網卡上,自動獲取當前ip地址來作NAT
如家裏的ADSL上網,外網的IP地址不是固定的,你沒法固定的設定NAT轉換後的IP地址。這時就須要用masquerade來動態獲取了。
iptables -t nat -A POSTROUTING  -s 192.168.1.0/24 -j masquerade      //即把192.168.1.0 這個網段的地址都重寫爲動態的外部IP地址。
七、REDIRECT 
只能在NAT表中的PREROUTING  OUTPUT 鏈中使用
在防火牆所在的機子內部轉發包或流到另外一個端口。好比,咱們能夠把全部去往端口HTTP的包REDIRECT到HTTP proxy(例如squid),固然這都發生在咱們本身的主機內部。
--to-ports
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
不使用這個選項,目的端口不會被改變。
指定一個端口,如--to-ports 8080
指定端口範圍,如--to-ports 8080-8090
八、RETURN
顧名思義,它使包返回上一層,順序是:子鏈——>父鏈——>缺省的策略。具體地說,就是若包在子鏈中遇到了RETURN,則返回父鏈的下一條規則繼續進行條件的比較,如果在父鏈(或稱主鏈,好比INPUT)中遇到了RETURN,就要被缺省的策略(通常是ACCEPT或DROP)操做了。(譯者注:這很象C語言中函數返回值的狀況)
九、MIRROR
 顛倒IP頭中的源地址與目的地址,再轉發。
十、LOG
 在內核空間記錄日誌,dmesg等才能看。/var/log/messages
iptables -t filter -I FORWARD -s 192.168.10.0/24 -p tcp 
iptables -t filter -I INPUT  -p icmp -j --log-prefix "XXXXX"    --log-prefix "XXXXX" 是添加的信息。方便查找。十一、ULOG 在用戶空間記錄日誌。
相關文章
相關標籤/搜索