iptables 防火牆之主機防火牆

來源:互聯網
上載者:User

標籤:iptables 主機 防火牆

  Linux因為其強大的防火牆功能而聞名,它主要依靠於iptables,一個運行在使用者空間的應用軟體,它可以通過控制Linux核心netfilter模組,來管理網路資料包的流動與轉送。它解決了網路中很多攻擊,比如網路中常見的連接埠掃描、使用者密碼暴力破解等。

一、防火牆模型

  主機通訊基本模型:報文進入主機後進入接受緩衝區緩衝,核心從中取報文處理,拆開資料幀檢測是否是目標地址時本機地址,如果是則再拆TCP或UDP報文找到對應目的連接埠,發送給註冊在核心的使用者端進程;如果目標地址不是本機地址那麼就查看是否轉寄,能轉寄的情況下檢查路由,從那個連接埠發出去,再次封裝IP資料包,封裝資料幀,轉化為物理層訊號發到對應網卡;另外還有流出的資料包,從應用程式層程式封裝應用程式層報文到核心,核心通過路由轉寄到對應連接埠。

  netfilter模組中在數量包流經各個關鍵處添加鉤子(hook),對資料包進行控制。netfilter主要內建了五個hook:

    1.input 

    2.output 

    3.forward 

    4.prerouting

    5.postrouting

三種報文流向:

    流入本機:PREROUTING --> INPUT==>使用者空間進程

    由本機流出:使用者空間進程==>OUTPUT --> POSTROUTING

    轉寄:PREROUTING --> FORWARD --> POSTROUTING

iptables(netfilter):四張表、五鏈


功能:對應四張表(tables),其中主要功能基礎是filter完成的防火牆功能

  filter:過濾,防火牆功能;

  nat:network address translation;用於修改源IP或目標IP,也可以改源連接埠或目的連接埠;

  mangle:拆解報文,做出修改,並重新封裝起來;

  raw:關閉nat表上啟用的串連追蹤機制;


iptables 鏈:iptables中的稱呼

    鏈(內建):

   PREROUTING

   INPUT

   FORWARD

    OUTPUT

    POSTROUTING

    自訂鏈:手動添加關聯關係,用於內建鏈的擴充和補充,可實現更靈活的規則管理機制;

功能和鏈對應實現(表<-->鏈):

    raw:PREROUTING, OUTPUT

    mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    nat:PREROUTING,INPUT,]OUTPUT,POSTROUTING

    filter:INPUT,FORWARD,OUTPUT

    各個功能是有優先順序的,逐類生效,如OUTPUT可定義5個功能:按次序實現;功能中規則有次序,同一個鏈上的不同表規則的應用優先順序(由高到低)

路由功能發生的時刻:

報文進入本機後:

判斷目標主機是不是本機?

      是:INPUT    

      否:FORWARD

報文離開本機之前:

判斷經由哪個介面送往下一站?

    iptables服務就是:將iptables定義的指令碼開機執行。規則寫入後立即在核心生效。

二、iptables/netfilter 規則

規則:

  組成部分:匹配條件和處理動作---根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動作作出處理,不再匹配;

   匹配條件:match,多個條件預設邏輯為--與

     基本匹配條件

     擴充匹配條件:由於netfilter是模組化的

   處理動作:target,

     基本處理動作

     擴充處理動作

     自訂處理機制

鏈上的規則次序,即為檢查的次序;因此,隱含一定的應用法則:

    (1) 同類規則(訪問同一應用),匹配範圍小的放上面;

    (2) 不同類的規則(訪問不同應用),匹配到報文頻率較大的放在上面;

    (3) 將那些可由一條規則描述的多個規則合并起來;

    (4) 設定預設策略;

        相互包含的以最先匹配為準

添加規則時的考量點:

    (1) 要實現哪種功能:判斷添加到哪個表上;

    (2) 報文流經的路徑:判斷添加到哪個鏈上;


三、iptables命令: 

