linux 裏面Iptables命令詳解以及簡單配置
什麼是Iptables?
iptables 是建立在 netfilter 架構基礎上的一個包過濾管理工具,最主要的作用是用來做防火牆或透明代理。Iptables 從 ipchains 發展而來,它的功能更爲強大。Iptables 提供以下三種功能:包過濾、NAT(網絡地址轉換)和通用的 pre-route packet mangling。包過濾:用來過濾包,但是不修改包的內容。Iptables 在包過濾方面相對於 ipchians 的主要優點是速度更快,使用更方便。NAT:NAT 可以分爲源地址 NAT 和目的地址 NAT。
Iptables 可以追加、插入或刪除包過濾規則。實際上真正執行這些過慮規則的是 netfilter 及其相關模塊(如 iptables 模塊和 nat 模塊)。Netfilter 是 Linux 核心中一個通用架構,它提供了一系列的 “表”(tables),每個表由若干 “鏈”(chains)組成,而每條鏈中可以有一條或數條 “規則”(rule)組成。
系統缺省的表爲 “filter”,該表中包含了 INPUT、FORWARD 和 OUTPUT 3 個鏈。
每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的:如果數據包頭符合這樣的條件,就這樣處理這個數據包。當一個數據包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件: 如果滿足,系統將根據該條規則所定義的方法處理該數據包;如果不滿足則繼續檢查下一條規則。最後,如果該數據包不符合該鏈中任一條規則的話,系統就會根據該鏈預先定義的策略來處理該數據包。
? table,chain,rule
iptables 可以操縱3 個表:filter 表,nat 表,mangle 表。
NAT 和一般的 mangle 用 -t 參數指定要操作哪個表。filter 是默認的表,如果沒有 -t 參數,就默認對 filter 表操作。
Rule 規則:過濾規則,端口轉發規則等,例如:禁止任何機器 ping 我們的服務器,可以在服務器上設置一條規則:
iptables -A INPUT -s ! 127.0.0.1 -p icmp -j DROP
從 –s 開始即是一條規則,-j 前面是規則的條件,-j 開始是規則的行爲(目的)。整條命令解釋爲,在filter 表中的 INPUT 規則鏈中插入一條規則,所有源地址不爲 127.0.0.1 的 icmp 包都被拋棄。
Chain 規則鏈:由一系列規則組成,每個包順序經過 chain 中的每一條規則。chain 又分爲系統 chain和用戶創建的 chain。下面先敘述系統 chain。
filter 表的系統 chain: INPUT,FORWAD,OUTPUT
nat 表的系統 chain: PREROUTING,POSTROUTING,OUTPUT
mangle 表的系統 chain: PREROUTING,OUTPUT
每條系統 chain 在確定的位置被檢查。比如在包過濾中,所有的目的地址爲本地的包,則會進入INPUT 規則鏈,而從本地出去的包會進入 OUTPUT 規則鏈。
所有的 table 和 chain 開機時都爲空,設置 iptables 的方法就是在合適的 table 和系統 chain 中添相應的規則。
--------------------------------------------------------------
IPTABLES 語法:
表: iptables從其使用的三個表(filter、nat、mangle)而得名, 對包過濾只使用 filter 表, filter還是默認表,無需顯示說明.
操作命令: 即添加、刪除、更新等。
鏈:對於包過濾可以針對filter表中的INPUT、OUTPUT、FORWARD鏈,也可以操作用戶自定義的鏈。
規則匹配器:可以指定各種規則匹配,如IP地址、端口、包類型等。
目標動作:當規則匹配一個包時,真正要執行的任務,常用的有:
ACCEPT 允許包通過
DROP 丟棄包
一些擴展的目標還有:
REJECT 拒絕包,丟棄包同時給發送者發送沒有接受的通知
LOG 包有關信息記錄到日誌
TOS 改寫包的TOS值
爲使FORWARD規則能夠生效,可使用下面2種方法的某種:
[root@rhlinux root]# vi /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# vi /etc/sysconfig/network
[root@rhlinux root]# echo "FORWARD_IPV4=true" > /etc/sysconfig/network
--------------------------------------------------------
iptables語法可以簡化爲下面的形式:
iptables [-t table] CMD [chain] [rule-matcher] [-j target]
--------------------------------------------------------
常用操作命令:
-A 或 -append 在所選鏈尾加入一條或多條規則
-D 或 -delete 在所選鏈尾部刪除一條或者多條規則
-R 或 -replace 在所選鏈中替換一條匹配規則
-I 或 -insert 以給出的規則號在所選鏈中插入一條或者多條規則. 如果規則號爲1,即在鏈頭部.
-L 或 -list 列出指定鏈中的所有規則,如果沒有指定鏈,將列出鏈中的所有規則.
-F 或 -flush 清除指定鏈和表中的所由規則, 假如不指定鏈,那麼所有鏈都將被清空.
-N 或 -new-chain 以指定名創建一條新的用戶自定義鏈,不能與已有鏈名相同.
-X 或 -delete-chain 刪除指定的用戶定義簾,必需保證鏈中的規則都不在使用時才能刪除,若沒有指定鏈,則刪除所有用戶鏈.
-P 或 -policy 爲永久簾指定默認規則(內置鏈策略),用戶定義簾沒有缺省規則,缺省規則也使規則鏈中的最後一條規則,用-L顯示時它在第一行顯示.
-C 或 -check 檢查給定的包是否與指定鏈的規則相匹配.
-Z 或 -zero 將指定簾中所由的規則包字節(BYTE)計數器清零.
-h 顯示幫助信息.
-------------------------------------------------------------
常用匹配規則器:
-p , [!] protocol 指出要匹配的協議,可以是tcp, udp, icmp, all, 前綴!爲邏輯非,表示除該協議外的所有協議.
-s [!] address[/mask] 指定源地址或者地址範圍.
-sport [!] port[:port] 指定源端口號或範圍,可以用端口號也可以用/ETC/SERVICES文件中的名子.
-d [!] address[/mask] 指定目的地址或者地址範圍.
-dport [!] port[:port] 指定目的端口號或範圍,可以用端口號也可以用/ETC/SERVICES文件中的名子.
-icmp-type [!] typename 指定匹配規則的ICMP信息類型(可以使用 iptables -p icmp -h 查看有效的ICMP類型名)
-i [!] interface name[+] 匹配單獨或某種類型的接口,此參數忽略時,默認符合所有接口,接口可以使用"!"來匹配捕食指定接口來的包.參數interface是接口名,如 eth0, eht1, ppp0等,指定一個目前不存在的接口是完全合法的,規則直到接口工作時才起作用,折中指定對於PPP等類似連接是非常有用的."+"表示匹配所有此類型接口.該選項只針對於INPUT,FORWARD和PREROUTING鏈是合法的.
-o [!] interface name[+] 匹配規則的對外網絡接口,該選項只針對於OUTPUT,FORWARD,POSTROUTING鏈是合法的.
[!] --syn 僅僅匹配設置了SYN位, 清除了ACK, FIN位的TCP包. 這些包表示請求初始化的TCP連接.阻止從接口來的這樣的包將會阻止外來的TCP連接請求.但輸出的TCP連接請求將不受影響.這個參數僅僅當協議類型設置爲了TCP才能使用. 此參數可以使用"!"標誌匹配已存在的返回包,一般用於限制網絡流量,即只允許已有的,向外發送的連接所返回的包.
----------------------------------------------------------
如何制定永久規則集:
/etc/sysconfig/iptables 文件是 iptables 守護進程調用的默認規則集文件.
可以使用以下命令保存執行過的IPTABLES命令:
/sbin/iptables-save > /etc/sysconfig/iptables
要恢復原來的規則庫,可以使用:
/sbin/iptables-restore < /etc/sysconfig/iptables
iptables命令和route等命令一樣,重啓之後就會恢復,所以:
[root@rhlinux root]# service iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]
令一種方法是 /etc/rc.d/init.d/iptables 是IPTABLES的啓動腳本,所以:
[root@rhlinux root]# /etc/rc.d/init.d/iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]
以上幾種方法只使用某種即可.
若要自定義腳本,可直接使用iptables命令編寫一個規則腳本,並在啓動時執行:
例如若規則使用腳本文件名/etc/fw/rule, 則可以在/etc/rc.d/rc.local中加入以下代碼:
if [-x /etc/fw/rule]; then /etc/fw/sule; fi;
這樣每次啓動都執行該規則腳本,如果用這種方法,建議NTSYSV中停止IPTABLES.
----------------------------------------------------------
實例:
鏈基本操作:
[root@rh34 root]# iptables -L -n
(列出表/鏈中的所有規則,包過濾防火牆默認使用的是filter表,因此使用此命令將列出filter表中所有內容,-n參數可加快顯示速度,也可不加-n參數。)
[root@rh34 root]# iptables -F
(清除預設表filter中所有規則鏈中的規則)
[root@rh34 root]# iptables -X
(清除預設表filter中使用者自定義鏈中的規則)
[root@rh34 root]# iptables -Z
(將指定鏈規則中的所有包字節計數器清零)
------------------------------------------------------------
設置鏈的默認策略,默認允許所有,或者丟棄所有:
[root@rh34 root]# iptables -P INPUT ACCEPT
[root@rh34 root]# iptables -P OUTPUT ACCEPT
[root@rh34 root]# iptables -P FORWARD ACCEPT
(以上我們在不同方向設置默認允許策略,若丟棄則應是DROP,嚴格意義上防火牆應該是DROP然後再允許特定)
---------------------------------------------------------------
向鏈中添加規則,下面的例子是開放指定網絡接口(信任接口時比較實用):
[root@rh34 root]# iptables -A INPUT -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A OUTPUT -o eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -o eth1 -j ACCEPT
--------------------------------------------------------------
使用用戶自定義鏈:
[root@rh34 root]# iptables -N brus
(創建一個用戶自定義名叫brus的鏈)
[root@rh34 root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此鏈中設置了一條規則)
[root@rh34 root]# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向默認的INPUT鏈添加一條規則,使所有包都由brus自定義鏈處理)
----------------------------------------------------------------
基本匹配規則實例:
匹配協議:
iptables -A INPUT -p tcp
(指定匹配協議爲TCP)
iptables -A INPUT -p ! tcp
(指定匹配TCP以外的協議)
匹配地址:
iptables -A INPUT -s 192.168.1.1
(匹配主機)
iptables -A INPUT -s 192.168.1.0/24
(匹配網絡)
iptables -A FORWARD -s ! 192.168.1.1
(匹配以外的主機)
iptables -A FORWARD -s ! 192.168.1.0/24
(匹配以外的網絡)
匹配接口:
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(匹配某個指定的接口)
iptables -A FORWARD -o ppp+
(匹配所有類型爲ppp的接口)
匹配端口:
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(匹配單一指定源端口)
iptables -A INPUT -p ucp --dport 53
(匹配單一指定目的端口)
iptables -A INPUT -p ucp --dport ! 53
(指定端口以外)
iptables -A INPUT -p tcp --dport 22:80
(指定端口範圍,這裏我們實現的是22到80端口)
---------------------------------------------------------------------------------
指定IP碎片的處理:
[root@rh34 root]# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
----------------------------------------------------------------------------------
設置擴展的規測匹配:
(希望獲得匹配的簡要說明,可使用: iptables -m name_of_match --help)
多端口匹配擴展:
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(匹配多個源端口)
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(匹配多個目的端口)
iptables -A INPUT -p tcp -m multiport --port 22,53,80
(匹配多個端口,無論是源還是目的端口)
-----------------------------------------------------------------------------
TCP匹配擴展:
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的標誌都要被檢查,但是隻有設置了SYN的才匹配)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的標誌都被檢查,但是隻有設置了SYN和ACK的才匹配)
iptables -p tcp --syn
(選項--syn是以上的一種特殊情況,相當於“--tcp-flags SYN,RST,ACK SYN”的簡寫)
--------------------------------------------------------------------------------
limit速率匹配擴展:
[root@redhatlinux9 root]# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小時允許通過300個數據包)
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定觸發時間的值(默認爲5),用來比對瞬間大量數據包的數量。)
(上面的例子用來比對一次同時湧入的數據包是否超過十個,超過此上限的包將直接被丟棄)
[root@redhatlinux9 root]# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假設均勻通過,平均每分鐘3個,那麼觸發值burst保持爲3。如果每分鐘通過的包的數目小於3,那麼觸發值busrt將在每個週期(若每分鐘允許通過3個,則週期數爲20秒)後加1,但最大值爲3。每分鐘要通過的包數量如果超過3,那麼觸發值busrt將減掉超出的數值,例如第二分鐘有4個包,那麼觸發值變爲2,同時4個包都可以通過,第三分鐘有6個包,則只能通過5個,觸發值busrt變爲0。之後,每分鐘如果包數量小於等於3個,則觸發值busrt將加1,如果每分鐘包數大於3,觸發值busrt將逐漸減少,最終維持爲0)
(即每分鐘允許的最大包數量等於限制速率(本例中爲3)加上當前的觸發值busrt數。任何情況下,都可以保證3個包通過,觸發值busrt相當於是允許額外的包數量)
---------------------------------------------------------------------------------
基於狀態的匹配擴展(連接跟蹤):
每個網絡連接包括以下信息:源和目的地址、源和目的端口號,稱爲套接字對(cocket pairs);協議類型、連接狀態(TCP協議)和超時時間等。防火牆把這些叫做狀態(stateful)。能夠監測每個連接狀態的防火牆叫做狀態寶過濾防火牆,除了能完成普通包過濾防火牆的功能外,還在自己的內存中維護一個跟蹤連接狀態的表,所以擁有更大的安全性。
其命令格式如下:
iptables -m state --state [!] state [,state,state,state]
state表示一個用逗號隔開的的列表,用來指定的連接狀態可以有以下4種:
NEW:該包想要開始一個連接(重新連接或將連接重定向)。
RELATED:該包屬於某個已經建立的連接所建立的新連接。例如FTP的數據傳輸連接和控制連接之間就是RELATED關係。
ESTABLISHED:該包屬於某個已經建立的連接。
INVALID:該包不匹配於任何連接,通常這些包會被DROP。
例如:
[root@redhatlinux9 root]# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(匹配已經建立的連接或由已經建立的連接所建立的新連接。即匹配所有的TCP迴應包)
[root@redhatlinux9 root]# iptables -A INPUT -m state --state NEW -i ! eth0
(匹配所有從非eth0接口來的連接請求包)
下面是一個被動(Passive)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
[root@redhatlinux9 root]# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一個主動(Active)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
--------------------------------------------------------------------------------------
日誌記錄:
格式爲: -j LOG --log-level 7 --log-prefix "......"
[root@redhatlinux9 root]# iptables -A FORWARD -m tcp -p tcp -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -m icmp -p icmp -f -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
[root@redhatlinux9 root]# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"
iptables 是建立在 netfilter 架構基礎上的一個包過濾管理工具,最主要的作用是用來做防火牆或透明代理。Iptables 從 ipchains 發展而來,它的功能更爲強大。Iptables 提供以下三種功能:包過濾、NAT(網絡地址轉換)和通用的 pre-route packet mangling。包過濾:用來過濾包,但是不修改包的內容。Iptables 在包過濾方面相對於 ipchians 的主要優點是速度更快,使用更方便。NAT:NAT 可以分爲源地址 NAT 和目的地址 NAT。
Iptables 可以追加、插入或刪除包過濾規則。實際上真正執行這些過慮規則的是 netfilter 及其相關模塊(如 iptables 模塊和 nat 模塊)。Netfilter 是 Linux 核心中一個通用架構,它提供了一系列的 “表”(tables),每個表由若干 “鏈”(chains)組成,而每條鏈中可以有一條或數條 “規則”(rule)組成。
系統缺省的表爲 “filter”,該表中包含了 INPUT、FORWARD 和 OUTPUT 3 個鏈。
每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的:如果數據包頭符合這樣的條件,就這樣處理這個數據包。當一個數據包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件: 如果滿足,系統將根據該條規則所定義的方法處理該數據包;如果不滿足則繼續檢查下一條規則。最後,如果該數據包不符合該鏈中任一條規則的話,系統就會根據該鏈預先定義的策略來處理該數據包。
? table,chain,rule
iptables 可以操縱3 個表:filter 表,nat 表,mangle 表。
NAT 和一般的 mangle 用 -t 參數指定要操作哪個表。filter 是默認的表,如果沒有 -t 參數,就默認對 filter 表操作。
Rule 規則:過濾規則,端口轉發規則等,例如:禁止任何機器 ping 我們的服務器,可以在服務器上設置一條規則:
iptables -A INPUT -s ! 127.0.0.1 -p icmp -j DROP
從 –s 開始即是一條規則,-j 前面是規則的條件,-j 開始是規則的行爲(目的)。整條命令解釋爲,在filter 表中的 INPUT 規則鏈中插入一條規則,所有源地址不爲 127.0.0.1 的 icmp 包都被拋棄。
Chain 規則鏈:由一系列規則組成,每個包順序經過 chain 中的每一條規則。chain 又分爲系統 chain和用戶創建的 chain。下面先敘述系統 chain。
filter 表的系統 chain: INPUT,FORWAD,OUTPUT
nat 表的系統 chain: PREROUTING,POSTROUTING,OUTPUT
mangle 表的系統 chain: PREROUTING,OUTPUT
每條系統 chain 在確定的位置被檢查。比如在包過濾中,所有的目的地址爲本地的包,則會進入INPUT 規則鏈,而從本地出去的包會進入 OUTPUT 規則鏈。
所有的 table 和 chain 開機時都爲空,設置 iptables 的方法就是在合適的 table 和系統 chain 中添相應的規則。
--------------------------------------------------------------
IPTABLES 語法:
表: iptables從其使用的三個表(filter、nat、mangle)而得名, 對包過濾只使用 filter 表, filter還是默認表,無需顯示說明.
操作命令: 即添加、刪除、更新等。
鏈:對於包過濾可以針對filter表中的INPUT、OUTPUT、FORWARD鏈,也可以操作用戶自定義的鏈。
規則匹配器:可以指定各種規則匹配,如IP地址、端口、包類型等。
目標動作:當規則匹配一個包時,真正要執行的任務,常用的有:
ACCEPT 允許包通過
DROP 丟棄包
一些擴展的目標還有:
REJECT 拒絕包,丟棄包同時給發送者發送沒有接受的通知
LOG 包有關信息記錄到日誌
TOS 改寫包的TOS值
爲使FORWARD規則能夠生效,可使用下面2種方法的某種:
[root@rhlinux root]# vi /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# vi /etc/sysconfig/network
[root@rhlinux root]# echo "FORWARD_IPV4=true" > /etc/sysconfig/network
--------------------------------------------------------
iptables語法可以簡化爲下面的形式:
iptables [-t table] CMD [chain] [rule-matcher] [-j target]
--------------------------------------------------------
常用操作命令:
-A 或 -append 在所選鏈尾加入一條或多條規則
-D 或 -delete 在所選鏈尾部刪除一條或者多條規則
-R 或 -replace 在所選鏈中替換一條匹配規則
-I 或 -insert 以給出的規則號在所選鏈中插入一條或者多條規則. 如果規則號爲1,即在鏈頭部.
-L 或 -list 列出指定鏈中的所有規則,如果沒有指定鏈,將列出鏈中的所有規則.
-F 或 -flush 清除指定鏈和表中的所由規則, 假如不指定鏈,那麼所有鏈都將被清空.
-N 或 -new-chain 以指定名創建一條新的用戶自定義鏈,不能與已有鏈名相同.
-X 或 -delete-chain 刪除指定的用戶定義簾,必需保證鏈中的規則都不在使用時才能刪除,若沒有指定鏈,則刪除所有用戶鏈.
-P 或 -policy 爲永久簾指定默認規則(內置鏈策略),用戶定義簾沒有缺省規則,缺省規則也使規則鏈中的最後一條規則,用-L顯示時它在第一行顯示.
-C 或 -check 檢查給定的包是否與指定鏈的規則相匹配.
-Z 或 -zero 將指定簾中所由的規則包字節(BYTE)計數器清零.
-h 顯示幫助信息.
-------------------------------------------------------------
常用匹配規則器:
-p , [!] protocol 指出要匹配的協議,可以是tcp, udp, icmp, all, 前綴!爲邏輯非,表示除該協議外的所有協議.
-s [!] address[/mask] 指定源地址或者地址範圍.
-sport [!] port[:port] 指定源端口號或範圍,可以用端口號也可以用/ETC/SERVICES文件中的名子.
-d [!] address[/mask] 指定目的地址或者地址範圍.
-dport [!] port[:port] 指定目的端口號或範圍,可以用端口號也可以用/ETC/SERVICES文件中的名子.
-icmp-type [!] typename 指定匹配規則的ICMP信息類型(可以使用 iptables -p icmp -h 查看有效的ICMP類型名)
-i [!] interface name[+] 匹配單獨或某種類型的接口,此參數忽略時,默認符合所有接口,接口可以使用"!"來匹配捕食指定接口來的包.參數interface是接口名,如 eth0, eht1, ppp0等,指定一個目前不存在的接口是完全合法的,規則直到接口工作時才起作用,折中指定對於PPP等類似連接是非常有用的."+"表示匹配所有此類型接口.該選項只針對於INPUT,FORWARD和PREROUTING鏈是合法的.
-o [!] interface name[+] 匹配規則的對外網絡接口,該選項只針對於OUTPUT,FORWARD,POSTROUTING鏈是合法的.
[!] --syn 僅僅匹配設置了SYN位, 清除了ACK, FIN位的TCP包. 這些包表示請求初始化的TCP連接.阻止從接口來的這樣的包將會阻止外來的TCP連接請求.但輸出的TCP連接請求將不受影響.這個參數僅僅當協議類型設置爲了TCP才能使用. 此參數可以使用"!"標誌匹配已存在的返回包,一般用於限制網絡流量,即只允許已有的,向外發送的連接所返回的包.
----------------------------------------------------------
如何制定永久規則集:
/etc/sysconfig/iptables 文件是 iptables 守護進程調用的默認規則集文件.
可以使用以下命令保存執行過的IPTABLES命令:
/sbin/iptables-save > /etc/sysconfig/iptables
要恢復原來的規則庫,可以使用:
/sbin/iptables-restore < /etc/sysconfig/iptables
iptables命令和route等命令一樣,重啓之後就會恢復,所以:
[root@rhlinux root]# service iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]
令一種方法是 /etc/rc.d/init.d/iptables 是IPTABLES的啓動腳本,所以:
[root@rhlinux root]# /etc/rc.d/init.d/iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]
以上幾種方法只使用某種即可.
若要自定義腳本,可直接使用iptables命令編寫一個規則腳本,並在啓動時執行:
例如若規則使用腳本文件名/etc/fw/rule, 則可以在/etc/rc.d/rc.local中加入以下代碼:
if [-x /etc/fw/rule]; then /etc/fw/sule; fi;
這樣每次啓動都執行該規則腳本,如果用這種方法,建議NTSYSV中停止IPTABLES.
----------------------------------------------------------
實例:
鏈基本操作:
[root@rh34 root]# iptables -L -n
(列出表/鏈中的所有規則,包過濾防火牆默認使用的是filter表,因此使用此命令將列出filter表中所有內容,-n參數可加快顯示速度,也可不加-n參數。)
[root@rh34 root]# iptables -F
(清除預設表filter中所有規則鏈中的規則)
[root@rh34 root]# iptables -X
(清除預設表filter中使用者自定義鏈中的規則)
[root@rh34 root]# iptables -Z
(將指定鏈規則中的所有包字節計數器清零)
------------------------------------------------------------
設置鏈的默認策略,默認允許所有,或者丟棄所有:
[root@rh34 root]# iptables -P INPUT ACCEPT
[root@rh34 root]# iptables -P OUTPUT ACCEPT
[root@rh34 root]# iptables -P FORWARD ACCEPT
(以上我們在不同方向設置默認允許策略,若丟棄則應是DROP,嚴格意義上防火牆應該是DROP然後再允許特定)
---------------------------------------------------------------
向鏈中添加規則,下面的例子是開放指定網絡接口(信任接口時比較實用):
[root@rh34 root]# iptables -A INPUT -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A OUTPUT -o eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -o eth1 -j ACCEPT
--------------------------------------------------------------
使用用戶自定義鏈:
[root@rh34 root]# iptables -N brus
(創建一個用戶自定義名叫brus的鏈)
[root@rh34 root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此鏈中設置了一條規則)
[root@rh34 root]# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向默認的INPUT鏈添加一條規則,使所有包都由brus自定義鏈處理)
----------------------------------------------------------------
基本匹配規則實例:
匹配協議:
iptables -A INPUT -p tcp
(指定匹配協議爲TCP)
iptables -A INPUT -p ! tcp
(指定匹配TCP以外的協議)
匹配地址:
iptables -A INPUT -s 192.168.1.1
(匹配主機)
iptables -A INPUT -s 192.168.1.0/24
(匹配網絡)
iptables -A FORWARD -s ! 192.168.1.1
(匹配以外的主機)
iptables -A FORWARD -s ! 192.168.1.0/24
(匹配以外的網絡)
匹配接口:
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(匹配某個指定的接口)
iptables -A FORWARD -o ppp+
(匹配所有類型爲ppp的接口)
匹配端口:
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(匹配單一指定源端口)
iptables -A INPUT -p ucp --dport 53
(匹配單一指定目的端口)
iptables -A INPUT -p ucp --dport ! 53
(指定端口以外)
iptables -A INPUT -p tcp --dport 22:80
(指定端口範圍,這裏我們實現的是22到80端口)
---------------------------------------------------------------------------------
指定IP碎片的處理:
[root@rh34 root]# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
----------------------------------------------------------------------------------
設置擴展的規測匹配:
(希望獲得匹配的簡要說明,可使用: iptables -m name_of_match --help)
多端口匹配擴展:
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(匹配多個源端口)
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(匹配多個目的端口)
iptables -A INPUT -p tcp -m multiport --port 22,53,80
(匹配多個端口,無論是源還是目的端口)
-----------------------------------------------------------------------------
TCP匹配擴展:
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的標誌都要被檢查,但是隻有設置了SYN的才匹配)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的標誌都被檢查,但是隻有設置了SYN和ACK的才匹配)
iptables -p tcp --syn
(選項--syn是以上的一種特殊情況,相當於“--tcp-flags SYN,RST,ACK SYN”的簡寫)
--------------------------------------------------------------------------------
limit速率匹配擴展:
[root@redhatlinux9 root]# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小時允許通過300個數據包)
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定觸發時間的值(默認爲5),用來比對瞬間大量數據包的數量。)
(上面的例子用來比對一次同時湧入的數據包是否超過十個,超過此上限的包將直接被丟棄)
[root@redhatlinux9 root]# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假設均勻通過,平均每分鐘3個,那麼觸發值burst保持爲3。如果每分鐘通過的包的數目小於3,那麼觸發值busrt將在每個週期(若每分鐘允許通過3個,則週期數爲20秒)後加1,但最大值爲3。每分鐘要通過的包數量如果超過3,那麼觸發值busrt將減掉超出的數值,例如第二分鐘有4個包,那麼觸發值變爲2,同時4個包都可以通過,第三分鐘有6個包,則只能通過5個,觸發值busrt變爲0。之後,每分鐘如果包數量小於等於3個,則觸發值busrt將加1,如果每分鐘包數大於3,觸發值busrt將逐漸減少,最終維持爲0)
(即每分鐘允許的最大包數量等於限制速率(本例中爲3)加上當前的觸發值busrt數。任何情況下,都可以保證3個包通過,觸發值busrt相當於是允許額外的包數量)
---------------------------------------------------------------------------------
基於狀態的匹配擴展(連接跟蹤):
每個網絡連接包括以下信息:源和目的地址、源和目的端口號,稱爲套接字對(cocket pairs);協議類型、連接狀態(TCP協議)和超時時間等。防火牆把這些叫做狀態(stateful)。能夠監測每個連接狀態的防火牆叫做狀態寶過濾防火牆,除了能完成普通包過濾防火牆的功能外,還在自己的內存中維護一個跟蹤連接狀態的表,所以擁有更大的安全性。
其命令格式如下:
iptables -m state --state [!] state [,state,state,state]
state表示一個用逗號隔開的的列表,用來指定的連接狀態可以有以下4種:
NEW:該包想要開始一個連接(重新連接或將連接重定向)。
RELATED:該包屬於某個已經建立的連接所建立的新連接。例如FTP的數據傳輸連接和控制連接之間就是RELATED關係。
ESTABLISHED:該包屬於某個已經建立的連接。
INVALID:該包不匹配於任何連接,通常這些包會被DROP。
例如:
[root@redhatlinux9 root]# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(匹配已經建立的連接或由已經建立的連接所建立的新連接。即匹配所有的TCP迴應包)
[root@redhatlinux9 root]# iptables -A INPUT -m state --state NEW -i ! eth0
(匹配所有從非eth0接口來的連接請求包)
下面是一個被動(Passive)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
[root@redhatlinux9 root]# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一個主動(Active)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
--------------------------------------------------------------------------------------
日誌記錄:
格式爲: -j LOG --log-level 7 --log-prefix "......"
[root@redhatlinux9 root]# iptables -A FORWARD -m tcp -p tcp -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -m icmp -p icmp -f -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
[root@redhatlinux9 root]# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.