天天看點

iptsbles系列一

iptables系列之基礎原理

linux:網絡防火牆 
  netfilter:frame 架構 網絡過濾器 
   iptables:資料封包過濾,NAT,mangle等規則生成的工具。


網絡知識:
   IP封包首部
   tcp封包首部

 ip:tcp:http

IP封包首部:
  版本号4 頭部長度4 服務類型8 總長度16 
  段辨別符16    R1 DF1 MF1 片偏移13
  TTL8  協定8    首部校驗和
           源ip32
           目的ip32
          可選
          資料
分段和重組
DF:don't fragment 
MF:more fragment
片偏移:8的整數倍
協定:封裝的封包的協定
icmp:3層協定直接使用IP
       udp 17 tcp 69
       
端口号:0--65535 
 0---1023 系統
 >=5000使用者 


tcp:有狀态的協定,三次握手

TCP首部

      源端口16     目的端口16
             序列号32
             确認号32
頭部長度4 R6 URG1 ACK1 PSH1 RST1 SYN1 FIN1     視窗大小16 
校驗和16      緊急指針 
         選項    
        資料   
             
             
             
注意:資料的流向
序列号:發送方告訴接受方發送的資料的編号
确認号:接受方期望接受下一個序列的第一個序号。
流控:滑動視窗。
重傳;計時器
URG:緊急指針是否有效
ACK:說明确認号是否有效
PSH:推送,要優先處理的資料
RST:重置 
SYN:同步請求,建立連接配接 
FIN:斷開連接配接

轉換為能夠通過網絡發送的資料格式 
  文本
  二進制
  
TCP的三次握手 
TCP的四次斷開

被動打開:closed---->listen 
主動打開:closed---->syn_sent 

listen--->SYN_RCVD---->established 
closed---->syn_sent---->established
           

三次握手 四次斷開

TCP的有限狀态機

TCP的狀态轉移:
主動關閉方:
established--->fin-wait-1----->fin-wait-2---->time-wait---->closed 
被動關閉方:
established---->closed-wait---->last-ack------>closed 

2MSL:最長封包段壽命 

fin-wait-1---->closing--->time-wait--->closed 
           

防火牆

工作在主機或網絡的邊緣,對進出主機或網絡的資料報進行檢查與監控,并且根據事先定義的規則,比對其規則,采取定義的處理的動作進行操作的元件。

防火牆:硬體,軟體,規則(比對标準,處理辦法)
framework:架構  (不防家賊)

預設規則:
   開放:堵
   關閉:通 
伺服器:預設允許已知,拒絕未知    
規則:比對标準 
   IP:源ip,目标ip  
   TCP/UDP:sport,DPORT,URS,ACK,PSH,RST,SYN,FIN 
   ICMP:icmp-type 控制消息封包協定 封包類型 
   
資料封包過濾:
      
網絡功能:是核心空間實作的
           

核心中為使用者空間中指令預留一些空間

在核心中TCP/IP的子產品上開放一些位置,隻是開放給使用者空間可以編寫防火牆規則的指令。可以實作使用者中的指令可以直接操控核心空間的。

核心中的工作架構,使用者空間中的管理工具。

syscall:可以和核心直接打交道。

linux2.0 
   ipfw/firewall 
   
linux2.2 
    ipchain/netfilter,firewall 
 
linux2.4 
    iptables(使用者空間中可以寫規則的使用者空間中的應用,規則生成器)/netfilter(核心中可以放置的空間)   
           
核心中netfilter

       TCP/IP子產品
網卡(拆幀)--->IP---本機->程序--->
                 |----->轉發--->網卡
IP---->網卡--->使用者 
           

封包的流向類型:(取決于IP)

1.從外面進入主機内部到達程序

2.本機内部出去的封包

3.通過主機進行轉發的

檢查路由表 ,路由決策

路由決策發生在資料封包件被網卡接受後進入主機後,進入TCP/IP協定棧子產品時進行路由決策。

上述的三個位置是核心空間讓iptables在核心空間中放置規則的地方。

進,出,轉發

/proc/sys/net/ipv4/ip_forward 

-s 0.0.0.0 -d 172.16.100.7 reject 
           

hook function:鈎子函數

netfilter設計者放在TCP/IP上的鈎子函數。

自上而下,挨個檢查,比對前一個了,就不檢查下面的了。

規則定義技巧:
若兩條規則不相關,就将範圍大的規則放在上面,比對的可能性大。(http通路頻繁的放在上面。)
 若兩條規則相關,則将範圍小的規則放在上面,防止規則覆寫與疏漏。
           

hook function:5個

路由之前的位置

封包在即将轉發之前的位置 做位址轉換的

通俗的說,netfilter的架構就是在整個網絡流程的若幹位置放置了一些檢測點(HOOK),而在每個檢測點上登記了一些處理函數進行處理(如包過濾,NAT等,甚至可以是 使用者自定義的功能)。

IP層的五個HOOK點的位置
[1]:NF_IP_PRE_ROUTING:剛剛進入網絡層的資料包通過此點(剛剛進行完版本号,校驗
和等檢測), 目的位址轉換在此點進行;
[2]:NF_IP_LOCAL_IN:經路由查找後,送往本機的通過此檢查點,INPUT包過濾在此點進行;
[3]:NF_IP_FORWARD:要轉發的包通過此檢測點,FORWARD包過濾在此點進行;
[4]:NF_IP_POST_ROUTING:所有馬上便要通過網絡裝置出去的包通過此檢測點,内置的源位址轉換功能(包括位址僞裝)在此點進行;
[5]:NF_IP_LOCAL_OUT:本機程序發出的包通過此檢測點,OUTPUT包過濾在此點進行。
           