iptables — administration tool for IPv4 packet filtering and NAT

  iptables [-t table] {-A|-C|-D} chain rule-specification

  iptables [-t table] -I chain [rulenum] rule-specification

  iptables [-t table] -R chain rulenum rule-specification

  iptables [-t table] -D chain rulenum

  iptables [-t table] -S [chain [rulenum]]

  iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

  iptables [-t table] -N chain

  iptables [-t table] -X  [chain]

  iptables [-t table] -P chain target

  iptables [-t table] -E old-chain-name new-chain-name

選項:

  rule-specification = [matches...]  [target]

  match = -m matchname [per-match-options]

  target = -j targetname [per-target-options


主要格式:iptables   [-t table]   COMMAND   chain   [-m matchname [per-match-options]]   -j targetname [per-target-options]

-t table:

    raw, mangle, nat, [filter]

COMMAND:

鏈管理:

  -N:new, 定義一條自訂鏈;

  -X: delete,刪除自訂的空鏈;

  -P:Policy,設定預設策略;對filter表中的鏈而言,其預設策略有:

    ACCEPT:接受

    DROP:丟棄 不會返回結果

    REJECT:拒絕 會返回結果

  -E:重新命名自訂,未被引用的鏈;引用計數不為0的自訂鏈不能夠被重新命名,也不能被刪除;

iptables -N testchain iptables -nLiptables -E testchain mychainiptables -nLiptables -X mychainiptables -nLiptables -Liptables -L |grep policy

規則管理:

  -A:append,追加;

  -I:insert, 插入,要指明位置,省略時表示第一條;

  -D:delete,刪除;

    (1) 指明規則序號;

    (2) 指明規則本身;

  -R:replace,替換指定鏈上的指定規則;

  -F:flush,清空指定的規則鏈;

  -Z:zero,計數器置零;

iptables的每條規則都有兩個計數器:

    (1) 匹配到的報文的packages;

    (2) 匹配到的所有報文的Bytes;

# iptables -nL INPUTChain INPUT (policy ACCEPT)target     prot opt source               destination

  -S:selected,以iptables-save 命令的格式顯示鏈上的規則;

    所有命令的命令格式,可以用來儲存規則儲存到某個檔案,以備恢複.

查看:


  -L:list, 列出指定鏈上的所有規則;

  -n:numberic,以數字格式顯示地址和連接埠號碼;

  -v:verbose,詳細資料;

  -vv, -vvv

  -x:exactly,顯示計數器結果的精確值; 

  --line-numbers:顯示規則的序號;

   組合: -nvL ,組合情況下只能將L放在最右側,-nL -nvL

chain:

  PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

匹配條件:

基本匹配條件

  無需載入任何模組,由iptables/netfilter自行提供;

    [!] -s, --source  address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;

    [!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;

    [!] -p, --protocol protocol,限制協議

protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or  "all"

{tcp|udp|icmp}

    [!] -i, --in-interface name:資料報文流入的介面;只能應用於資料報文流入的環節,只能應用於PREROUTING,INPUT和FORWARD鏈;

    [!] -o, --out-interface name:資料報文流出的介面;只能應用於資料報文流出的環節,只能應用於FORWARD、OUTPUT和POSTROUTING鏈。


擴充匹配條件

  需要載入擴充模組,方可生效;經由擴充模組引入的匹配機制,-m matchname

隱式擴充

   可以不用-m選項載入專門載入擴充模組;因為它們是對協議的擴充,所以,但凡使用-p指明了協議,就表示已經指明了要擴充的模組;

    [!] -p, --protocol protocol

        協議:tcp, udp, udplite, icmp, esp, ah, sctp or all 

    tcp:隱含指明了 “-m tcp”,有專門選項:

    [!] --source-port, --sport port[:port]:匹配tcp報文的源連接埠;可以是連接埠範圍(起始,結尾);

    [!] --destination-port,--dport port[:port]:匹配報文的目標連接埠;可以是連接埠範圍;

    [!] --tcp-flags  mask  comp:檢查報文中mask標誌的TCP標誌位,而要這些標誌位中comp中必須為1

mask is the flags which we should examine,  written as a comma-separated list,

例如:“--tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要檢查的標誌位為SYN,ACK,FIN,RST四個,其中SYN必須為1,餘下的必須為0;

    “--tcp-flags  SYN,ACK,FIN,RST  ACK,FIN”表示,要檢查的標誌位為SYN,ACK,FIN,RST四個,其中ACK,FIN必須為1,餘下的必須為0;

        “--tcp-flags  SYN,ACK,FIN,RST ALL NONE” 表示,要檢查的標誌位為SYN,ACK,FIN,RST四個,必須全部為0;

    “--tcp-flags  SYN,ACK,FIN,RSTSYN,ACK,FIN,RST ALL” 表示,要檢查的標誌位為SYN,ACK,FIN,RST四個,必須全部為1;

  [!] --syn:用於匹配第一次握手,相當於“--tcp-flags  SYN,ACK,FIN,RST  SYN”;

    udp 隱含指明了 “-m tcp”,有專門選項:

  [!] --source-port, --sport port[:port]:匹配報文的源連接埠;可以是連接埠範圍;

  [!] --destination-port,--dport port[:port]:匹配報文的目標連接埠;可以是連接埠範圍;

    icmp 

  [!] --icmp-type {type[/code]|typename} :使用時可以只指定type就可以了。type0,8也僅僅只有一個code

  echo-request:8/0 ping請求

  echo-reply:0/0 對方應答


說明:DNS伺服器,為用戶端提供服務:開放自己53號連接埠;為用戶端遞迴,開放對端連接埠53;    

     ping別人是icmp8出去,0回來

     別人ping自己是icmp8進來,0出去


顯式擴充

    必須要手動載入擴充模組, [-m matchname [per-match-options]]; 

處理動作:


  -j targetname [per-target-options]

    ACCEPT

    DROP

    REJECT

    RETURN:返回調用鏈;

     REDIRECT:連接埠重新導向;

    LOG:記錄日誌;

    MARK:做防火牆標記;

    DNAT:目標地址轉換;

    SNAT:源地址轉換;

    MASQUERADE:地址偽裝;

    ...

    自訂鏈:

四、防火牆服務

CentOS 6:

  service  iptables  {start|stop|restart|status}

  start:讀取事先儲存的規則,並應用到netfilter上;

  stop:清空netfilter上的規則,以及還原預設策略等;

  status:顯示生效的規則;

  restart:清空netfilter上的規則,再讀取事先儲存的規則,並應用到netfilter上;

  預設的規則檔案:/etc/sysconfig/iptables

CentOS 7:

  systemctl  start|stop|restart|status  firewalld.service

  systemctl  disable  firewalld.service

  systemctl  stop  firewalld.service

五、簡單一實例

  開放DNS服務的防火牆,要求能夠正常提供DNS服務,但其他任何連接埠都不開放。

首先,修改預設策略,將INUT、OUTPUT預設策略修改為DROP,丟棄所有報文;

iptables -P INPUT DROPiptables -P OUTPUT DROP

其次,主機開放DNS服務

iptables -A INPUT -d 172.18.100.67 -s 0/0 -p tcp --dport 53 -j ACCEPTiptables -A OUTPUT -s 172.18.100.67 -d 0/0 -p tcp --sport 53 -j ACCEPT

再次,考慮到DNS伺服器可能為主機遞迴查詢DNS,所以也要開放DNS伺服器作為DNS用戶端訪問根DNS伺服器的連接埠;

iptables -A INPUT -s 0/0 -d 172.18.100.67 -p tcp --sport 53 -j ACCEPTiptables -A OUTPUT -s 172.18.100.67 -p tcp --dport 53 -j ACCEPT

預設可能還需要開啟sshd服務,可以添加

iptables -A INPUT -d 172.18.100.67 -s 0/0 -p tcp --dport 22 -j ACCEPTiptables -A OUTPUT -s 172.18.100.67 -d 0/0 -p tcp --sport 22 -j ACCEPT

   篇幅關係,這裡僅僅介紹基礎的主機防火牆設定,下篇博文介紹主機防火牆進階擴充應用。

本文出自 “深海魚” 部落格,請務必保留此出處http://kingslanding.blog.51cto.com/9130940/1769431

iptables 防火牆之主機防火牆

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.