iptable

一、netfilter/iptable的理解

200912211261385680357.gif

這個當初我理解不了,主要是沒把netfilter理解清楚。Netfilter是集成在內核中的,用來定義存儲各種規則的Iptalbe是修改這些規則的工具,修改後存在netfilter裏面

數據包進入LINUX服務器時,先進入服務器的netfilter模塊中進行判斷處理。

Netfilter包含有三種表,三種表下共包含有五種鏈,鏈下面包含各種規則。即表包含若干鏈,鏈包含若干規則。

(一)三種表爲filternatmangle

1filter:處理與本機有關的數據包,是默認表,包含有三種鏈:input output forward

2nat表:與本機無關。主要處理源與目的地址IP和端口的轉換。有三種鏈:prerouting postrouting output

3mangle表:用於高級路由信息包,如包頭內有更改(如tos改變包的服務類型,ttl包的生存時間,mark特殊標記)。有兩種鏈:prerouting outputkernel2.4.18後又加了兩種鏈:input forward)這種表很少使用:

(二)五種鏈(鏈在表下面,爲了條理清晰,才另外作一大點講解)

1、prerouting:進入netfilter後的數據包在進入路由判斷前執行的規則。改變包。

2、Input:當經過路由判斷後,要進入本機的數據包執行的規則。

3、output:由本機產生,需向外發的數據包執行的規則。

4、forward:經過路由判斷後,目的地不是本機的數據包執行的規則。與nat mangle表相關聯很高,與本機沒有關聯。

5、postrouting:經過路由判斷後,發送到網卡接口前。即數據包準備離開netfilter時執行的規則。上圖上,運行中的守護進程,是指本機。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(小寫)或--protocl
用來檢查某些特定協議。協議有TCP\UDP\ICMP三種。可用逗號分開這三種協議的任何組合。也可用“!”號進行取反,表示除該協議外的剩下的協議。也可用all表示全部協議。默認是all,但只代表tcp\udp\icmp三種協議。

$ 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一樣的使用方法。
只能用INPUT \ FORWARD \prerouting 三個鏈中。用在其他任何鏈中都會出錯。
可使用“+” “!”兩種符號。

(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字段來匹配包。

(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相同的工作方式,不同的是,丟棄包後,會發送錯誤信息給發送方 。

4、DNAT

用在prerouting鏈上。
做目的網絡地址轉換的。就是重寫目的的IP地址。
如果一個包被匹配,那麼和它屬於同一個流的所有的包都會被自動轉換。然後可以被路由到正確的主機和網絡。
也就是如同防火牆的外部地址映射。把外部地址映射到內部地址上。

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

iptable -t nat POSTROUTING -o eht0 -p tcp -j SNAT --to-source 218.107.248.127 //從eth0接口往外發的數據包都把源地址重寫爲218.107.248.127

6、MASQUERADE

masquerade 的作用和 SNAT的作用是一樣的。 區別是,他不需要指定固定的轉換後的IP地址。專門用來設計動態獲取IP地址的連接的。
MASQUERADE的作用是,從服務器的網卡上,自動獲取當前ip地址來做NAT
如家裏的ADSL上網,外網的IP地址不是固定的,你無法固定的設定NAT轉換後的IP地址。這時就需要用masquerade來動態獲取了。

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

10、TTL

11、ULOG

12、MIRROR

13、MARK

14、LOG

本文出自 “網行天下” 博客,請務必保留此出處http://kuangkuang.blog.51cto.com/838/247230


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章