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 -nL
iptables -E testchain mychain
iptables -nLiptables -X mychain
iptables -nL
iptables -L
iptables -L |grep policy

規則管理:

  -A:append,追加;

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

  -D:delete,刪除;

    (1) 指明規則序號;

    (2) 指明規則本身;

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

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

  -Z:zero,計數器置零;

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

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

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

# iptables -nL INPUT
Chain 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 DROP
iptables -P OUTPUT DROP

其次,主機開放DNS服務

iptables -A INPUT -d 172.18.100.67 -s 0/0 -p tcp --dport 53 -j ACCEPT
iptables -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 ACCEPT
iptables -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 ACCEPT
iptables -A OUTPUT -s 172.18.100.67 -d 0/0 -p tcp --sport 22 -j ACCEPT

   篇幅關係,這裏僅僅介紹基礎的主機防火牆設置,下篇博文介紹主機防火牆高級擴展應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章