Background
- Linux 2.3.x 時期 Paul Rusty Russel 寫的
- 基本上就是插入一些 Hooks 到 Kernel module
- Iptables 常常跟 Netfilter Framework 搞混,Iptables 屬於 Netfilter Framework 的一員
Hooks and The Callback Functions
有五種 Hooks 會插入在 Linux networking stack 中的不同階段
--> PREROUTING ---> [ROUTE] ---> FORWARD -------------------> POSTROUTING --> |
- PREROUTING: 所有封包都會經過這個階段,Port
Address Translation (NAPT), Redirections, Destination Network Translation (DNAT) 皆是在這裡被實現 - LOCAL INPUT: 只要是封包傳送到本機,最後一站會到達這裡
- FORWARD: 只要封包不是要送到本機(如:要經過防火牆),會抵達這個階段
- LOCAL OUTPUT: 從本機發出的封包第一站會經此
- POSTROUTING: 當路由被決定後,離開本機端的封包會經過此。Source Network Address Translation (SNAT) 在此被實作
Source Network Address Translation (SNAT) 在此被實作
可以依照封包目的地分成三種類型
- 穿過防火牆: PREROUTING > FORWARD > POSTROUTING
- 進入防火牆(本機): PREROUTING > LOCAL IN
- 離開防火牆: OUT > POSTROUTING
Callback 可以分為幾種
- ACCEPT: 讓封包通過此 Stack 繼續前進
- DROP: 直接把封包拋棄
- QUEUE: 丟入 userspace nf_queue,讓使用者程式來處理封包
- STOLEN: 暫時保管封包,直到發生特定事件。通常用在 collect defragmented IP packets
- REPEAT: 強迫封包再次進入 Hook
關於封包在 Linux Kernel 是怎麼旅遊的可以參考:
The Connection Tracking System and the Stateful Inspection
以往在做 Packet Filtering 的時候都是透過封包的標頭檔,像是 IP, PORTS, Destination 在這幾年,這種方式已經透露出它的缺點:DDoS 攻擊容易…
Connection tracking system 會儲存連線資訊在記憶體中,包含的資訊有 source and destination
IP addresses, port number pairs, protocol types, state, and timeout 透過這些資訊,可以用比較智慧的方式來來過濾封包。
這邊要特別記住一點是,Connection tracking system 從不過濾封包,而只是記錄封包路過 Network Stack 的行蹤;還有一些例外狀況,如:記憶體滿了封包被扔掉。
Connection tracking system just tracks packets; it does
not filter.
關於 State
- NEW: 新連線剛開始,表示抵達的封包是通過驗證的 (如:TCP 的 SYNC 封包);防火牆只看到單方的傳輸(如:防火牆尚未看到任何回覆的封包)
- ESTABLISHED: 連線已經建立,到達這個狀態表示防火牆已看到兩邊雙向溝通
- RELATED: 這是一個被期待發生的連線,詳見 “Helpers and Expectations”
- INVALID: 隸屬於特別狀態,管理者可設定去紀錄或拋棄此類封包