點我進入原文
iptables 命令介紹
原文連結
iptables防火牆可以用於建立過濾(filter)與NAT規則。所有Linux發行版都能使用iptables,因此理解如何配置iptables將會協助你更有效地管理Linux防火牆。如果你是第一次接觸iptables,你會覺得它很複雜,但是一旦你理解iptables的工作原理,你會發現其實它很簡單。
首先介紹iptables的結構:iptables -> Tables -> Chains -> Rules. 簡單地講,tables由chains組成,而chains又由rules組成。如下圖所示。
圖: IPTables Table, Chain, and Rule Structure 一、iptables的表與鏈
iptables具有Filter, NAT, Mangle, Raw四種內建表: 1. Filter表
Filter表示iptables的預設表,因此如果你沒有自訂表格,那麼就預設使用filter表,它具有以下三種內建鏈: INPUT鏈 – 處理來自外部的資料。 OUTPUT鏈 – 處理向外發送的資料。 FORWARD鏈 – 將資料轉寄到原生其他網卡裝置上。 2. NAT表
NAT表有三種內建鏈: PREROUTING鏈 – 處理剛到達本機並在路由轉寄前的資料包。它會轉換資料包中的目標IP地址(destination ip address),通常用於DNAT(destination NAT)。 POSTROUTING鏈 – 處理即將離開原生資料包。它會轉換資料包中的源IP地址(source ip address),通常用於SNAT(source NAT)。 OUTPUT鏈 – 處理本機產生的資料包。 3. Mangle表
Mangle表用於指定如何處理資料包。它能改變TCP頭中的QoS位。Mangle表具有5個內建鏈: PREROUTING OUTPUT FORWARD INPUT POSTROUTING 4. Raw表
Raw表用於處理異常,它具有2個內建鏈: PREROUTING chain OUTPUT chain 5.小結
下圖展示了iptables的三個內建表:
圖: IPTables 內建表 二、IPTABLES 規則(Rules)
牢記以下三點式理解iptables規則的關鍵: Rules包括一個條件和一個目標(target) 如果滿足條件,就執行目標(target)中的規則或者特定值。 如果不滿足條件,就判斷下一條Rules。 目標值(Target Values)
下面是你可以在target裡指定的特殊值: ACCEPT – 允許防火牆接收資料包 DROP – 防火牆丟棄包 QUEUE – 防火牆將資料包移交到使用者空間 RETURN – 防火牆停止執行當前鏈中的後續Rules,並返回到調用鏈(the calling chain)中。
如果你執行iptables --list你將看到防火牆上的可用規則。下例說明當前系統沒有定義防火牆,你可以看到,它顯示了預設的filter表,以及表內預設的input鏈, forward鏈, output鏈。
# iptables -t filter --listChain INPUT (policy ACCEPT)target prot opt source destination Chain FORWARD (policy ACCEPT)target prot opt source destination Chain OUTPUT (policy ACCEPT)target prot opt source destination
查看mangle表:
# iptables -t mangle --list
查看NAT表:
# iptables -t nat --list
查看RAW表:
# iptables -t raw --list
/!\注意:如果不指定-t選項,就只會顯示預設的filter表。因此,以下兩種命令形式是一個意思:
# iptables -t filter --list(or)# iptables --list
以下例子表明在filter表的input鏈, forward鏈, output鏈中存在規則:
# iptables --listChain INPUT (policy ACCEPT)num target prot opt source destination1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0Chain FORWARD (policy ACCEPT)num target prot opt source destination1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0Chain OUTPUT (policy ACCEPT)num target prot opt source destinationChain RH-Firewall-1-INPUT (2 references)num target prot opt source destination1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/02 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 2553 ACCEPT esp -- 0.0.0.0/0 0.0.0.0/04 ACCEPT ah -- 0.0.0.0/0 0.0.0.0/05 ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:53536 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:6317 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:6318 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED9 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:2210 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
以上輸出包含下欄欄位: num – 指定鏈中的規則編號
target – 前面提到的target的特殊值
prot – 協議:tcp, udp, icmp等
source – 資料包的源IP地址
destination – 資料包的目標IP地址 三、清空所有iptables規則
在配置iptables之前,你通常需要用iptables --list命令或者iptables-save命令查看有無現存規則,因為有時需要刪除現有的iptables規則:
iptables --flush或者iptables -F
這兩條命令是等效的。但是並非執行後就萬事大吉了。你仍然需要檢查規則是不是真的清空了,因為有的linux發行版上這個命令不會清除NAT表中的規則,此時只能手動清除:
iptables -t NAT -F
四、永久生效
當你刪除、添加規則後,這些更改並不能永久生效,這些規則很有可能在系統重啟後恢複原樣。為了讓配置永久生效,根據平台的不同,具體操作也不同。下面進行簡單介紹: 1.Ubuntu
首先,儲存現有的規則:
iptables-save > /etc/iptables.rules
然後建立一個bash指令碼,並儲存到/etc/network/if-pre-up.d/目錄下:
#!/bin/bashiptables-restore < /etc/iptables.rules
這樣,每次系統重啟後iptables規則都會被自動載入。
/!\注意:不要嘗試在.bashrc或者.profile中執行以上命令,因為使用者通常不是root,而且這隻能在登入時載入iptables規則。 2.CentOS, RedHat
# 儲存iptables規則service iptables save# 重啟iptables服務service iptables stopservice iptables start
查看當前規則:
cat /etc/sysconfig/iptables
五、追加iptables規則
可以使用iptables -A命令追加新規則,其中-A表示Append。因此,新的規則將追加到鏈尾。
一般而言,最後一條規則用於丟棄(DROP)所有資料包。如果你已經有這樣的規則了,並且使用-A參數添加新規則,那麼就是無用功。 1.文法
iptables -A chain firewall-rule
-A chain – 指定要追加規則的鏈 firewall-rule – 具體的規則參數
2.描述規則的基本參數
以下這些規則參數用於描述資料包的協議、源地址、目的地址、允許經過的網路介面,以及如何處理這些資料包。這些描述是對規則的基本描述。 -p 協議(protocol) 指定規則的協議,如tcp, udp, icmp等,可以使用all來指定所有協議。 如果不指定-p參數,則預設是all值。這並不明智,請總是明確指定協議名稱。 可以使用協議名(如tcp),或者是協議值(比如6代表tcp)來指定協議。映射關係請查看/etc/protocols 還可以使用–protocol參數代替-p參數 -s 源地址(source) 指定資料包的源地址 參數可以使IP地址、網路地址、主機名稱 例如:-s 192.168.1.101指定IP地址 例如:-s 192.168.1.10/24指定網路地址 如果不指定-s參數,就代表所有地址 還可以使用–src或者–source -d 目的地址(destination) 指定目的地址 參數和-s相同 還可以使用–dst或者–destination