netfilter

是由Rusty Russell提出的Linux 2.4核心防火牆架構,該架構既簡潔又靈活,可實作安全政策應用中的許多功能,如資料包過濾、資料包處理、位址僞裝、透明代理、動态網絡位址轉換(Network Address Translation,NAT),以及基于使用者及媒體通路控制(Media Access Control,MAC)位址的過濾和基于狀态的過濾、包速率限制等。

架構

netfilter提供了一個抽象、通用化的架構[1],作為中間件,為每種網絡協定(IPv4、IPv6等)定義一套鈎子函數。Ipv4定義了5個鈎子函數,這些鈎子函數在資料報流過協定棧的5個關鍵點被調用,也就是說,IPv4協定棧上定義了5個“允許垂釣點”。在每一個“垂釣點”,都可以讓netfilter放置一個“魚鈎”,把經過的網絡包(Packet)釣上來,與相應的規則鍊進行比較,并根據審查的結果,決定包的下一步命運,即是被原封不動地放回IPv4協定棧,繼續向上層遞交;還是經過一些修改,再放回網絡;或者幹脆丢棄掉。

NAT

:network address transfer

sip:172.16.100.6 dip:100.2.2.1------>sip:12.1.1.6 dip:100.2.2.1 資料封包出去修改位址  源位址轉換 
傳回的響應的封包:
   sip:100.2.2.1 dip:12.1.1.6 ----->sip:100.2.2.1 dip:172.16.100.6  
   目标位址轉換
注意:主機内部維護着一張位址映射表。

源位址轉換是在封包即将離開網卡的時候修改源位址。
目标位址轉換是在封包剛剛進入網卡的時候修改目标位址。

SNAT:
DNAT:

NAT
靜态轉換
動态轉換 
端口多路複用(PAT)
ALG(Application Level Gateway),即應用程式級網關技術
           
prerouting
   input
   output
   forward
   postrouting
           
規則鍊:
PREROUTING
    INPUT 
    OUTPUT 
    FORWARD 
    POSTROUTING 
           
filter(過濾): 表
INPUT 
    OUTPUT 
    FORWARD
           
nat(位址轉換):表
PREROUTING
  OUTPUT   
  POSTROUTING 
           
mangle(修改封包首部,拆開,修改,封裝):表
PREROUTING 
      INPUT 
      OUTPUT 
      FORWARD
      POSTROUTING 
raw():
     PREROUTING 
     OUTPUT 
     
注意:不同功能的不能放在一起。
  iptables: 

           
資料包過濾順序:
raw:PREROUTING 
mangle:PREROTING
nat:PREROUTING -------|
                     \|/
       |--------  路由選擇--------------|
      \|/                              \|/                   
magle:INPUT                         mangle:FORWARD
filter:INPUT                        filter:FORWARD 
       \|/                                |
       路由選擇                           |
        \|/                               |
raw:  OUTPUT                              | 
mangle:OUTPUT                             |
nat:OUTPUT                                | 
filter:OUTPUT                             |
        |                                 | 
        |                                 | 
        |------->  mangle:POSTROUTING <---| 
                   nat: POSTROUTING
           
iptables:
四個表五個鍊
   表:raw,mangle,nat,filter 
   鍊:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING 

  itables:
   可以使用自定義鍊:
  一個鈎子函數hook function就是一個鍊。
自定義鍊隻有被預設鍊調用才可以使用。
           
自定義
自定義鍊是為了精簡鍊,調高鍊的效率。

可以使用自定義鍊,但是在被調用是才能發揮作用,而且如果沒有自定義鍊中任何規則比對,還應該有傳回機制:

  使用者可以删除自定義空鍊
  不可以删除預設鍊
  
每條規則都有兩個内置電腦
    被比對到的封包個數。
    被比對的封包大小之和。
           
規則:比對标準,處理動作
iptables [-t table] subcommand CHAIN [num] 比對标準 -j 處理辦法
比對标準:
  通用比對
  擴充比對(使用擴充子產品,依賴于子產品進行比對)
           隐含擴充:不用特别指明由哪個子產品進行的擴充,因為此時使用-p {tcp|udp|icmp}
           顯示擴充:必須指明由哪個子產品進行的擴充,在iptables中使用-m選項可完成此功能。
           
 比對标準: 
   通用比對:
     -s,--src :指定源位址
     -d,--dst :指定目标位址
     -p {tcp|udp|icmp}:指定協定
     -i interface:指定資料封包流入的接口
          可用于定義标準的鍊:PREROUTING,INPUT,FORWARD 
     -o interface:指定資料封包流出的接口
        可用于定義标準的鍊:OUTPUT,POSTROUTING,FORWARD 

-j 處理辦法  -j 跳轉 
-j TARGET 
   ACCEPT   :接受
   DROP    :默默丢棄
   REJECT   :拒絕并通知
   
        
iptables -t filter -A INPUT -s  172.160.0.0/16 -d 172.16.100.7 -j DROP
           

繼續閱讀