linux防火牆iptables詳解

    一、Netfilter/iptables框架簡介

            Netfilter/iptables能夠對流入和流出的信息進行細化控制,且能夠在一臺低配置機器上很好地運行,被認爲是Linux中實現包過濾功能的第四代應用程序。Netfilter/iptables包含在Linux 2.4之後的內核中,能夠實現防火牆、NAT(網絡地址翻譯)和數據包的分割等功能。ios

            netfilter工做在內核內部,而iptables則是讓用戶定義規則集的表結構。Netfilter/iptables從ipchains和ipwadfm(IP防火牆管理)演化而來,功能更增強大。web

            這裏所說的iptables是ipchains的後繼工具,但具備更強的可擴展性。內核模塊能夠註冊一個新的規則表(table),並要求數據包流經指定的規則表。這種數據包選擇用於實現數據報過濾(filter表),網絡地址轉換(NAT表)及數據報處理(mangle表)。Linux 2.4內核及其以上版本提供的這三種數據報處理功能都基於netfilter的鉤子函數和IP表,都是相互間獨立的模塊,完美地集成到了由netfilter提供的框架中,如圖1所示。netfilter主要提供了以下三項功能:安全

  1. 包過濾:filter表格不會對數據報進行修改,而只對數據報進行過濾。iptables優於ipchains的一個方面就是它更爲小巧和快速。它是經過鉤子函數NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。
  2. NAT:NAT表格監聽三個netfilter鉤子函數:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。NF_IP_PRE_ROUTING實現對須要轉發數據報的源地址進行地址轉換,而NF_IP_POST_ROUTING則對須要轉發的數據報目的地址進行地址轉換。對於本地數據報目的地址的轉換,則由NF_IP_LOCAL_OUT來實現。
  3. 數據報處理:mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT鉤子中進行註冊。使用mangle表,能夠實現對數據報的修改或給數據報附上一些外帶數據。當前mangle表支持修改TOS位及設置skb的nfmard字段。

Netfilter/Iptables框架結構示意圖
            圖1 Netfilter/Iptables框架結構示意圖服務器

            根據實際狀況,靈活運用Netfilter/iptables框架,生成相應的防火牆規則能夠方便、高效地阻斷部分網絡攻擊以及非法數據報(參見圖2所示的工做原理)。然而,因爲配置了防火牆,可能引發諸如FTP、QQ、MSN等協議和軟件沒法使用或者某些功能沒法正常使用,也有可能引發RPC(遠程過程調用)沒法執行,這須要用戶根據實際狀況來配置相應的服務代理程序來開啓這些服務。網絡

            須要特別提醒注意的是,防火牆也可能被內部攻擊,其並非萬能的,還須要綜合使用其餘防禦手段。內部人員因爲沒法經過Telnet瀏覽郵件或使用FTP向外發送信息,個別人會對防火牆不滿進而可能對其進行攻擊和破壞。並且,攻擊的目標經常是防火牆或防火牆運行的操做系統,這極大地危害了防火牆系統甚至是關鍵信息系統的安全。app

Netfilter/Iptables框架工做原理示意
            圖2 Netfilter/Iptables框架工做原理示意框架

 

    二、iptables基本原理

            經過向防火牆提供有關對來自某個源、到某個目的地或具備特定協議類型的信息包要作些什麼的指令,規則控制信息包的過濾。經過使用Netfilter/iptables系統提供的特殊命令iptables,創建這些規則,並將其添加到內核空間的特定信息包過濾表內的鏈中。關於添加/除去/編輯規則的命令的通常語法以下:tcp

iptables [-t table] command [match] [target]

不難看出,一條iptables規則包含以下4個基本元素:函數

  1. 命令
  2. 匹配
  3. 目標

1) 表(table)工具

            [-t table]選項容許使用標準表以外的任何表。表是包含僅處理特定類型信息包的規則和鏈的信息包過濾表。

            有三種可用的表選項:filter、nat和mangle。該選項不是必需的,若是未指定,則filter用做默認表。

            filter表用於通常的信息包過濾,包含INPUT、OUTPUT和FORWAR鏈。

            nat表用於要轉發的信息包,它包含PREROUTING、OUTPUT和POSTROUTING鏈。

            若是信息包及其頭內進行了任何更改,則使用mangle表。該表包含一些規則來標記用於高級路由的信息包以及PREROUTING和OUTPUT鏈。

