iptables設定圖文詳解

來源:互聯網
上載者:User
Netfilter包含有三種表,三種表下共包含有五種鏈,鏈下麵包含各種規則。即表包含若干鏈,鏈包含若干規則。
  (一)三種表為:filter   nat  mangle
 1、filter:處理與本機有關的資料包,是預設表,包含有三種鏈:input   output forward
 2、nat表:與本機無關。主要處理源與目的地址IP和連接埠的轉換。有三種鏈:prerouting  postrouting output
 3、mangle表:用於進階路由資訊包,如包頭內有更改(如tos改變包的服務類型,ttl包的存留時間,mark特殊標記)。有兩種鏈:prerouting  output  (kernel  2.4.18後又加了兩種鏈:input forward)這種表很少使用。


   (二)五種鏈
 1、prerouting:進入netfilter後的資料包在進入路由判斷前執行的規則。改變包。
 2、Input:當經過路由判斷後,要進入原生資料包執行的規則。
 3、output:由本機產生,需向外發的資料包執行的規則。
 4、forward:經過路由判斷後,目的地不是原生資料包執行的規則。與nat 和 mangle表相關聯很高,與本機沒有關聯。
 5、postrouting:經過路由判斷後,發送到網卡介面前。即資料包準備離開netfilter時執行的規則。
iptables詳解(轉)
上圖中,運行中的守護進程,是指本機。Input的包都會發到本機。本機處理後再經output 發出去。


(三)資料包進入netfilter後的經過圖:
   1、資料包進入linux伺服器入介面,介面把資料包發往netfilter,資料包就此進入netfilter。
 2、經prerouting處理,(如是否需要更改資料包的源IP地址等)
 3、資料包到路由,路由通過路由表判斷資料包的目的地。如果目的地是本機,就把資料包轉給intput處理後進入本機。如果目的地不是本機,則把資料包轉給forward處理。
 4、資料包通過forward處理後,再轉給postrouting處理,(是否有目標地址需要改變等),處理後資料包就出了netfilter,到linux伺服器出介面,就出了linux伺服器。
 5、如果資料包進了本機後經過處理需要外發資料包,或本機自身有資料包需要外發,就把資料包發給output鏈進行處理後,轉給postrouting處理後,出linux伺服器。進入外面的花花世界。


   (四)規則的執行順序
當資料包進入netfilter,就會和裡面的規則進行對比。規則是有順序的。
先和規則1對比,如果和規則1相匹配,被規則1接受(accept),則資料將不再和後面的規則進行對比。如果不匹配,則按順序和後面的規則進行對比,直到被接受。如果所有的規則都不匹配,則進行預設策略操作,以決定資料包的去向。所以規則的順序很重要。
    IPTABLE主要是理解上面的內容,一些詳細參數可以見附件中的指南。


  二、iptalbe文法及參數
iptable [-t table] command [chain] [match][-j target]
注釋:iptable [-t 表名] -命令 [連結] [匹配] [-j 動作/目標]


(一) table  (表)
1、filter表:預設用filter表執行所有的命令。只操作與本機有關的資料包。
2、nat表:主要用於NAT地址轉換。只有資料流的第一個資料包被這個鏈匹配,後面的包會自動做相同的處理。
  分為:DNAT(目標地址轉換)、SNAT(源地址轉換)、MASQUERADE
(1)DNAT操作主要用在這樣一種情況,你有一個合法的IP地址,要把對防火牆的訪問 重新導向到其他的機子上(比如DMZ)。也就是說,我們改變的是目的地址,以使包能重路由到某台主機。
(2)SNAT 改變包的源地址,這在極大程度上可以隱藏你的本網或者DMZ等。內網到外網的映射。
(3)MASQUERADE 的作用和SNAT完全一樣,只是電腦的負荷稍微多一點。因為對每個匹配的包,MASQUERADE都要尋找可用的IP地址,而不象SNAT用的IP地址是配置好的。當然,這也有好處,就是我們可以使用通過PPP、 PPPOE、SLIP等撥號得到的地址,這些地址可是由ISP的DHCP隨機分配的。
3、mangle表:用來改變資料包的進階特性,一般不用。


