Netfilter是由Rusty Russell提出的Linux 2.4內核防火牆框架,該框架既簡潔又靈活,可實現安全策略應用中的許多功能,如數據包過濾、數據包處理、地址假裝、透明代理、動態網絡地址轉換(Network Address Translation,NAT),以及基於用戶及媒體訪問控制(Media Access Control,MAC)地址的過濾和基於狀態的過濾、包速率限制等。Iptables/Netfilter的這些規則能夠經過靈活組合,造成很是多的功能、涵蓋各個方面,這一切都得益於它的優秀設計思想。html
Netfilter是Linux操做系統核心層內部的一個數據包處理模塊,它具備以下功能:後端
Netfilter 平臺中制定了數據包的五個掛載點(Hook Point,咱們能夠理解爲回調函數點,數據包到達這些位置的時候會主動調用咱們的函數,使咱們有機會能在數據包路由的時候改變它們的方向、內容),這5個掛載點分別是PRE_ROUTING
、INPUT
、OUTPUT
、FORWARD
、POST_ROUTING
。安全
Netfilter 所設置的規則是存放在內核內存中的,而 iptables 是一個應用層的應用程序,它經過 Netfilter 放出的接口來對存放在內核內存中的 XXtables(Netfilter的配置表)進行修改。這個XXtables由表tables
、鏈chains
、規則rules
組成,iptables在應用層負責修改這個規則文件。相似的應用程序還有 firewalld 。服務器
filter表網絡
主要用於對數據包進行過濾,根據具體的規則決定是否放行該數據包(如DROP、ACCEPT、REJECT、LOG)。filter 表對應的內核模塊爲iptable_filter,包含三個規則鏈:架構
INPUT
鏈:INPUT針對那些目的地是本地的包FORWARD
鏈:FORWARD過濾全部不是本地產生的而且目的地不是本地(即本機只是負責轉發)的包OUTPUT
鏈:OUTPUT是用來過濾全部本地生成的包nat表併發
主要用於修改數據包的IP地址、端口號等信息(網絡地址轉換,如SNAT、DNAT、MASQUERADE、REDIRECT)。屬於一個流的包(由於包
的大小限制致使數據可能會被分紅多個數據包)只會通過這個表一次。若是第一個包被容許作NAT或Masqueraded,那麼餘下的包都會自動地被作相同的操做,也就是說,餘下的包不會再經過這個表。表對應的內核模塊爲 iptable_nat,包含三個鏈:框架
PREROUTING
鏈:做用是在包剛剛到達防火牆時改變它的目的地址OUTPUT
鏈:改變本地產生的包的目的地址POSTROUTING
鏈:在包就要離開防火牆以前改變其源地址mangle表tcp
主要用於修改數據包的TOS(Type Of Service,服務類型)、TTL(Time To Live,生存週期)指以及爲數據包設置Mark標記,以實現Qos(Quality Of Service,服務質量)調整以及策略路由等應用,因爲須要相應的路由設備支持,所以應用並不普遍。包含五個規則鏈——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。函數
raw表
是自1.2.9之後版本的iptables新增的表,主要用於決定數據包是否被狀態跟蹤機制處理。在匹配數據包時,raw表的規則要優先於其餘表。包含兩條規則鏈——OUTPUT、PREROUTING
iptables中數據包和4種被跟蹤鏈接的4種不一樣狀態:
NEW
:該包想要開始一個鏈接(從新鏈接或將鏈接重定向)RELATED
:該包是屬於某個已經創建的鏈接所創建的新鏈接。例如:FTP的數據傳輸鏈接就是控制鏈接所 RELATED出來的鏈接。--icmp-type 0
( ping 應答) 就是--icmp-type 8
(ping 請求)所RELATED出來的。ESTABLISHED
:只要發送並接到應答,一個數據鏈接從NEW變爲ESTABLISHED,並且該狀態會繼續匹配這個鏈接的後續數據包。INVALID
:數據包不能被識別屬於哪一個鏈接或沒有任何狀態好比內存溢出,收到不知屬於哪一個鏈接的ICMP錯誤信息,通常應該DROP這個狀態的任何數據。在處理各類數據包時,根據防火牆規則的不一樣介入時機,iptables供涉及5種默認規則鏈,從應用時間點的角度理解這些鏈:
INPUT
鏈:當接收到防火牆本機地址的數據包(入站)時,應用此鏈中的規則。OUTPUT
鏈:當防火牆本機向外發送數據包(出站)時,應用此鏈中的規則。FORWARD
鏈:當接收到須要經過防火牆發送給其餘地址的數據包(轉發)時,應用此鏈中的規則。PREROUTING
鏈:在對數據包做路由選擇以前,應用此鏈中的規則,如DNAT。POSTROUTING
鏈:在對數據包做路由選擇以後,應用此鏈中的規則,如SNAT。
1
2
3
4
5
6
7
8
9
10
|
-->PREROUTING-->[ROUTE]-->FORWARD-->POSTROUTING-->
mangle
| mangle ^ mangle
nat
| filter | nat
| |
| |
v
|
INPUT OUTPUT
| mangle ^ mangle
| filter | nat
v ------>local------->
| filter
|
其中中INPUT、OUTPUT鏈更多的應用在「主機防火牆」中,即主要針對服務器本機進出數據的安全控制;而FORWARD、PREROUTING、POSTROUTING鏈更多的應用在「網絡防火牆」中,特別是防火牆服務器做爲網關使用時的狀況。
防火牆處理數據包的方式(規則):
ACCEPT
:容許數據包經過DROP
:直接丟棄數據包,不給任何迴應信息REJECT
:拒絕數據包經過,必要時會給數據發送端一個響應的信息。
SNAT
:源地址轉換。在進入路由層面的route以前,從新改寫源地址,目標地址不變,並在本機創建NAT表項,當數據返回時,根據NAT表將目的地址數據改寫爲數據發送出去時候的源地址,併發送給主機。解決內網用戶用同一個公網地址上網的問題。MASQUERADE
,是SNAT的一種特殊形式,適用於像adsl這種臨時會變的ip上
DNAT
:目標地址轉換。和SNAT相反,IP包通過route以後、出本地的網絡棧以前,從新修改目標地址,源地址不變,在本機創建NAT表項,當數據返回時,根據NAT表將源地址修改成數據發送過來時的目標地址,併發給遠程主機。能夠隱藏後端服務器的真實地址。REDIRECT
:是DNAT的一種特殊形式,將網絡包轉發到本地host上(無論IP頭部指定的目標地址是啥),方便在本機作端口轉發。
LOG
:在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則
除去最後一個LOG
,前3條規則匹配數據包後,該數據包不會再往下繼續匹配了,因此編寫的規則順序極其關鍵。
咱們已經知道了Netfilter和Iptables的架構和做用,而且學習了控制Netfilter行爲的Xtables表的結構,那麼這個Xtables表是怎麼在內核協議棧的數據包路由中起做用的呢?
網口數據包由底層的網卡NIC接收,經過數據鏈路層的解包以後(去除數據鏈路幀頭),就進入了TCP/IP協議棧(本質就是一個處理網絡數據包的內核驅動)和Netfilter混合的數據包處理流程中了。數據包的接收、處理、轉發流程構成一個有限狀態向量機,通過一些列的內核處理函數、以及Netfilter Hook點,最後被轉發、或者本次上層的應用程序消化掉。是時候看這張圖了:
從上圖中,咱們能夠總結出如下規律:
咱們在寫Iptables規則的時候,要時刻牢記這張路由次序圖,根據所在Hook點的不一樣,靈活配置規則。
[-t 表名]
:該規則所操做的哪一個表,可使用filter、nat等,若是沒有指定則默認爲filter-A
:新增一條規則,到該規則鏈列表的最後一行-I
:插入一條規則,本來該位置上的規則會日後順序移動,沒有指定編號則爲1-D
:從規則鏈中刪除一條規則,要麼輸入完整的規則,或者指定規則編號加以刪除-R
:替換某條規則,規則替換不會改變順序,並且必須指定編號。-P
:設置某條規則鏈的默認動做-nL
:-L
、-n
,查看當前運行的防火牆規則列表chain名
:指定規則表的哪一個鏈,如INPUT、OUPUT、FORWARD、PREROUTING等[規則編號]
:插入、刪除、替換規則時用,--line-numbers
顯示號碼[-i|o 網卡名稱]
:i是指定數據包從哪塊網卡進入,o是指定數據包從哪塊網卡輸出[-p 協議類型]
:能夠指定規則應用的協議,包含tcp、udp和icmp等[-s 源IP地址]
:源主機的IP地址或子網地址[--sport 源端口號]
:數據包的IP的源端口號[-d目標IP地址]
:目標主機的IP地址或子網地址[--dport目標端口號]
:數據包的IP的目標端口號-m
:extend matches,這個選項用於提供更多的匹配參數,如:
<-j 動做>
:處理數據包的動做,包括ACCEPT、DROP、REJECT等具體實例請參考 iptables經常使用實例備查。
參考