一
iptables_1 linux 2.4_2.6
原文http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html#RCFIREWALLTXT
iptables 3Table表
iptalbes命令是用來設置、維護和檢查Linux內核的IP包過濾規則的。把Netfilter內核空間中的整個規則集都提取出來,然後再插入或附加,或做其他的改動,最後,再把新的規則集從它的內存空間插入到內核空間中。
iptables-save
數據包的4種狀態:NEW,ESTABLISHED,RELATED 和INVALID
以本地爲目標的包
Step(步驟) Table(表) Chain(鏈) Comment(註釋)
1
2
3 mangle表 PREROUTING鏈 這個鏈用來mangle數據包,比如改變TOS等
4 nat表
5
6 mangle表 INPUT鏈 在路由之後,被送往本地程序之前,mangle數據包。
7 filter表 INPUT鏈所有以本地爲目的的包都要經過這個鏈,不管它們從哪兒來,對這些包的過濾條件就設在這裏。
8
以本地爲源的包
Step(步驟) Table(表) Chain(鏈) Comment(註釋)
1
2
3 mangle表 OUTPUT鏈 在這兒可以mangle包。建議不要在這兒做過濾,可能有副作用哦。
4 nat表
5 filter表 OUTPUT鏈 對本地發出的包過濾。
6 mangle表 POSTROUTING鏈這條鏈主要在包DNAT之後(譯者注:作者把這一次DNAT稱作實際的路由,雖然在前面有一次路由。對於本地的包,一旦它被生成,就必須經過路由代碼的處理,但這個包具體到哪兒去,要由NAT代碼處理之後才能確定。所以把這稱作實際的路由。),離開本地之前,對包 mangle。有兩種包會經過這裏,防火牆所在機子本身產生的包,還有被轉發的包。
7 nat表
8
9
被轉發的包
Step(步驟) Table(表) Chain(鏈) Comment(註釋)
1
2
3 mangle表 PREROUTING鏈 mangle數據包,,比如改變TOS等。
4 nat表
5
6 mangle表 FORWARD鏈包繼續被髮送至mangle表的FORWARD鏈,這是非常特殊的情況纔會用到的。在這裏,包被mangle(還記得mangle的意思嗎)。這次mangle發生在最初的路由判斷之後,在最後一次更改包的目的之前(譯者注:就是下面的FORWARD鏈所做的,因其過濾功能,可能會改變一些包的目的地,如丟棄包)。
7 filter表 FORWARD鏈包繼續被髮送至這條FORWARD鏈。只有需要轉發的包纔會走到這裏,並且針對這些包的所有過濾也在這裏進行。注意,所有要轉發的包都要經過這裏,不管是外網到內網的還是內網到外網的。在你自己書寫規則時,要考慮到這一點。
8 mangle表 POSTROUTING鏈這個鏈也是針對一些特殊類型的包(譯者注:參考第6步,我們可以發現,在轉發包時,mangle表的兩個鏈都用在特殊的應用上)。這一步mangle是在所有更改包的目的地址的操作完成之後做的,但這時包還在本地上。
9 nat表
10
11
二
原文http://hi.baidu.com/9812658/blog/item/7ff68d2cad4d155c4fc226cf
一、iptables命令格式(較爲複雜)
iptables
(1)table ------- 指定表名(raw表、mangle表、nat表、filter表)
(2)command ------- 對鏈的操作命令(-A:追加規則(最下面進行追加規則)、-I:插入(一般在相應的哪條規則前後插入))
(3)chain ------- 鏈名(prerouting鏈、forward鏈、input鏈、output鏈、postrouting鏈)
(4)rules ------- 規則
(5)target ------- 動作如何進行
1、表選項(table)
使用的參數爲: -t
2、命令選項(command)
命令 |
說明 |
-P或--policy |
定義默認策略 |
-L或--list + <鏈名> |
查看iptables規則列表 |
-A或--append |
在規則列表的最後增加1條規則 |
-I或--insert |
在指定的位置插入1條規則 |
-D或--delete |
從規則列表中刪除1條規則 |
-R或--replace + <鏈名> + number |
替換規則列表中的某條規則 |
-F或--flush + <鏈名> |
刪除表中所有規則(注意:無法清空默認規則) |
-Z或--zero |
將表中數據包計數器和流量計數器歸零 |
3、匹配選項(rules)
匹配 |
說明 |
-i或--in-interface + <網絡接口名> |
指定數據包從哪個網絡接口進入,如ppp0、eth0和eth1等 |
-o或--out-interface + <網絡接口名> |
指定數據包從哪塊網絡接口輸出,如ppp0、eth0和eth1等 |
-p或---prot + < 協議類型> |
指定數據包匹配的協議,如TCP、UDP和ICMP等 |
-s或--source + <源地址或子網> |
指定數據包匹配的源地址 |
--sport + <源端口號> |
指定數據包匹配的源端口號,可以使用 "起始端口號:結束端口號" 的格式指定一個範圍的端口 |
-d或--destination + <目標地址或子網> |
指定數據包匹配的目標地址 |
--dport + 目標端口號 |
指定數據包匹配的目標端口號,可以使用 "起始端口號:結束端口號" 的格式指定一個範圍的端口 |
4、動作選項(-j
動作 |
說明 |
ACCEPT |
接受數據包 |
DROP |
丟棄數據包 |
REDIRECT |
與DROP基本一樣,區別在於它除了阻塞包之外, 還向發送者返回錯誤信息 |
SNAT |
源地址轉換,即改變數據包的源地址 |
DNAT |
目標地址轉換,即改變數據包的目的地址 |
MASQUERADE + IP |
僞裝,即是常說的NAT技術,MASQUERADE只能用於ADSL等撥號上網的IP僞裝,也就是主機的IP是由ISP分配動態的;如果主機的IP地址是靜態固定的,就要使用SNAT |
LOG |
日誌功能,將符合規則的數據包的相關信息記錄在日誌中,以便管理員的分析和排錯 |
二、iptables的語法
1.定義默認策略
1)作用:當數據包不符合鏈中任一條規則時,iptables將根據該鏈預先定義的默認策略來處理數據包
2)默認策略的定義格式: iptables
參數說明如下:
(1)[-t
指默認策略將應用於哪個表,可以使用filter、nat和mangle,如果沒有指定使用哪個表,iptables就默認使用filter表
(2)<-P>
定義默認策略
(3)<鏈名>
指默認策略將應用於哪個鏈,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING
(4)<動作>
處理數據包的動作,可以使用ACCEPT(接受數據包)和DROP(丟棄數據包)
2.查看iptables規則
查看iptables規則的命令格式爲:iptables
參數說明如下:
(1)[-t
指查看哪個表的規則列表,表名用可以使用filter、nat和mangle,如果沒有指定使用哪個表,iptables就默認查看filter表的規則列表
(2)<-L>
查看指定表和指定鏈的規則列表
(3)[鏈名]
指查看指定表中哪個鏈的規則列表,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING,如果不指明哪個鏈,則將查看某個表中所有鏈的規則列表
3.增加、插入、刪除、替換iptables規則
iptables
例如:
iptables -t
iptables -t
iptables -t
參數說明如下:
(1)[-t 表名]
定義默認策略將應用於哪個表,可以使用filter、nat和mangle,如果沒有指定使用哪個表,iptables就默認使用filter表
(2)-A
新增加一條規則,該規則將會增加到規則列表的最後一行,該參數不能使用規則編號
(3)-I
插入一條規則,原本該位置上的規則將會往後順序移動,如果沒有指定規則編號,則在第一條規則前插入
(4)-D
從規則列表中刪除一條規則,可以輸入完整規則,或直接指定規則編號加以刪除
(5)-R
替換某條規則,規則被替換並不會改變順序,必須要指定替換的規則編號
(6)<鏈名>
指定查看指定表中哪個鏈的規則列表,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT和POSTROUTING
(7)[規則編號]
規則編號用於插入、刪除和替換規則時用,編號是按照規則列表的順序排列,規則列表中第一條規則的編號爲1
(8)[-i | o 網卡名稱]
i是指定數據包從哪塊網卡進入,o是指定數據包從哪塊網卡輸出。網卡名稱可以使用ppp0、eth0和eth1等
(9)[-p 協議類型]
可以指定規則應用的協議,包含TCP、UDP和ICMP等
(10)[-s 源IP地址 | 源子網]
源主機的IP地址或子網地址
(11)[--sport 源端口號]
數據包的IP的源端口號
(12)[-d目標IP地址 | 目標子網]
目標主機的IP地址或子網地址
(13)[--dport目標端口號]
數據包的IP的目標端口號
(14)<-j動作>
處理數據包的動作,各個動作的詳細說明可以參考前面的說明
4、清除規則和計數器
在新建規則時,往往需要清除原有的、舊的規則,以免它們影響新設定的規則。如果規則比較多,一條條刪除就會十分麻煩,這時可以使用iptables提供的清除規則參數達到快速刪除所有的規則的目的。
定義參數的格式爲:iptables
參數說明如下:
(1)[-t 表名]
指定默認策略將應用於哪個表,可以使用filter、nat和mangle,如果沒有指定使用哪個表,iptables就默認使用filter表
(2)-F
刪除指定表中所有規則
(3)-Z
將指定表中的數據包計數器和流量計數器歸零
三、NAT
1、什麼是NAT
2、NAT的類型
1) 靜態NAT(Static NAT,SNAT)(局域網的IP==>廣域網的IP)
靜態NAT設置起來最爲簡單和最容易實現的一種,內部網絡中的每個主機都被永久映射成外部網絡中的某個合法的地址
2)動態地址NAT(Pooled NAT,DNAT)(廣域網的IP==>局域網的IP)
(1)動態地址NAT是在外部網絡中定義了一系列的合法地址,採用動態分配的方法映射到內部網絡
(2)動態地址NAT只是轉換IP地址,它爲每一個內部的IP地址分配一個臨時的外部IP地址,主要應用於撥號,對於頻繁的遠程聯接也可以採用動態NAT
3)網絡地址端口轉換NAPT(Port-Level NAT)
NAPT是把內部地址映射到外部網絡的一個IP地址的不同端口上
最熟悉的一種轉換方式。NAPT普遍應用於接入設備中,它可以將中小型的網絡隱藏在一個合法的IP地址後面。NAPT與動態地址NAT不同,它將內部連接映射到外部網絡中的一個單獨的IP地址上,同時在該地址上加上一個由NAT設備選定的TCP端口號
三、規則走向
四、INPUT與OUTPUT區別
對於input而言
--dport -d都是指你自己的端口和地址
--sport和-s指的是發起連接者的端口和地址
對於output而言
--sport -s都是指你自己的端口和地址
--dport -d指的dest地址
三
原文http://www.linux.gov.cn/netweb/iptables.htm
iptables 指令語法
iptables [-t table] command [match] [-j target/jump]
[-t table] 指定規則表
-t 參數用來,內建的規則表有三個,分別是:nat、mangle 和 filter,當未指定規則表時,則一律視爲是 filter。個規則表的功能如下:
nat:此規則表擁有 PREROUTING 和 POSTROUTING 兩個規則鏈,主要功能爲進行一對一、一對多、多對多等網址轉換工作(SNAT、DNAT),這個規則表除了作網址轉換外,請不要做其它用途。
mangle:此規則表擁有 PREROUTING、FORWARD 和 POSTROUTING 三個規則鏈。除了進行網址轉換工作會改寫封包外,在某些特殊應用可能也必須去改寫封包(TTL、TOS)或者是設定 MARK(將封包作記號,以進行後續的過濾),這時就必須將這些工作定義在 mangle 規則表中,由於使用率不高,我們不打算在這裏討論 mangle 的用法。
filter: 這個規則表是默認規則表,擁有 INPUT、FORWARD 和 OUTPUT 三個規則鏈,這個規則表顧名思義是用來進行封包過濾的處理動作(例如:DROP、 LOG、 ACCEPT 或 REJECT),我們會將基本規則都建立在此規則表中。
command 常用命令列表:
命令 -A, --append
範例 iptables -A INPUT ...
說明 新增規則到某個規則鏈中,該規則將會成爲規則鏈中的最後一條規則。
命令 -D, --delete
範例 iptables -D INPUT --dport 80 -j DROP
iptables -D INPUT 1
說明 從某個規則鏈中刪除一條規則,可以輸入完整規則,或直接指定規則編號加以刪除。
命令 -R, --replace
範例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
說明 取代現行規則,規則被取代後並不會改變順序。
命令 -I, --insert
範例 iptables -I INPUT 1 --dport 80 -j ACCEPT
說明 插入一條規則,原本該位置上的規則將會往後移動一個順位。
命令 -L, --list
範例1 iptables -L INPUT
說明 列出某規則鏈中的所有規則。
範例2 iptables -t nat -L
說明 列出nat表所有鏈中的所有規則。
命令 -F, --flush
範例 iptables -F INPUT
說明 刪除filter表中INPUT鏈的所有規則。
命令 -Z, --zero
範例 iptables -Z INPUT
說明 將封包計數器歸零。封包計數器是用來計算同一封包出現次數,是過濾阻斷式***不可或缺的工具。
命令 -N, --new-chain
範例 iptables -N allowed
說明 定義新的規則鏈。
命令 -X, --delete-chain
範例 iptables -X allowed
說明 刪除某個規則鏈。
命令 -P, --policy
範例 iptables -P INPUT DROP
說明 定義過濾政策。 也就是未符合過濾條件之封包, 默認的處理方式。
命令 -E, --rename-chain
範例 iptables -E allowed disallowed
說明 修改某 自定義規則鏈的名稱。
[match] 常用封包匹配參數
參數 -p, --protocol
範例 iptables -A INPUT -p tcp
說明 匹配通訊協議類型是否相符,可以使用 ! 運算符進行反向匹配,例如:
-p !tcp
意思是指除 tcp 以外的其它類型,如udp、icmp ...等。
如果要匹配所有類型,則可以使用 all 關鍵詞,例如:
-p all
參數 -s, --src, --source
範例 iptables -A INPUT -s 192.168.1.1
說明 用來匹配封包的來源 IP,可以匹配單機或網絡,匹配網絡時請用數字來表示 子網掩碼,例如:
-s 192.168.0.0/24
匹配 IP 時可以使用 ! 運算符進行反向匹配,例如:
-s !192.168.0.0/24。
參數 -d, --dst, --destination
範例 iptables -A INPUT -d 192.168.1.1
說明 用來匹配封包的目的地 IP,設定方式同上。
參數 -i, --in-interface
範例 iptables -A INPUT -i eth0
說明 用來匹配封包是從哪塊網卡進入,可以使用通配字符 + 來做大範圍匹配,例如:
-i eth+
表示所有的 ethernet 網卡
也可以使用 ! 運算符進行反向匹配,例如:
-i !eth0
參數 -o, --out-interface
範例 iptables -A FORWARD -o eth0
說明 用來匹配封包要從哪 塊網卡送出,設定方式同上。
參數 --sport, --source-port
範例 iptables -A INPUT -p tcp --sport 22
說明 用來匹配封包的源端口,可以匹配單一端口,或是一個範圍,例如:
--sport 22:80
表示從 22 到 80 端口之間都算是符合條件,如果要匹配不連續的多個端口,則必須使用 --multiport 參數,詳見後文。匹配端口號時,可以使用 ! 運算符進行反向匹配。
參數 --dport, --destination-port
範例 iptables -A INPUT -p tcp --dport 22
說明 用來匹配封包的目的地端口號,設定方式同上
參數 --tcp-flags
範例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
說明匹配 TCP 封包的狀態標誌,參數分爲兩個部分,第一個部分列舉出想匹配的標誌,第二部分則列舉前述標誌中哪些有被設置,未被列舉的標誌必須是空的。TCP 狀態標誌包括:SYN(同步)、ACK(應答)、FIN(結束)、RST(重設)、URG(緊急) 、PSH(強迫推送)等均可使用於參數中,除此之外還可以使用關鍵詞 ALL 和 NONE 進行匹配。匹配標誌時,可以使用 ! 運算符行反向匹配。
參數 --syn
範例 iptables -p tcp --syn
說明 用來表示TCP通信協議中,SYN位被打開,而ACK與FIN位關閉的分組,即TCP的初始連接,與 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,如果使用 !運算符,可用來匹配非要求連接封包。
參數 -m multiport --source-port
範例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
說明用來匹配不連續的多個源端口,一次最多可以匹配 15 個端口,可以使用 ! 運算符進行反向匹配。
參數 -m multiport --destination-port
範例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
說明用來 匹配不連續的多個目的地端口號,設定方式同上
參數 -m multiport --port
範例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
說明 這個參數比較特殊,用來匹配源端口和目的端口號相同的封包,設定方式同上。注意:在本範例中,如果來源端口號爲 80目的地端口號爲 110,這種封包並不算符合條件。
參數 --icmp-type
範例 iptables -A INPUT -p icmp --icmp-type 8
說明用來匹配 ICMP 的類型編號,可以使用代碼或數字編號來進行 匹配。請打 iptables -p icmp --help 來查看有哪些代碼可用。
參數 -m limit --limit
範例 iptables -A INPUT -m limit --limit 3/hour
說明 用來匹配某段時間內封包的平均流量,上面的例子是用來 匹配:每小時平均流量是否超過一次 3 個封包。除了每小時平均次外,也可以每秒鐘、每分鐘或每天平均一次,默認值爲每小時平均一次,參數如後: /second、 /minute、/day。 除了進行封包數量的匹配外,設定這個參數也會在條件達成時,暫停封包的匹配動作,以避免因駭客使用洪水***法,導致服務被阻斷。
參數 --limit-burst
範例 iptables -A INPUT -m limit --limit-burst 5
說明 用來匹配瞬間大量封包的數量,上面的例子是用來匹配一次同時涌入的封包是否超過 5 個(這是默認值),超過此上限的封包將被直接丟棄。使用效果同上。
參數 -m mac --mac-source
範例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
說明 用來匹配封包來源網絡接口的硬件地址,這個參數不能用在 OUTPUT 和 POSTROUTING 規則鏈上,這是因爲封包要送到網卡後,才能由網卡驅動程序透過 ARP 通訊協議查出目的地的 MAC 地址,所以 iptables 在進行封包匹配時,並不知道封包會送到哪個網絡接口去。
參數 --mark
範例 iptables -t mangle -A INPUT -m mark --mark 1
說明 用來匹配封包是否被表示某個號碼,當封包被 匹配成功時,我們可以透過 MARK 處理動作,將該封包標示一個號碼,號碼最大不可以超過 4294967296。
參數 -m owner --uid-owner
範例
iptables -A OUTPUT -m owner --uid-owner 500
說明 用來匹配來自本機的封包,是否爲某特定使用者所產生的,這樣可以避免服務器使用 root 或其它身分將敏感數據傳送出,可以降低系統被駭的損失。可惜這個功能無法 匹配出來自其它主機的封包。
參數 -m owner --gid-owner
範例 iptables -A OUTPUT -m owner --gid-owner 0
說明 用來匹配來自本機的封包,是否爲某特定使用者羣組所產生的,使用時機同上。
參數 -m owner --pid-owner
範例
iptables -A OUTPUT -m owner --pid-owner 78
說明 用來匹配來自本機的封包,是否爲某特定進程所產生的,使用時機同上。
參數 -m owner --sid-owner
範例
iptables -A OUTPUT -m owner --sid-owner 100
說明 用來匹配來自本機的封包,是否爲某特定 連接(Session ID)的響應封包,使用時機同上。
參數 -m state --state
範例
iptables -A INPUT -m state --state RELATED,ESTABLISHED
說明 用來匹配連接狀態, 連接狀態共有四種:INVALID、ESTABLISHED、NEW 和 RELATED。
INVALID 表示該封包的連接編號(Session ID)無法辨識或編號不正確。
ESTABLISHED 表示該封包屬於某個已經建立的連接。
NEW 表示該封包想要起始一個連接(重設連接或將連接重導向)。
RELATED 表示該封包是屬於某個已經建立的連接,所建立的新連接。例如:FTP-DATA 連接必定是源自某個 FTP 連接。
[-j target/jump] 常用的處理動作:
-j 參數用來指定要進行的處理動作,常用的處理動作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分別說明如下:
ACCEPT: 將封包放行,進行完此處理動作後,將不再匹配其它規則,直接跳往下一個規則鏈(natostrouting)。
REJECT: 攔阻該封包,並傳送封包通知對方,可以傳送的封包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個封包會要求對方關閉連接),進行完此處理動作後,將不再匹配其它規則,直接中斷過濾程序。 範例如下:
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
DROP: 丟棄封包不予處理,進行完此處理動作後,將不再匹配其它規則,直接中斷過濾程序。
REDIRECT: 將封包重新導向到另一個端口(PNAT),進行完此處理動作後,將會繼續匹配其它規則。這個功能可以用來實現透明代理或用來保護 web 服務器。例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
MASQUERADE: 改寫封包來源 IP 爲防火牆 NIC IP,可以指定 port 對應的範圍,進行完此處理動作後,直接跳往下一個規則 鏈(manglepostrouting)。這個功能與SNAT 略有不同,當進行 IP 僞裝時,不需指定要僞裝成哪個 IP,IP會從網卡直接讀取,當使用撥 號接連時,IP通常是由ISP公司的DHCP 服務器指派的,這個時候 MASQUERADE 特別有用。範例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG: 將封包相關訊息紀錄在 /var/log 中,詳細位置請查閱 /etc/syslog.conf 配置文件,進行完此處理動作後,將會繼續匹配其規則。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT: 改寫封包來源 IP 爲某特定 IP 或 IP 範圍,可以指定 port 對應的範圍,進行完此處理動作後,將直接跳往下一個規則(mangleostrouting)。範例如下:
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source?194.236.50.155-194.236.50.160:1024-32000
DNAT: 改寫封包目的地 IP 爲某特定 IP 或 IP 範圍,可以指定 port 對應的範圍,進行完此處理動作後,將會直接跳往下一個規則鏈(filter:input 或 filter:forward)。範例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR: 鏡射封包,也就是將來源 IP 與目的地 IP 對調後,將封包送回,進行完此處理動作後,將會中斷過濾程序。
QUEUE:中斷過濾程序,將封包放入隊列,交給其它程序處理。通過自行開發的處理程序,可以進行其它應用,例如:計算連接費用等。
RETURN:結束在目前規則鏈中的過濾程序,返回主規則鏈繼續過濾,如果把自定義規則鏈看成是一個子程序,那麼這個動作,就相當於提前結束子程序並返回到主程序中。
MARK:將封包標上某個代號,以便提供作爲後續過濾的條件判斷依據,進行完此處理動作後,將會繼續匹配其它規則。範例如下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2