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:"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章