1. 程式人生 > >Linux進階——iptables

Linux進階——iptables

  netfilter/iptables(簡稱為iptables)組成Linux平臺下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網路地址轉換(NAT)等功能。

iptabels基礎

Netfilter元件

  • Ø核心空間,整合在linux核心中
  • Ø擴充套件各種網路服務的結構化底層框架
  • Ø核心中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、 FORWARD、PREROUTING、POSTROUTING而這五個hook function 向用戶開放,使用者可以通過一個命令工具(iptables)向其寫入規則
  • Ø由資訊過濾表(table)組成,包含控制IP包處理的規則集(rules),規則 被分組放在鏈(chain)上

三種報文流向

  • Ø流入本機:PREROUTING --> INPUT-->使用者空間程序
  • Ø流出本機:使用者空間程序 -->OUTPUT--> POSTROUTING
  • Ø轉發:PREROUTING --> FORWARD --> POSTROUTING

四表五鏈

  filter表:過濾規則表,根據預定義的規則過濾符合條件的資料包

  nat表:network address translation 地址轉換規則表

  mangle:修改資料標記位規則表

  raw:關閉NAT表上啟用的連線跟蹤機制,加快封包穿越防火牆速度

規則鏈:

  1.INPUT——進來的資料包應用此規則鏈中的策略

  2.OUTPUT——外出的資料包應用此規則鏈中的策略

  3.FORWARD——轉發資料包時應用此規則鏈中的策略

  4.PREROUTING——對資料包作路由選擇前應用此鏈中的規則

    (記住!所有的資料包進來的時侯都先由這個鏈處理)

  5.POSTROUTING——對資料包作路由選擇後應用此鏈中的規則

    (所有的資料包出來的時侯都先由這個鏈處理)

 

連結串列關係圖

 

 

 

報文流入過濾匹配過程

 

 


核心中資料包的傳輸過程

  • Ø 當一個數據包進入網絡卡時,資料包首先進入PREROUTING鏈,核心根據資料包目的 IP判斷是否需要轉送出去
  • Ø 如果資料包就是進入本機的,資料包就會沿著圖向下移動,到達INPUT鏈。資料包 到達INPUT鏈後,任何程序都會收到它。本機上執行的程式可以傳送資料包,這些 資料包經過OUTPUT鏈,然後到達POSTROUTING鏈輸出
  • Ø 如果資料包是要轉發出去的,且核心允許轉發,資料包就會向右移動,經過 FORWARD鏈,然後到達POSTROUTING鏈輸出

規則表之間的優先順序:

  Raw——mangle——nat——filter

Iptables語法

規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動 作作出處理

  • Ø 匹配條件:預設為與條件,同時滿足

      基本匹配:IP,埠,TCP的Flags(SYN,ACK等)

      擴充套件匹配:通過複雜高階功能匹配

  • Ø處理動作:稱為target,跳轉目標

      內建處理動作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...

      自定義處理動作:自定義chain,利用分類管理複雜情形

          規則要新增在鏈上,才生效;新增在自定義上不會自動生效  

    鏈chain:

      內建鏈:每個內建鏈對應於一個鉤子函式

      自定義鏈:用於對內建鏈進行擴充套件或補充,可實現更靈活的規則組織管理機制;

        只有 Hook鉤子呼叫自定義鏈時,才生效

iptables命令的管理控制選項

iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]-+ 

-t 不寫預設為預設為filter;其它可用的有raw, mangle, nat;

iptables命令選項

-A 在指定鏈的末尾新增(append)一條新的規則
-D 刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除
-I 在指定鏈中插入(insert)一條新的規則,預設在第一行新增
-R 修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換
-L 列出(list)指定鏈中所有的規則進行檢視
  
-n:numeric,以數值格式顯示;
  -v:verbose,顯示詳細格式資訊;
  -vv, -vvv
  -x:exactly,計數器的精確結果;
  --line-numbers:顯示鏈中的規則編號;
-E 重新命名使用者定義的鏈,不改變鏈本身
-F 清空(flush)
-N 新建(new-chain)一條使用者自己定義的規則鏈
-X 刪除指定表中使用者自定義的規則鏈(delete-chain)
-P 設定指定鏈的預設策略(policy)
-Z 將所有表的所有鏈的位元組和資料包計數器清零
-n 使用數字形式(numeric)顯示輸出結果
-v 檢視規則表詳細資訊(verbose)的資訊
-V 檢視版本(version)
-h 獲取幫助(help)
-P策略,定義預設策略

防火牆處理資料包的四種方式

