Linux系統Iptables規則執行順序詳細講解
預備知識(轉): iptable有三種隊列(表)規則,mangle queue, filter queue, nat queue。
1。The first is the mangle table which is responsible for the alteration of quality of service bits in the TCP header.
2。The second table is the filter queue which is responsible for packet filtering.
* Forward chain: Filters packets to servers protected by the firewall.
* Input chain: Filters packets destined for the firewall.
* Output chain: Filters packets originating from the firewall.
3。The third table is the nat queue which is responsible for network address translation. It has two built-in chains; these are:
* Pre-routing chain: NATs packets when the destination address of the packet needs to be changed.
* Post-routing chain: NATs packets when the source address of the packet needs to be changed
個人總結:
iptables執行規則時,是從從規則表中從上至下順序執行的,如果沒遇到匹配的規則,就一條一條往下執行,如果遇到匹配的規則後,那麼就執行本規則,執行後根據本規則的動作(accept, reject, log等),決定下一步執行的情況,後續執行一般有三種情況。
1。一種是繼續執行當前規則隊列內的下一條規則。比如執行過Filter隊列內的LOG後,還會執行Filter隊列內的下一條規則。
2。一種是中止當前規則隊列的執行,轉到下一條規則隊列。比如從執行過accept後就中斷Filter隊列內其它規則,跳到nat隊列規則去執行
3。一種是中止所有規則隊列的執行。
iptables 是采用規則堆棧的方式來進行過濾,當一個封包進入網卡,會先檢查 Prerouting,然後檢查目的 IP 判斷是否需要轉送出去,接著就會跳到 INPUT 或 Forward 進行過濾,如果封包需轉送處理則檢查 Postrouting,如果是來自本機封包,則檢查 OUTPUT 以及 Postrouting。過程中如果符合某條規則將會進行處理,處理動作除了 ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 以外,還多出 LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等,其中某些處理動作不會中斷過濾程序,某些處理動作則會中斷同一規則煉的過濾,並依照前述流程繼續進行下一個規則煉的過濾(注意:這一點與 ipchains 不同),一直到堆棧中的規則檢查完畢為止。透過這種機制所帶來的好處是,我們可以進行復雜、多重的封包過濾,簡單的說,iptables 可以進行縱橫交錯式的過濾(tables)而非煉狀過濾(chains)。
ACCEPT 將封包放行,進行完此處理動作後,將不再比對其它規則,直接跳往下一個規則煉(nat:postrouting)。
REJECT 攔阻該封包,並傳送封包通知對方,可以傳送的封包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是 tcp-reset(這個封包會要求對方關閉聯機),進行完此處理動作後,將不再比對其它規則,直接 中斷過濾程序。 范例如下:
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
DROP 丟棄封包不予處理,進行完此處理動作後,將不再比對其它規則,直接中斷過濾程序。
REDIRECT 將封包重新導向到另一個端口(PNAT),進行完此處理動作後,將 會繼續比對其它規則。 這個功能可以用來實作通透式 porxy 或用來保護 web 服務器。例如:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
MASQUERADE 改寫封包來源 IP 為防火牆 NIC IP,可以指定 port 對應的范圍,進行完此處理動作後,直接跳往下一個規則煉(mangle:postrouting)。這個功能與 SNAT 略有不同,當進行 IP 偽裝時,不需指定要偽裝成哪個 IP,IP 會從網卡直接讀取,當使用撥接連線時,IP 通常是由 ISP 公司的 DHCP 服務器指派的,這個時候 MASQUERADE 特別有用。范例如下:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG 將封包相關訊息紀錄在 /var/log 中,詳細位置請查閱 /etc/syslog.conf 組態檔,進行完此處理動作後,將會繼續比對其它規則。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT 改寫封包來源 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作後,將直接跳往下一個規則煉(mangle:postrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改寫封包目的地 IP 為某特定 IP 或 IP 范圍,可以指定 port 對應的范圍,進行完此處理動作後,將會直接跳往下一個規則煉(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR 鏡射封包,也就是將來源 IP 與目的地 IP 對調後,將封包送回,進行完此處理動作後,將會中斷過濾程序。
QUEUE 中斷過濾程序,將封包放入隊列,交給其它程序處理。透過自行開發的處理程序,可以進行其它應用,例如:計算聯機費用.......等。
RETURN 結束在目前規則煉中的過濾程序,返回主規則煉繼續過濾,如果把自訂規則煉看成是一個子程序,那麼這個動作,就相當於提早結束子程序並返回到主程序中。
MARK 將封包標上某個代號,以便提供作為後續過濾的條件判斷依據,進行完此處理動作後,將會繼續比對其它規則。范例如下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2