. [-t table] 指定規則表;
    內建的規則表有三個,分別是:nat、mangle 和filter,
    當未指定規則表時,則一概視爲是filter。

    三個規則表的功能以下:
      nat:  此規則表擁有PREROUTING 和POSTROUTING 兩個規則鏈,
             主要功能爲進行一對1、一對多、多對多等網址轉換工做(SNAT、DNAT),
             這個規則表除了做網址轉換外,請不要作其它用途。

      mangle:此規則表擁有PREROUTING、FORWARD 和POSTROUTING 三個規則鏈。
              除了進行網址轉換工做會改寫封包外,在某些特殊應用可能也必須去改寫封包(TTL、TOS)
              或者是設定MARK(將封包做記號,以進行後續的過濾),這時就必須將這些工做定義在mangle 規則表中;
              因爲使用率不高,咱們不打算在這裏討論mangle 的用法。

      filter: 這個規則表是默認規則表,擁有INPUT、FORWARD 和OUTPUT 三個規則鏈,
               這個規則表顧名思義是用來進行封包過濾的處理動做(例如:DROP、LOG、ACCEPT 或REJECT),
               咱們會將基本規則都創建在此規則表中。

 

2) 命令(command)

command部分是iptables命令的最重要部分,它告訴iptables命令要作什麼,例如,插入規則、將規則添加到鏈的末尾或刪除規則。經常使用命令以下:

命令:  -A, --append
範例:  iptables -A INPUT ...
說明:  新增規則到某個規則鏈中,該規則將會成爲規則鏈中的最後一條規則。

命令:  -D, --delete
範例:  iptables -D INPUT --dport 80 -j DROP
       iptables -D INPUT 1
說明:  從某個規則鏈中刪除一條規則,能夠輸入完整規則,或直接指定規則編號加以刪除。

命令:  -R, --replace
範例:  iptables -R INPUT 1 -s 192.168.0.1 -j DROP
說明:  取代現行規則,規則被取代後並不會改變順序。

命令:  -I, --insert
範例:  iptables -I INPUT 1 --dport 80 -j ACCEPT
說明:  插入一條規則,本來該位置上的規則將會日後移動一個順位。

命令:  -L, --list
範例1: iptables -L INPUT
說明:  列出某規則鏈中的全部規則。
範例2: iptables -t nat -L
說明:  列出nat 表全部鏈中的全部規則。

命令:  -F, --flush
範例:  iptables -F INPUT
說明:  刪除filter 表中INPUT 鏈的全部規則。

命令:  -Z, --zero
範例:  iptables -Z INPUT
說明:  將封包計數器歸零。封包計數器是用來計算同一封包出現次數,是過濾阻斷式攻擊不可或缺的工具。

命令:  -N, --new-chain
範例:  iptables -N allowed
說明:  定義新的規則鏈。

命令:  -X, --delete-chain
範例:  iptables -X allowed
說明:  刪除某個規則鏈。

命令:  -P, --policy
範例:  iptables -P INPUT DROP
說明:  定義過濾政策。也就是未符合過濾條件之封包, 默認的處理方式。

命令:  -E, --rename-chain
範例:  iptables -E allowed disallowed
說明:  修改某自定義規則鏈的名稱。

 

3) 匹配(match)

            iptables命令的可選match部分指定信息包與規則匹配所應具備的特徵(如源和目的地地址、協議等)。匹配分爲兩大類:通用匹配和特定於協議的匹配。這裏,將研究可用於採用任何協議的信息包的通用匹配。下面是一些重要的且經常使用的通用匹配及其說明:

參數:  -p, --protocol
範例:  iptables -A INPUT -p tcp
說明:  匹配通信協議類型是否相符,可使用! 運算符進行反向匹配,例如:
           -p !tcp
       意思是指除tcp 之外的其它類型,如udp、icmp ...等。
       若是要匹配全部類型,則可使用all 關鍵詞,例如:
           -p all

參數:  -s, --src, --source
範例:  iptables -A INPUT -s 192.168.1.1
說明:  用來匹配封包的來源IP,能夠匹配單機或網絡,匹配網絡時請用數字來表示子網掩碼,
例如:
       -s 192.168.0.0/24
       匹配IP 時可使用! 運算符進行反向匹配,例如:
       -s! 192.168.0.0/24。