(二) command(命令)詳解 
1、 -A或者--append     //將一條或多條規則加到鏈尾
2、 -D或者--delete     //從鏈中刪除該規則
3、 -R或者--replace   //從所選鏈中替換一條規則
4、 -L或者--list       //顯示鏈的所有規則
5、 -I或者--inset     //根據給出的規則序號,在鏈中插入規則。按序號的順序插入,如是 “1”就插入鏈首
6、 -X或者--delete-chain  //用來刪除使用者自訂鏈中規則。必須保證鏈中的規則都不在使用時才能刪除鏈。如沒有指定鏈,將刪除所有自訂鏈中的規則。
7、 -F或者--flush        //清空所選鏈中的所有規則。如指定鏈名,則刪除對應鏈的所有規則。如沒有指定鏈名,則刪除所有鏈的所有規則。
8、 -N或者--new-chain      //用命令中所指定的名字建立一個新鏈。
9、 -P或者--policy        //設定鏈的預設目標,即策略。 與鏈中任何規則都不匹配的資訊包將強制使用此命令中指定的策略。
10、-Z或者--zero        //將指定鏈中的所有規則的包位元組計數器清零。


(三) match 匹配
分為四大類:通用匹配、隱含匹配、顯示匹配、針對非正常包的匹配


1、通用匹配
   無論我們使用何種協議,裝入何種擴充,通用匹配都可以使用。不需要前提條件
