1、前言
在玩 IPTables 以前我們必須先了解一下,您所下的 iptables 防火牆規則對封包進行過濾、封包處理、封包狀態變更、NAT、封包 Qos...等,這些工作其實是核心 (kernel) 層級 Netfilter 在處理的,而 iptables 只是一個使用者端的工具讓您方便對 Netfilter 操作而以,以下是對於玩 iptables 時必須先了解的名詞及相關常用指令,以及 iptables 對於封包的處理流程詳細資訊可以參考原廠文件 RedHat - Security Guide 2.6. IPTables。文章目錄
1、前言2、Netfilter 五種封包處理規則
3、Netfilter 三種過瀘規則鏈(chain)
4、Netfilter 四種封包狀態(NEW、INVALID、RELATED、ESTABLISHED)
5、IPTables 封包處理政策 (Policy) 及 目標 (Target)
6、IPTables 指令參數
7、IPTables 設定檔語法
2、Netfilter 五種封包處理規則
必須注意的是 INPUT 及 Forward 處理封包的路徑是不同的,也就是說 Forward 處理的封包會略過 INPUT 及 OUTPUT 規則。- INPUT: 經網卡進入的封包。
- OUTPUT: 經網卡出去的封包。
- FORWARD: 經網卡進入 / 出去轉送的封包。
- PREROUTING: 改變經網卡進入的封包狀態 ( DNAT / REDIRECT )。
- POSTROUTING: 改變經網卡出去的封包狀態 ( SNAT / MASQUERADE )。
3、Netfilter 三種過瀘規則鏈(chain)
- filter: 可以處理 INPUT、OUTPUT、FORWARD 封包狀態 (Default)。
- nat: 可以處理 OUTPUT、PREROUTING、POSTROUTING 封包狀態。
- mangle: 可以處理 INPUT、OUTPUT、FORWRD、PREROUTING、POSTROUTING 封包狀態。
4、Netfilter 四種封包狀態(NEW、INVALID、RELATED、ESTABLISHED)
- NEW: 一個新的連線封包 (建立新連線後的第一個封包)。
- ESTABLISHED: 成功建立的連線,即建立追蹤連線後所有封包狀態 (跟在 NEW 封包後面的所有封包)。
- RELATED: 新建連線,由 ESTABLISHED session 所建立的新獨立連線 (ex. ftp-data 連線)。
- INVALID: 非法連線狀態的封包 (DROP 封包)。
- UNKOWN: 不明連線狀態的封包。
5、IPTables 封包處理政策 (Policy) 及 目標 (Target)
- ACCEPT: 允許封包移動至目的地或另一個 chain。
- DROP: 丟棄封包、不回應要求、不傳送失敗訊息。
- REJECT: 拒絕封包、回應要求、傳送失敗訊息。
- SNAT: 修改 Source Socket。
- DNAT: 修改 Destination Socket。
- MASQUERADE: 動態修改 Source Socket (無法指定 IP,取當時網卡的 IP),較方便但效率較差。
- REDIRECT: 將連線導至本機行程 (Local Process)。
- RETURN: 結束自行定義的 Chain 然後返回原來的 Chain 繼續跑規則 (rules)。
- QUEUE: 封包排隊等待處理。
- LOG: 記錄指定的規則封包 (/etc/syslog.conf , default /var/log/messges)。
6、IPTables 指令參數
處理 iptables 規則時常用到如下參數:- -h:help information。
- -V:顯示 iptables 版本。
- -I:將規則插入至最前面 or 加上號碼插入指定處。
- -A:將規則插入至最後面。
- -R:取代指定的規則 (加上規則號碼)。
- -D:刪除指定的規則 (加上規則號碼)。
- -F:刪除所有的規則。
處理 iptables 規則鏈(chain)時常用到如下參數
- -N:建立新的規則鏈(chain)。
- -X:刪除指定的規則鏈(chain)。
- -E:更改指定的規則鏈(chain)名稱。
- -P:變更指定規則鏈(chain)的政策 (ex. policy for DROP、REJECT、ACCEPT)。
- -Z:將 iptables 計數器歸零。
查看目前 iptables 規則時常用到如下參數
- -L:列出目前 iptables 規則 (會執行 DNS 位址解析)。
- -n:不使用 DNS 解析直接以 IP 位址顯示。
- -v:顯示目前 iptables 規則處理的封包數。
- -x:顯示完整封包數 (ex.顯示 1151519,而不是 12M)。
7、IPTables 設定檔語法
iptables 主要設定檔位於 /etc/sysconfig/iptables 當系統重開機且設定開機自動啟動時,系統便會讀取此檔案並套用設定的防火牆規則,你可以把預設的防火牆規則拿來該改即可,你可以手動下 iptables 規則然後在 save 我個人的習慣是直接把規則寫在 /etc/sysconfig/iptables 內,規則語法如下: [-io 網路介面] [-p 協定] [-m 模組] [-s 來源] [-d 目的地] [-j 政策]
- -i 網路介面: -i 為 in 網路介面就填 eth0... (用於 PREROUTING、INPUT、FORWARD)
- -o 網路介面: -o 為 out 網路介面就填 eth0... (用於 POSTROUTING、OUTPUT、FORWARD)
- -m 模組: state、mac、limit、owner、multiport...
- -p 協定: tcp、upd、icmp...
- -s 來源: 可為 IP Address、IP 網段、網域名稱
- --sport: 指定封包來源 Port、Port Range (配合 -p tcp、-p udp)
- -d 目的地: 可為 IP、IP 網段、網域名稱
- --dport: 指定封包目的地 Port、Port Range (配合 -p tcp、-p udp)
- -j 政策 / 目標: ACCEPT、DROP、REJECT、SNAT、DNAT、MASQUERADE、REDIRECT、RETURN...
預設情況下安裝好 CentOS 便會啟動 IPTtable 防火牆功能,並且只允許 SSH 服務 (Port 22) 可以通過,所以我們可以將此檔案備份後直接進行修改來開啟需要允許的 Port 號及協定 Protocol,或者在圖形介面中也可以透過 「system-config-firewall」 叫出圖形介面進行設定也可。
# cat /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
確定 iptables 服務是否開機會自動啟動 (ntsysv or setup)。
# chkconfig iptables --list
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off