Linux防火牆之netfilter/ptables

我愛的人玲發表於2019-05-12

時間:2018.2.5
作者:李強
參考:man,info,magedu講義,萬能的internet
實驗環境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4
宣告:以下英文純屬個人翻譯,英文B級,歡迎糾正,以下內容純屬個人理解,並沒有對錯,只是參考,盜版不糾,才能有限,希望不誤人子弟為好。
版本:v1-2018.2.5

為核心級功能,由Netfilter元件提供,需要安裝iptables軟體包去通過命令去配置此功能。

1、參考資料

官方站點:[http://www.netfilter.org]

2、工作原理

  • 首先我們要曉得,報文的三個流向

    1、流入本機:PRETOUTING—-INPUT—-使用者程式空間

    2、流出本機:使用者程式空間—-OUTPUT—-POSTROUTING

    3、轉發:PREROUTING—-FORWARD—-POSTROUTING

  • 核心中資料包的傳輸過程

    1、當一個資料包進入網路卡時,會進入PRETOURING鏈中,核心通過資料包的目的ip地址結合路由表判斷資料是否需要轉送出去

    2、如果資料包是進入本機的,就會進入INPUT鏈,然後響應的程式處理這些資料包,生成新的資料包,傳送到OUTPUT鏈中,然後通過POSTROUTING鏈傳送出去

    3、如果資料包是要轉發的,並且核心允許轉發,資料包就會進過FORWARD鏈,然後從POSTROUTING鏈轉發出去。

五個位置:input,output,forward,prerouting,postroutig

netfilter對外提供五個hook function 對應上面五個位置,iptables通過在5個位置進行規則的設定來控制網路報文的轉發

netfilter前端管理工具
    cui:iptables,firewall-cmd
    gui:firewall-config

ip資料包處理的規則集rules,分組在chain上,然後存放於過濾表table中,chain預設有5類,table預設有4種。

使用者也可以將類似的規則rule分組成自定義的chain中,然後存放於table中。

總之防火牆的功能,就是資料包文來了,kernel發現開啟了防火牆的功能,然後根據防火牆設定的匹配條件,對資料包進行相應的處理。

以上解釋過於無聊,所以換種說法,就是一個土財主皇帝有錢,但是呢又怕死,所以請了王牌保鏢保護他,他找來侍衛長也就是說netfilter,告訴他我的安全靠你了,結果netfilter不管事,就找了個iptables的外包公司,iptables公司就勘查現場,派了駐守5個位置的若干保鏢chain過去,分別實現不同的功能(raw沒有找到好的比喻,發入場券的mangle,搜身的filter,引路的nat)分別駐守大門,負責對進出人員車輛進行檢查,駐守院子,對過往人員進行處理,駐守臥室的門,對進出與僱主交流的人進行檢查。好人員已到位,部署已到位具體怎麼檢查就是iptables公司的一套了,告知netfilter大總管,netfilter說管,然後去告訴5個保鏢怎麼檢查,至於要怎麼檢查,肯定就是root大老闆來說了,root找netfilter,netfilter說我也不懂,你要不告訴iptables,然後root告訴iptables需要實現什麼需求,然後iptables就把規則寫出來告訴netfilter,你去這麼搞,netfilter說好的。然後5個位置的若干保鏢就開始幹活,當然位置如果不夠再加就是自定義的chain了,當時root不知道的事,權利都給了iptables和netfilter,如果iptables和netfilter串通瞎搞就會把自己給搞死了,所以說秦檜,嚴嵩,魏忠賢之流是不得不防的。瞎扯到這裡。

  • 防火牆的定義與分類

    1、什麼是防火牆?

    工作與主機或者網路邊緣,對進出的報文通過實現定義的規則進行檢查,並且有匹配的規則的工作進行處理的一組硬體或者軟體,甚至是二者結合

    2、防火牆的分類

    主機防火牆、網路防火牆;
    硬體防火牆、軟體防火牆;
    網路層防火牆、應用層防火牆

    3、安全防護裝置

    硬體的應用層防火牆中可以整合AV和IPS元件。
    
    honeypot 蜜罐
    
    漏掃裝置
    
    堡壘機

3、iptables命令列管理工具

iptables工作原理

命令列工具,工作在使用者空間,編寫規則,然後將寫好的的規則發給netfilter,告訴核心如何處理資料包文

iptables有四個表,五個鏈和一些規則組成

四個表 table

    filter:資料過濾規則表
    nat:網路地址轉換規則表
    mangle:修改資料標記位規則表
    raw:關閉nat表上啟用的連線跟蹤機制,加快封包穿越防火牆的速度

    優先順序高低順序為raw-->mangle-->nat-->filter

五個內建鏈chain

    INPUT
    OUTPUT
    FORWORD
    PREROUTING
    POSTROUTING

    每種表裡有哪些一系列的規則,可以通過iptable -t table -vnL  來檢視,不同table中的chain name一樣但是內容不一樣。是相互獨立的。

    每種表都表示iptables的一種功能特性

        1、filter表對應處理的位置是input,output和forward,所以filter表中只有3中內建的INPUT,OUTPUT和FORWARD系列的規則集。

        2、nat表對應處理的位置是prerouting和postrouting和input和output,
        所以nat table中只有4種內建的RREROUTING和POSTROUTING和INPUT和OUTPUT系列的規則集。RREROUTING主要用來做DNAT,POSTROUTING做SNAT

        3、mangle表對應處理的位置可以是5個位置的任意位置上。

        4、raw

規則(rule-specification)

        匹配條件(matches)
            基本匹配:IP,埠,TCP的Flags(SYN,ACK,FIN,RST,USG,PSH)
            擴充套件匹配:時間,狀態等,需要額外的動態庫支援,所以使用擴充套件匹配要確保相對應的so檔案存在。
        處理動作(target)
            內建動作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUREADE,MARK,LOG
            自定義動作:自定義鏈chain

應用位置
            內建chain:input,output,forward,prerouting,postrouting
            自定義chain:

網路裝置中設定過濾的步驟

        1、先定義域,預設域有local,management,input,output,dmz
        2、將介面加入到域中
        3、定義域到域的資料流方向
        4、定義規則
        5、應用規則到域到域的方向,行程域間策略和域內策略

iptables新增的要點

        1、要實現哪些功能,判斷-t 在哪個table上
        2、報文流經的路徑,判斷對哪個chain操作
        3、報文的流向,判斷源和目的
        4、匹配規則,業務需要

chain中規則的次序

        1、按照從上到下次序匹配,一旦匹配到不再向下匹配,因此匹配範圍小的往上放
        2、匹配度最多的往上放,能合併的規則儘量放到一條規則裡去
        3、所有都匹配不到後會去預設匹配規則

iptables命令使用方法

  • 格式
    iptables  -t table  command chain  rule-specificiton

    rule-specifiction= match  target 

    match = [-m] 

    target= -j targetname per-targetname-options

    table:主要有filter,nat,mangle,raw,security等
    chain:內建有INPUT,OUTPUT,FORWORD,PREROUTING,POSTROUTING
    targetname:
        ACCEPT
        DROP
        REJECT:--reject-with:icmp-port-unreachable預設
        RETURN:返回撥用鏈
        REDIRECT:埠重定向
        LOG:記錄日誌,dmesg
        MARK:做防火牆標記
        DNAT:目標地址轉換
        SNAT:源地址轉換
        MASQUERADE:地址偽裝
  • 選項
    針對chain的選項有:

    -A, --append chain rule-specification               //在後面追加新的規則
    -I,--insert chain [rulenum] rule-specification      //插入新的規則,預設插入到第一行,可以rulenum指定插入的次序,此處規則往後移
    -C, --check chain rule-specification                //檢查規則是否已經存在,存在不提示,不存在報錯誤資訊
    -D, --delete chain rule-specification               //刪除1個或多個規則,2種格式,第一種指定規則刪除,第二種指定序號刪除
    -D, --delete chain rulenum
    -F, --flush [chain]                                 //清除選擇鏈的所有規則,如果沒有選擇chain預設當前table的所有chain,
    -R, --replace chain rulenum rule-specification      //替換指定序號的規則
    -Z, --zero [chain [rulenum]]                        //清除所有指定chain或者chain的rulenum的位元組和包的統計數量,如果沒有指定,則所有chain都歸零
    -S, --list-rules [chain]                            //
    -L, --list [chain]                                  //列出指定chain的規則,沒有執行擇表示tables的所有chain,通常配合-vnL使用,n一定是在L前的。
        -v, --verbose                                   //詳細資訊,-vv,或者-vvv更詳細
        -n, --numeric                                   //數字格式輸出,預設情況下會去將ip地址或者埠等解析成相映的hostname,protocols,service等
        -x, --exact                                     //顯示精確的統計值
        --line-numbers                                  //顯示規則時為每個chain中的rule編號
    -N, --new-chain chain                               //建立一個使用者自定義的chain
    -X, --delete-chain [chain]                          //刪除使用者自定義的空chain,如果沒有指定,則刪除所有自定義的空chain,如果非空,先用-F清空規則,然後再使用-X
    -E, --rename-chain old-chain new-chain              //修改使用者自定義的chain名稱
    -P, --policy chain target                           //設定預設的target對於指定的chain,預設為ACCEPT

    --modprobe=command                                  

    針對匹配條件的有:

    基本匹配條件:
    [!] -p, --protocol protocol

        -p tcp 

            --dport  port[:port]    :匹配一個或多個連續的目的埠

            --sport  port[:port]    :匹配一個或多個連續的源埠

            --tcp-flags mask comp   :(Flags: SYN ACK FIN RST URG PSH ALL NONE)
                mask:表示去匹配哪些標誌位Flags,多個用逗號隔開
                comp:表示哪些標誌位Flags為1,多個用逗號隔開

            --syn: 等價於--tcp-flags SYN,RST,ACK,FIN SYN

        -p udp

            --dport port[:port]

            --sport port[:port]

        -p icmp

            --icmp-type type[/code]|typename 

        iptables -p icmp -h  //可以獲取icmp的幫助
        iptables -p tcp  -h  //可以獲取tcp的幫助
        iptables -p udp  -h  //可以獲取udp的幫助

    [!] -s, --source address[/mask][,...]       //指定檢查源ip地址

    [!] -d, --destination address[/mask][,...]  //指定檢查目的ip地址

    [!] -i, --in-interface name                 //指定檢查入介面地址

    [!] -o, --out-interface name                //指定檢查出介面地址

    擴充套件匹配條件:
     -m, --match match
     Centos6下man iptables
     Centos7下man iptables-extensions
    常用有
     -m multiport   //指定多個不連續地址,最多15個,port:port地址範圍算2個

         [!] --source-ports,--sports port[,port|,port:port]...

         [!] --destination-ports,--dports port[,port|,port:port]...

         [!] --ports port[,port|,port:port]...

     -m iprange                 //指定地址範圍

         [!] --src-range from[-to]

         [!] --dst-range from[-to]

     -m mac
     -m string  //對報文中的應用層資料做字串模式匹配檢測,核心版本需要大於等於2.6.14.

         --algo {bm|kmp}        //指定字串匹配檢測演算法

         --from offset          //開始偏移,預設為0

          --to offset           //結束偏移,不指定檢查整個資料包

          [!] --string pattern  //檢查匹配給的字串模式

          [!] --hex-string pattern

       Examples:

              # The string pattern can be used for simple text characters.
              iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string `GET /index.html` -j LOG

              # The hex string pattern can be used for non-printable characters, like |0D 0A| or |0D0A|.
              iptables -p udp --dport 53 -m string --algo bm --from 40 --to 57 --hex-string `|03|www|09|netfilter|03|org|00|`

     -m time    //根據將報文到達的時間與指定的時間範圍進行匹配.所有時間預設為UTC格式,注意時間轉換。

             --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 
             --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

             如果--datestart和--datestop沒有指定,預設從1979-01-01到2038-01-19,所以指定的日期有效範圍也是如此

             --timestart hh:mm[:ss] 
             --timestop hh:mm[:ss]

             時間範圍為 00:00:00 到 23:59:59

             [!] --monthdays day[,day...]   //每個月的幾號,值範圍為1-31,2月可能為28或者29天

             [!] --weekdays day[,day...]    //星期幾,值範圍為1-7,或者用英文首字母2位或者3位

             --kerneltz:核心時區,不建議使用,CentOS7系統預設為UTC

             注意: centos6 不支援kerneltz ,--localtz指定本地時區(預設)

             示例:
             iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop18:30 --weekdays Sat,Sun --kerneltz -j DROP

     -m connlimit   //根據每客戶端IP做併發連線數數量匹配,可防止CC(Challenge Collapsar挑戰黑洞)***

         --connlimit-upto n:連線的數量小於等於n時匹配

         --connlimit-above n:連線的數量大於n時匹配

         通常分別與預設的拒絕或允許策略配合使用
         示例:
         iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

     -m limit   //基於收發報文的速率做匹配

        令牌桶過濾器 
        --limit rate[/second|/minute|/hour|/day]
        --limit-burst number
        示例:
        iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT

     -m state   //根據”連線追蹤機制“去檢查連線的狀態,較耗資源

         conntrack機制:追蹤本機上的請求和響應之間的關係
         狀態有如下幾種:
        NEW:新發出請求;連線追蹤資訊庫中不存在此連線的相關資訊條目,因此,將其識別為第一次發出的請求
        ESTABLISHED:NEW狀態之後,連線追蹤資訊庫中為其建立的條目失效之前期間內所進行的通訊狀態
        RELATED:新發起的但與已有連線相關聯的連線,如:ftp協議中的資料連線與命令連線之間的關係
        INVALID:無效的連線,如flag標記不正確
        UNTRACKED:未進行追蹤的連線,如raw表中關閉追蹤
        iptables命令
         [!] --state state
         示例:
        iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
         已經追蹤到的並記錄下來的連線資訊庫
        /proc/net/nf_conntrack 
         調整連線追蹤功能所能夠容納的最大連線數量
        /proc/sys/net/nf_conntrack_max
         不同的協議的連線追蹤時長
        /proc/sys/net/netfilter/
         注意:CentOS7 需要載入模組: modprobe nf_conntrack

        iptables命令
         iptables的連結跟蹤表最大容量為/proc/sys/net/nf_conntrack_max,各
        種狀態的超時連結會從表中刪除;當模板滿載時,後續連線可能會超時
         解決方法兩個:
        (1) 加大nf_conntrack_max 值
        vi /etc/sysctl.conf
        net.nf_conntrack_max = 393216
        net.netfilter.nf_conntrack_max = 393216
        (2) 降低 nf_conntrack timeout時間
        vi /etc/sysctl.conf
        net.netfilter.nf_conntrack_tcp_timeout_established = 300
        net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
        net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
        net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
        iptables -t nat -L -n

        iptables命令
         開放被動模式的ftp服務
         (1) 裝載ftp連線追蹤的專用模組:
        跟蹤模組路徑:/lib/modules/kernelversion/kernel/net/netfilter
        vim /etc/sysconfig/iptables-config 配置檔案
        IPTABLES_MODULES=" nf_conntrack_ftp "
        modproble nf_conntrack_ftp
         (2) 放行請求報文:
        命令連線:NEW, ESTABLISHED
        資料連線:RELATED, ESTABLISHED
        iptables –I INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
        iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
         (3) 放行響應報文:
        iptables -I  OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT 

     -j, --jump target

iptables 規則的備份與恢復

因為iptables為命令列工具,通常命令列工具只在記憶體中生效,並不將配置寫入磁碟。
因此要想要配置下次啟動依然生效,因此需要將配置寫入檔案,當然這裡不用手動去修改檔案。
  • Centos6下
    iptables -S

    1、service iptables save  //將規則覆蓋儲存至/etc/sysconfig/iptables檔案中

    2、iptables-save  > /path/to/backfile   

    //備份當前iptables規則到指定檔案中,預設是stdout

    3、iptables-restore  < /path/to/backfile 

    //恢復備份的iptables規則到當前中,-n ,不覆蓋當前規則

    4、因為我們可以通過備份的iptables規則檔案,使用iptables-restore來進行還原,預設iptables是載入/etc/sysconfig/iptables中的規則,此時我們在/etc/rc.d/rc.local中,執行iptables-restore < /path/to/backfile會重新載入新的規則。

    5、或者通過計劃任務crontab或者at來通過iptables-restore來恢復iptables規則。
  • Centos7下
    同6一樣,但是因為7下iptables不再是服務了,所以iptables無法通過Centos6下的第一種方法,需要使用剩下的其他方法
table chain target
raw
mangle
nat PREROUTING,POSTTOURING DNAT,SNAT,MASQUERADE
filter INPUT,OUTPUT,FORWARD ACCPET,DROP,REJECT

實際應用場景:

有個問題就是沒有新增備註的功能,換個人不知道你寫的每條規則幹嘛東東的,這就不好了。

  • 1、iptables

    filter
    nat

    自定義鏈chain的使用:

    
    
    例如:
     iptables -F
     iptables -N web 建立自定義鏈
     iptables -vnL
     iptables -A web -s 10.0.1.0/24 -p tcp --dport 80 -j ACCEPT 新增web鏈規則,允許本地主機訪問web服務;
     iptables -I web 1 -m string --algo kmp --string "old" -j REJECT 插入第1條web鏈,包含了old字串的頁面禁止訪問;
    只要狀態是ESTABLISHED應放行;
     iptables -I web 2 -p tcp -m state --state ESTABLISHED -j ACCEPT 插入web鏈第2條,放行狀態是ESTABLISHED;
    此時,內網使用者訪問web服務:不能訪問
    curl httpd://172.18.11.111
    是不能訪問的,因為自定義鏈不會直接生效的,只有被呼叫才生效;
    iptables -A FORWARD -p tcp -j web 在forward鏈上呼叫web自定義鏈;
    此時,內網使用者就能訪問web服務了;

實現網路防火牆:

實驗環境:3臺主機,1臺模擬路由器,1臺模擬客戶端,1臺模擬伺服器

1、上網時間控制:1,3,5的9:00-12:00 14:00-18:00 不允許上網
2、訪問網站控制:iqiyi,youku,tudou,不允許訪問
3、特地主機控制:172.18.0.100-101
4、路由器只開啟特定服務:http,https,ssh ,dns
5、SNAT

首先防火牆策略部署在路由器上,然後需要使用表nat

echo `net.ipv4.ip_forward=1` >> /etc/sysctl.conf
sysctl -p

假設eth1連線內網,eth0連線外網

iptables -t nat -A REROUTING -i eth1 -m iprange --src-range=172.18.0.100-101 -j MASQUERADE
iptables -t nat -A REROUTING -i eth1 -m time  --timestart=01:00 --timestop=04:00 --weekday=1,3,5 -j REJECT
iptables -t nat -A REROUTING -i eth1 -m time  --timestart=06:00 --timestop=10:00 --weekday=1,3,5 -j REJECT
iptables -t nat -A REROUTING -i eth1 -m string --algo bm --string `iqiyi|youku|tudou` -j REJECT
iptables -t nat -A POSTROUTING -o eth0 -s 172.18.0.0/16  -j MASQUERADE
iptables -t nat -A POSTROUTING -j REJECT 

- 2、firewalld

 暫時先這樣子   


相關文章