參數:  -d, --dst, --destination
範例:  iptables -A INPUT -d 192.168.1.1
說明:  用來匹配封包的目的地IP,設定方式同上。

參數:  -i, --in-interface
範例:  iptables -A INPUT -i eth0
說明:  用來匹配封包是從哪塊網卡進入,可使用通配字符+ 來作大範圍匹配,例如:
         -i eth+
      表示全部的ethernet 網卡
      也可使用! 運算符進行反向匹配,例如:
         -i !eth0

參數:  -o, --out-interface
範例:  iptables -A FORWARD -o eth0
說明:  用來匹配封包要從哪塊網卡送出,設定方式同上。

參數:  --sport, --source-port
範例:  iptables -A INPUT -p tcp --sport 22
說明:  用來匹配封包的源端口,能夠匹配單一端口,或是一個範圍,例如:
          --sport 22:80
       表示從22 到80 端口之間都算是符合條件,若是要匹配不連續的多個端口,則必須使用
          --multiport 參數,詳見後文。匹配端口號時,可使用! 運算符進行反向匹配。

參數:  --dport, --destination-port
範例:  iptables -A INPUT -p tcp --dport 22
說明:  用來匹配封包的目的地端口號,設定方式同上

參數:  --tcp-flags
範例:  iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
說明:  匹配TCP 封包的狀態標誌;
       參數分爲兩個部分,
         第一個部分列舉出想匹配的標誌,
         第二部分則列舉前述標誌中哪些有被設置,未被列舉的標誌必須是空的。
       TCP 狀態標誌包括:
          SYN(同步)、ACK(應答)、FIN(結束)、RST(重設)、URG(緊急) 、PSH(強迫推送) 
       等都可使用於參數中,
       除此以外還可使用關鍵詞ALL 和NONE 進行匹配。
       匹配標誌時,可使用! 運算符行反向匹配。

參數:  --syn
範例:  iptables -p tcp --syn
說明:  用來表示TCP 通訊協議中,SYN 位被打開,而ACK 與FIN 位關閉的分組,即TCP 的初始鏈接,
       與iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的做用徹底相同,
       若是使用!運算符,可用來匹配非要求鏈接封包。

參數:  -m multiport --source-port
範例:  iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
說明:  用來匹配不連續的多個源端口,一次最多能夠匹配15 個端口,
       可使用! 運算符進行反向匹配。

參數:  -m multiport --destination-port
範例:  iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
說明:  用來匹配不連續的多個目的地端口號,設定方式同上

參數:  -m multiport --port
範例:  iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
說明:  這個參數比較特殊,用來匹配源端口和目的端口號相同的封包,設定方式同上。
       注意:在本範例中,若是來源端口號爲80目的地端口號爲110,這種封包並不算符合條件。

參數:  --icmp-type
範例:  iptables -A INPUT -p icmp --icmp-type 8
說明:  用來匹配ICMP 的類型編號,可使用代碼或數字編號來進行匹配。
       請打iptables -p icmp--help 來查看有哪些代碼可用。

參數:  -m limit --limit
範例:  iptables -A INPUT -m limit --limit 3/hour
說明:  用來匹配某段時間內封包的平均流量,
       上面的例子是用來匹配:每小時平均流量是否超過一次3 個封包。
       除了每小時平均次外,也能夠每秒鐘、每分鐘或天天平均一次,默認值爲每小時平均一次,參數如後:
           /second、/minute、/day
       除了進行封包數量的匹配外,設定這個參數也會在條件達成時,暫停封包的匹配動做,
       以免因駭客使用洪水攻擊法,致使服務被阻斷。

參數:  --limit-burst
範例:  iptables -A INPUT -m limit --limit-burst 5
說明:  用來匹配瞬間大量封包的數量,
       上面的例子是用來匹配一次同時涌入的封包是否超過5個(這是默認值),超過此上限的封包將被直接丟棄。
       使用效果同上。

