1. 程式人生 > >Linux防火墻之netfilter/ptables

Linux防火墻之netfilter/ptables

iptables

時間: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

 暫時先這樣子   

Linux防火墻之netfilter/ptables