(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 的格式用法一樣


(4)  -i 
   以包進入本地所使用的網路介面來匹配包。只能用INPUT FORWARD PREROUTING 三個鏈中。用在其他任何鏈中都會出錯。
   可使用“+”  “。”兩種符號。
  只用一個“+"號,表示匹配所有的包,不考慮使用哪個介面。如: iptable -A INPUT  -i +  //表匹配所有的包。
  放在某類介面後面,表示所有此類介面相匹配。如:    iptable  -A INPUT -i eth+   //表示匹配所有ethernet 介面。


(5)  -o   
  以資料包出本地所使用的網路介面來匹配包。與-i一樣的使用方法。
   只能用OUTPUT FORWARD POSTROUTING 三個鏈中。用在其他任何鏈中都會出錯。
   可使用“+”  “。”兩種符號。 


 (6)  -f  (或  --fragment )
      用來匹配一個被分區的包的第二片或以後的部分。因一個資料包被分成多片以後,只有第一片帶有源或目標地址。後面的都不帶 ,所以只能用這個來匹配。可防止片段攻擊。


2、隱含匹配
   這種匹配是隱含的,自動的載入核心的。如我們使用 --protocol tcp  就可以自動匹配TCP包相關的特點。
   分三種不同協議的隱含匹配:tcp   udp  icmp
  2.1   tcp match
       tcp match 只能隱含匹配TCP包或流的細節。但必須有  -p tcp 作為前提條件。
   (2.1.1)  TCP --sport  
            基於tcp包的源連接埠匹配包  ,不指定此項則表示所有連接埠。
            iptable -A INPUT -p  TCP  --sport   22:80    //TCP源連接埠號碼22到80之間的所有連接埠。
            iptable -A INPUT -p  TCP  --sport   22:      //TCP源連接埠號碼22到65535之間的所有連接埠。     
   (2.1.2)  TCP --dport  
            基於tcp包的目的連接埠來匹配包。   與--sport連接埠用法一樣。
    (2.1.3)  TCP --flags  
            匹配指定的TCP標記。 
            iptable  -p  TCP --tcp-flags  SYN,FIN,ACK   SYN
   2.2   UDP match
       (2.1.1)  UDP --sport  
            基於UDP包的源連接埠匹配包  ,不指定此項則表示所有連接埠。
      
        (2.1.1)  UDP --dport  
            基於UDP包的目的連接埠匹配包  ,不指定此項則表示所有連接埠。
   2.3   icmp match
       icmp --icmp-type   
       根據ICMP類型包匹配。類型 的指定可以使用十進位數或相關的名字,不同的類型,有不同的ICMP數值表示。也可以用“。”取反。
例:      iptable  -A INPUT  -p icmp-imcp-type 8 


  3、顯示匹配
    顯示匹配必須用  -m裝 載。 
     (1)limit match   
       必須用 -m limit 明確指出。  可以對指定的規則的匹配次數加以限制。即,當某條規則匹配到一定次數後,就不再匹配。也就是限制可匹配包的數量。這樣可以防止DOS攻擊。
       限制方法: 設定對某條規則 的匹配最大次數。設一個限定值 。 當到達限定值以後,就停止匹配。但有個規定,在超過限制次數後,仍會每隔一段時間再增加一次匹配次數。但增加的空閑匹配數最大數量不超過最大限制次數。
        --limit rate
          最大平均匹配速率:可賦的值有'/second', '/minute', '/hour', or '/day'這樣的單位,預設是3/hour。
        --limit-burst number
         待匹配包初始個數的最大值:若前面指定的極限還沒達到這個數值,則概數字加1.預設值為5
    iptable -A INPUT -m limit --limt 3/hour    //設定最大平均匹配速率。也就是單位時間內,可匹配的資料包個數。   --limt 是指定隔多 長時間發一次通行證。
    iptable -A INPUT  -m limit --limit-burst 5  //設定剛開始發放5個通行證,也最多隻可匹配5個資料包。
   (2) mac match
        只能匹配MAC源地址。基於包的MAC源地址匹配包
   iptable -A  INPUT -m mac  --mac-source   00:00:eb:1c:24     //源地址匹配些MAC地址
    (3)  mark match
       以資料包被 設定的MARK來匹配包。這個值由  MARK TARGET 來設定的。
  (4)  multiport match
         這個模組匹配一組源連接埠或目標連接埠,最多可以指定15個連接埠。只能和-p tcp 或者 -p udp 連著使用。
 
        多連接埠匹配擴充讓我們能夠在一條規則裡指定不連續的多個連接埠。如果沒有這個擴充,我們只能按連接埠來寫規則了。這隻是標準連接埠匹配的增強版。不能在一條規則裡同時用標準連接埠匹配和多連接埠匹配。
 三個選項:   --source-port   ;  --destination-port  ;   --port
        iptable  -A INPUT  -p TCP   -m  multiport  --source-port 22,28,115       
        iptable  -A INPUT  -p TCP   -m  multiport  --destination-port 22,28,115 
        iptable  -A INPUT  -p TCP   -m  multiport  --port 22,28,115
  (5) state match
       狀態匹配擴充要有核心裡的串連跟蹤代碼的協助。因為是從串連跟蹤機製得到包的狀態。這樣不可以瞭解所處的狀態。
 (6)  tos match
       根據TOS欄位匹配包,用來控制優先順序。 
 (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  
  指由規則指定的操作,對與規則匹配的資訊包執行什麼動作。
  1、accept
這個參數沒有任何選項。指定  -j accept 即可。 
一旦滿 足匹配不再去匹配表或鏈內定義的其他規則。但它還可能會匹配其他表和鏈內的規則。即在同一個表內匹配後就到上為止,不往下繼續。
2、drop 
-j drop   當資訊包與規則完全符合時,將丟棄該 包。不對它做處理。並且不向寄件者返回任何資訊。也不向路由器返回資訊。
3、reject
與drop相同的工作方式,不同的是,丟棄包後,會發送錯誤資訊給發送方。
   iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with icmp-net-unreachable
  
4、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   //目的地重寫


5、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
********************


6、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地址。


7、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


8、RETURN
顧名思義,它使包返回上一層,順序是:子鏈——>父鏈——>預設的策略。具體地說,就是若包在子鏈中遇到了RETURN,則返回父鏈的下一條規則繼續進行條件的比較,若是在父鏈(或稱主鏈,比如INPUT)中遇到了RETURN,就要被預設的策略(一般是ACCEPT或DROP)操作了。(譯者註:這很象C語言中函數傳回值的情況)


9、MIRROR
 顛倒IP頭中的源地址與目的地址,再轉寄。


10、LOG
 在核心空間記錄日誌,dmesg等才能看。


11、ULOG
 在使用者空間記錄日誌。


(五)IP轉寄功能
開啟轉寄IP功能(IP forwarding):
echo "1" > /proc/sys/net/ipv4/ip_forward
如果使用PPP、DHCP等動態IP,需要開啟:
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.