在玩 IPTables 以前我們必須先了解一下,您所下的 iptables 防火牆規則對封包進行過濾、封包處理、封包狀態變更、NAT、封包 Qos...等,這些工作其實是核心 (kernel) 層級 Netfilter 在處理的,而 iptables 只是一個使用者端的工具讓您方便對 Netfilter http://www.netfilter.org/ 操作而以,以下是對於玩 iptables 時必須先了解的名詞及相關常用指令,以及 iptables 對於封包的處理流程 (圖片來源: RedHat - Security Guide),詳細資訊可以參考原廠文件 RedHat - Security Guide 2.6. IPTables。
----- Netfilter 五種封包處理規則 -----
必須注意的是 INPUT 及 Forward 處理封包的路徑是不同的,也就是說 Forward 處理的封包會略過 INPUT 及 OUTPUT 規則。
*** INPUT:**經網卡進入的封包
*** OUTPUT:**經網卡出去的封包
*** FORWARD:**經網卡進入 / 出去轉送的封包
*** PREROUTING:**改變經網卡進入的封包狀態 ( DNAT / REDIRECT )
*** POSTROUTING:**改變經網卡出去的封包狀態 ( SNAT / MASQUERADE )
----- Netfilter 三種過瀘規則鏈(chain) -----
*** filter:**可以處理 INPUT、OUTPUT、FORWARD 封包狀態 (Default)
*** nat:**可以處理 OUTPUT、PREROUTING、POSTROUTING 封包狀態
*** mangle:**可以處理 INPUT、OUTPUT、FORWRD、PREROUTING、POSTROUTING 封包狀態
----- Netfilter 四種封包狀態(NEW、INVALID、RELATED、ESTABLISHED) -----
*** NEW:**一個新的連線封包 (建立新連線後的第一個封包)
*** ESTABLISHED:**成功建立的連線,即建立追蹤連線後所有封包狀態 (跟在 NEW 封包後面的所有封包)
*** RELATED:**新建連線,由 ESTABLISHED session 所建立的新獨立連線 (ex. ftp-data 連線)
*** INVALID:**非法連線狀態的封包 (DROP 封包)
*** UNKOWN:**不明連線狀態的封包
----- 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)
----- 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)
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
(上一篇)邁向 RHCE 之路 (Day21) - 主機基礎安全防護 TCP Wrappers
(下一篇)邁向 RHCE 之路 (Day23) - 擴充 YUM 套件管理工具 RPM 數量
邁向 RHCE 之路系列文章連結