ACCEPT 允許資料包通過
DROP 直接丟棄資料包,不給任何迴應資訊
REJECT 拒絕資料包通過,必要時會給資料傳送端一個響應的資訊。
LOG在/var/log/messages檔案中記錄日誌資訊,然後將資料包傳遞給下一條規則

iptables防火牆規則的儲存與恢復

iptables-save把規則儲存到檔案中,再由目錄rc.d下的指令碼(/etc/rc.d/init.d/iptables)自動裝載

使用命令iptables-save來儲存規則。一般用

iptables-save > /etc/sysconfig/iptables

生成儲存規則的檔案 /etc/sysconfig/iptables,

也可以用

service iptables save

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

當計算機啟動時,rc.d下的指令碼將用命令iptables-restore呼叫這個檔案,從而就自動恢復了規則。

匹配條件:

多重條件:邏輯關係為“與”;

基本匹配條件:!表示可取反,基本條件若不寫則預設為最大值
  [!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;

  [!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;
  [!] -p, --protocol protocol:
    protocol:{tcp|udp|icmp}
  [!] -i, --in-interface name:資料報文的流入介面;INPUT, FORWARD and PREROUTING
  [!] -o, --out-interface name:資料報文的流出介面; FORWARD, OUTPUT and POSTROUTING

 


擴充套件匹配條件
  隱式擴充套件:不用-m選項指出matchname即可使用此match的專用選項進行匹配;
    -p tcp:隱含了-m tcp;
    [!] --source-port,--sport port[:port]:匹配報文中傳輸層的源埠;
    [!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標埠;
    [!] --tcp-flags mask comp
      mask:要檢查的標誌位列表,以逗號分隔;
      comp:必須為1的標誌位列表,餘下的出現在mask列表中的標誌位則必須為0;
    --tcp-flags SYN,ACK,FIN,RST SYN
    [!] --syn:
      相當於--tcp-flags SYN,ACK,FIN,RST SYN
    -p udp:隱含了-m udp:
    [!] --source-port,--sport port[:port]:匹配報文中傳輸層的源埠;
    [!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標埠;
    -p icmp:隱含了-m icmp:
      [!] --icmp-type {type[/code]|typename}
      8:echo-request
      0:echo-reply

顯式擴充套件:必須使用-m選項指出matchname,有的match可能存在專用的選項;

常用的iptables規則

在iptables規則中沒有匹配到規則則使用預設規則進行處理

  iptables -P INPUT DROP
  iptables -P OUTPUT ACCEPT
  iptables -P FORWARD DROP

配置SSH規則

  iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

  如果你把OUTPUT 設定成DROP,就需要加上這個規則,否則SSH還是不能登入,因為SSH服務職能進不能出。

只允許192.168.0.3的機器進行SSH連線

  iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT

如果要允許,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.

允許loopback迴環通訊

  IPTABLES -A INPUT -i lo -p all -j ACCEPT
  IPTABLES -A OUTPUT -o lo -p all -j ACCEPT

目的地址轉換,對映內部地址

  iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.2:80
  iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.1-192.168.0.10

源地址轉換,隱藏內部地址

  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10

地址偽裝,動態ip的NAT

  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

masquerade和snat的主要區別在於,snat是把源地址轉換為固定的IP地址或者是地址池,而masquerade在adsl等方式撥號上網時候非常有用,因為是撥號上網所以網絡卡的外網IP經常變化,這樣在進行地址轉換的時候就要在每次都要修改轉換策略裡面的ip,使用masquerade就很好的解決了這個問題,他會自己去探測外網絡卡獲得的ip地址然後自動進行地址轉換,這樣就算外網獲得的ip經常變化也不用人工干預了。

開啟轉發功能

  iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 只允許已建連線及相關連結對內轉發
  iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 允許對外轉發

過濾某個MAC

  iptables -A FORWARD -m mac --mac -source MAC地址 -j DROP

報文經過路由後,資料包中原有的MAC資訊會被替換,所以在路由後的iptables中使用mac匹配沒有意義。

資料包整流

  iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
  iptables -A FORWARD -d 192.168.0.1 -j DROP

多埠匹配

  iptables -A INPUT -p tcp -m muliport --dport s 21,22,25,80,110 -j ACCEPT

丟棄非法連線

  iptables -A INPUT -m state --state INVALID -j DROP
  iptables -A OUTPUT -m state --state INVALID -j DROP
  iptables-A FORWARD -m state --state INVALID -j DROP

儲存於恢復iptables規則

  iptables-save > somefile
  iptables-restore < somefile