參數:  -m mac --mac-source
範例:  iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
說明:  用來匹配封包來源網絡接口的硬件地址,
       這個參數不能用在OUTPUT 和POSTROUTING 規則鏈上,
       這是由於封包要送到網卡後,才能由網卡驅動程序透過ARP 通信協議查出目的地的MAC 地址,
       因此iptables 在進行封包匹配時,並不知道封包會送到哪一個網絡接口去。

參數:  --mark
範例:  iptables -t mangle -A INPUT -m mark --mark 1
說明:  用來匹配封包是否被表示某個號碼,
       當封包被匹配成功時,咱們能夠透過MARK 處理動做,將該封包標示一個號碼,號碼最大不能夠超過4294967296。

參數:  -m owner --uid-owner
範例:  iptables -A OUTPUT -m owner --uid-owner 500
說明:  用來匹配來自本機的封包,是否爲某特定使用者所產生的,
       這樣能夠避免服務器使用root或其它身分將敏感數據傳送出,能夠下降系統被駭的損失。
       惋惜這個功能沒法匹配出來自其它主機的封包。

參數:  -m owner --gid-owner
範例:  iptables -A OUTPUT -m owner --gid-owner 0
說明:  用來匹配來自本機的封包,是否爲某特定使用者羣組所產生的,使用時機同上。

參數:  -m owner --pid-owner
範例:  iptables -A OUTPUT -m owner --pid-owner 78
說明:  用來匹配來自本機的封包,是否爲某特定進程所產生的,使用時機同上。

參數:  -m owner --sid-owner
範例:  iptables -A OUTPUT -m owner --sid-owner 100
說明:  用來匹配來自本機的封包,是否爲某特定鏈接(Session ID)的響應封包,使用時機同上。

參數:  -m state --state
範例:  iptables -A INPUT -m state --state RELATED,ESTABLISHED
說明:  用來匹配鏈接狀態, 
       鏈接狀態共有四種:
          INVALID、ESTABLISHED、NEW 和RELATED。
       INVALID     表示該封包的鏈接編號(Session ID)沒法辨識或編號不正確。
       ESTABLISHED 表示該封包屬於某個已經創建的鏈接。
       NEW         表示該封包想要起始一個鏈接(重設鏈接或將鏈接重導向)。
       RELATED     表示該封包是屬於某個已經創建的鏈接,所創建的新鏈接。
       例如:FTP-DATA 鏈接一定是源自某個FTP 鏈接。

 

4) 目標(target)

            前面已經講過,目標是由規則指定的操做,對與那些規則匹配的信息包執行這些操做。除了容許用戶定義的目標以外,還有許多可用的目標選項。下面是經常使用的一些目標及其示例和說明:

-j 參數用來指定要進行的處理動做,經常使用的處理動做包括:
   ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,

分別說明以下:
動做:  ACCEPT 
說明:  將封包放行,
       進行完此處理動做後,將再也不匹配其它規則,直接跳往下一個規則鏈(natostrouting)。

動做:  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),進行完此處理動做後,將會繼續匹配其它規則。
       這個功能能夠用來實現透明代理或用來保護web 服務器。
範例:  iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

動做:  MASQUERADE
說明:  改寫封包來源IP 爲防火牆NIC IP,能夠指定port 對應的範圍,
       進行完此處理動做後,直接跳往下一個規則鏈(manglepostrouting)。
       這個功能與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 對應的範圍,
       進行完此處理動做後,將直接跳往下一個規則(mangleostrouting)。
範例:  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

 

三、IP 規則的保存與恢復

1. 規則保存 
"iptables-save"命令 把規則保存到文件中
再由目錄"/etc/rc.d"下的腳本(/etc/rc.d/init.d/iptables)自動裝載.
使用命令iptables-save 來保存規則,

#  iptables-save > /etc/sysconfig/iptables

生成保存規則的文件爲: /etc/sysconfig/iptables;
也能夠用命令:

#  service iptables save

它能把規則自動保存在/etc/sysconfig/iptables 中。

2. 規則恢復
當計算機啓動時,rc.d 下的腳本將用命令iptables-restore 調用這個文件,從而就自動恢復了規則。

3. iptables服務操做
啓動:

# service iptables start
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

中止:

# service iptables stop
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]

重啓:

# service iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

4. 完全清空規則

# iptables -F
# iptables-save > /etc/sysconfig/iptables
相關文章
相關標籤/搜索