iptables 個人詳解 從基礎到精通

iptables
iptables:包過濾防火牆

firewall:防火牆,隔離工具:工作於主機或網絡邊緣,對於進出本主機或網絡的報文根據事先定義好的檢查規則做匹配檢測,對於能夠被規則所匹配到的報文做出相應處理的組件:
    主機防火牆
    網絡防火牆

    ***檢測系統(IDS):

        ·網絡***檢測系統  NIDS

        ·主機***檢測系統  HIDS

        對於IDS常用的檢測服務有:snort等

    ***防禦系統(IPS),比如蜜罐

        部署一套***檢測系統是非常麻煩的,因爲必須檢測網絡任意一個位置

        對於IPS常用的檢測服務有: tripwire 等

ipfw

ipchains

iptables/netfilter
    framework(內核中的網絡報文過濾或處理框架):netfilter
        hook function(鉤子函數)
    rule utils(規則管理工具):iptables

表功能:
    filter:過濾,防火牆:
    nat:網絡地址轉換(network address teanslation)
    mangle:拆解報文,做出修改,封裝報文
    raw:關閉nat表上啓用的連接追蹤機制
鏈(內置):
    PREOUTING:路由角色發生之前
    INPUT:
    FORWARD:轉發
    OUTPUT:
    POSTROUTING:路由角色發生之後

        PREOUTING,POSTROUTING:是tcp/ip協議棧上的功能

流入:PREOUTING --> INPUT
流出:OUTPUT --> POSTROUTING
轉發:PREOUTING --> FORWARD --> POSTROUTING

表各功能的分別實現:
    filter:INPUT,FORWARD,OUTPUT
    nat:PREOUTING(DNAT),OUTPUT,POSTROUTING(SNAT)
    mangle:PREOUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
    raw:PREOUTING,OUTPUT

路由發生時刻:
    報文進入本機後
        判斷目標主機
    報文發出之前
        判斷經由那個接口送往下一跳   

iptables:四表五鏈
    添加規則時的考量點:
        (1)要實現那種功能,判斷添加在那張表
        (2)報文流經的路徑,判斷添加在那個鏈上

    鏈:鏈上規則次序,即爲檢查次序,因此隱含一定的法則   
        (1)同類規則(訪問同一應用),匹配範圍小的放上面
        (2)不同類規則(訪問不同應用),匹配到報文頻率較大的放上面
        (3)將那些可由一條規則描述的多個規則合併爲一個
        (4)設置默認策略

    功能的優先級次序:raw --> mangle --> nat --> filter

規則:
    組成部分:報文的匹配條件,匹配到之後的處理動作
        匹配條件:根據協議報文特徵指定
            基本匹配條件
            擴展匹配條件
        處理動作:
            內建處理機制
            自定義處理機制

        注意:報文不會經過自定義鏈,只能在內置鏈上通過規則進行引用後生效

iptables:規則管理工具
    添加、修改、刪除、顯示等:

    規則和鏈有計數器:
        pkgs:由規則或鏈所匹配到的報文的個數
        bytes:由規則或鏈匹配到的所有報文大小之和

    iptables命令:

       iptables [-t table] {-A|-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

       iptables [-t table] SUBCOMMAND(子命令) CHAIN(鏈) CRETERIA(匹配標準) -j TARGET(處理動作)

       -t table 
            filter,nat,mangle,raw

        鏈管理:
            -F:flush,清空規則鏈,省略鏈,表示清空表上的所有的鏈
            -N:new,創建新的自定義規則鏈
            -X:drop,刪除用戶自定義的空的規則鏈
            -Z:zero,清零,置零規則計數器
            -P:policy,爲指定鏈設置默認策略:對filter表中的鏈而言,默認策略通常有ACCEPT,DROP,REJECT;
            -E:rEname,重命名自定義鏈,引用計數不爲零的自定義鏈,無法刪除,也無法改名

        規則管理命令
            -A:aappend,將新規則追加於指定鏈的尾部
            -I:insert,講規則插入至指定鏈的指定位置
            -D:delete,刪除指定鏈上的制定規則
                有兩種方式
                    (1)制定匹配條件
                    (2)指定規則編號
            -R:replace,替換指定鏈上的制定規則

        查看:
            -L:list,列出指定鏈上的所有規則
                -n:numberic,以數字格式顯示地址和端口號
                -v:verbose,顯示詳細信息
                    -vv,-vvv
                --line-numbers:顯示規則編號
                -x:exactly,顯示計數器技術結果的精確值

        匹配條件
            基本匹配:
                [!]-s,--src,--source IP|Netaddr:檢查報文中源IP地址是否符合此處指定的地址範圍
                [!]-d, --dst,--destination IP|Netaddr:檢查報文中源IP地址是否符合此處指定的地址範圍
                [!]-p, --protocol {tcp|udp|icmp(互聯網報文控制協議)}:檢查報文中的協議,即IP首部中的proctocols所表示的協議
                [!]-i, --in-interface IFACE:數據報文的流入接口,僅能用於PREOUTING,INPUT及FORWARD鏈上
                [!]-o,--out-interface IFACE:數據報文的流出接口,僅能用於FORWARD,OUTPUT及POSTROUTING鏈上

            擴展匹配:-m  macth_name(指明你的擴展名) --spec_options
                    例如:-m tcp --dport 22
                隱式擴展:對-p protocol指明的協議進行擴展,可省略-m選項
                    -p tcp
                        --dport(目的端口) PORT[-PORT]: 目標端口,可以是單個端口或連續多個端口
                        --sport(源端口)PORT[-PORT]
                        --tcp-flags LIST1 LIST2:檢查LIST1所指明的所有標誌位,且這其中,LIST2所表示出的所有標記位必須爲1,而餘下的必須爲0;沒有在LIST1中指明的,不做檢查
                            SYN,ACK,FIN,RST,PSH,URG

                        例:  --tcp-flags SYN,ACK,FIN,RST  SYN
                            --syn:相當於例

                    -p udp
                        --dport
                        --sport

                    -p icmp
                        --icmp-type
                            可用數字表示其類型
                                0:echo-reply(回送應答)
                                8:echo-request(請求應答)

                顯示擴展:必須使用-m選項指定使用的擴展

        目標:
            -j TARGET:jump(跳轉)指定的TARGET(目標)
                ACCEPT:接受
                DROP:丟棄
                REJECT:拒絕
                RETURN :返回調用鏈
                REDIRECT:端口重定向
                LOG:記錄日誌
                MAKE:做防火牆標記
                DNAT:目標地址轉換
                SNAT:源地址轉換
                MASQUERADE:地址僞裝
                ...
                自定義鏈:由自定義鏈上的規則進行匹配檢查

iptables:

顯示擴展:必須顯示指明使用的擴展模塊(rpm -ql iptables |grep "\.so")

    centos6:man iptables
    centos7:man iptables-extensions

常用:
    1、multiport擴展
        以離散方式定義多端口匹配:最多指定15個端口

         [!] --source-ports,--sports port[,port|,port:port]...  :指明多個源端口
         [!] --destination-ports,--dports port[,port|,port:port]...  :指明多個離散的目標端口
         [!] --ports port[,port|,port:port]...    :既可以匹配源也可以匹配目標

    例子:
        iptables -I INPUT -s 172.16.0.0/24 -d172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCERT
        iptables -I OUTPUT -d 172.16.0.0/24 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCERT

    2、iprange擴展
        指明連續的ip地址範圍時使用(但一般是不能擴展爲整個網絡)

        [!] --src-range from[-to]  :指明連續的IP地址範圍
        [!] --dst-range from[-to]  :指明連續的目標IP地址範圍

        例子:
            iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.168.100.1-172.16.100.120 -j ACCEPT

            iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange -dst-range 172.168.100.1-172.16.100.120 -j ACCEPT

    3、string擴展
        檢查報文中出現的字符串

        --algo {bm|kmp} (指明所要使用的字符串比對算法)
            bm = Boyer-Moore
            kmp = Knuth-Pratt-Morris
         [!] --string pattern   (從頭到尾進行檢查)
         例:
            iptables -I OUTPUT -m string --algo bm --string 'moviie' -j REJECT

         [!] --hex-string pattern   (基於16進制編碼以後字符串檢查)

    4、time擴展

        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]   (起始日期)
        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]     (停止日期 )

        例:(以時間爲例)
            iptables -I INPUT -d 172.16.100.8 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT
            根據報文到達的時間與指定的時間範圍進行匹配

    5、connlimit擴展
        根據每客戶端IP(也可以是地址塊)做併發連接數數量匹配

        [!] --connlimit-above n   (對超過的連接數做規則:一般是拒絕)
        [!] --connlimit-upto n    (連接數量小於n:一般是放行)

    6、limit擴展
        基於收發報文的速率做檢查:

        令牌桶過濾器:

        --limit rate[/second|/minute|/hour|/day]
        --limit-burst number

    7、state擴展
        根據連接追蹤機制,來檢查連接件的狀態

        調整連接追蹤功能所能夠容納的最大連接數量
            /proc/sys/net/nf_conntrack_max

        已經追蹤到並記錄下的連接:
            /proc/net/nf_conntrack

        不同協議或鏈接類型追蹤的時長
            /porc/sys/net/netfilter/

        可追蹤的連接狀態:
            NEW:新發出的請求:連接追蹤模板中不存此鏈接相關的信息條目,因此,將其識別爲第一次發出的請求
            ESTABLISHED:NEW狀態之後,連接追蹤模板中爲其建立的條目失效之前期間內所進行的通信的狀態
            RELATED:相關的連接:如ftp協議的命令鏈接與數據連接之間的關係
            INVALIED:無法識別的連接

        問題:如何開放被動模式的ftp服務

            (1)裝載ftp追蹤時
                進入:cd /lib/modules/2.6.32-431.el6.x86_64/kernel/net/netfilter/
                手動裝載模塊:modprobe nf_conntrack_ftp
                查看:lsmod
            (2)放行請求報文
                命令鏈接:NEW,ESTABLISHED
                數據連接:RELATED,ESTABLISHED

                # iptables -A INPUT -d 192.168.132.186 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
                # iptables -A INPUT -d 192.168.132.186 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

            (3)放行響應報文
                ESTABLISHED
                # iptables -A OUTPUT -s 192.168.132.186 -p tcp -m state --state ESTABLISHED -j ACCEPT

    如何保存和重載規則:
        保存規則至指定文件:iptables-save > /PATH/TO/SOMEFILE

        從指定文件重載規則:iptables-restore < /PATH/FROM/SOMEFILE

    centos 6 :
        service iptables save (也可直接保存)
        service iptables restart(重載)

    centos 7 :
        引入了新的iptables前端管理服務工具:firewalld
            firewalld-cmd
            firewalld-config 

iptables:

    nat : Network Adress Translation 安全性, 網絡層+傳輸層
    proxy:代理,應用層 

    nat:
        SNAT:只修改請求報文的源地址
        DNAT:只修改請求報文的目標地址

    nat表:
        PREROUTING: DNAT
        OUTPUT:
        POSTROUTING:SNAT

源地址轉換:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j SNAT --to-source 外部IP(ExtIP)
           iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j MASQUERADE

目標地址轉換:iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]

    iptables的鏈接跟蹤表最大容量爲/proc/sys/net/ipv4/ip(nf)_conntrack_max,鏈接碰到各種狀態的超時後就會從表中刪除。

    解決方法一般有兩個:
    (1)加大ip_conntrack_max的值
        vi /etc/susctl.conf
        net.ipv4.ip_conntrack_max=393216
        net.ipv4..netfilter.ip_conntrack_max=393216
    (2)降低ip_conntrack timeout時間
        vi /etc/sysctl.conf
        net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
        net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
        net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
        net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

        iptables -t nat -L -n

    #補充:利用iptables的recent模塊來抵禦DOS×××:22,建立一個列表,保存由所有訪問過指定的服務的客戶端IP

tcp_wrapper:tcp包裝器

對於給予tcp協議kaifa並提供服務的應用程序,提供的一層訪問控制工具:
基於庫調用實現其功能:
    libwrap

判斷服務是否能夠由tcp_wrapper進行訪問控制:
    (1)動態編譯:ldd命令  例:ldd `which sshd`
    (2)靜態編譯;strings命令查看應用程序文件,其結果如果出現
        host.allow
        host.deny 
        則表示支持,否則不支持

在配置文件中爲各服務分別定義訪問控制規則實現訪問控制:
    /etc/host.allow
    /etc/host.deny

    配置文件語法
        daemon_list:client_list [:options]

        daemon_list:
            應用程序文件名稱,而非服務名:
            應用程序文件名稱列表,彼此間使用逗號分隔
                例如:sshd,vsftpd:
                    ALL表示多有服務

        client_list
            IP地址
            主機名
            網絡地址:必須使用完整格式的掩碼,不能使用前綴格式掩碼,所以類似於172.16.0.0/16是不合法的
            簡短格式的網絡地址:例如172.16. 表示 172.16.0.0/255.255.0.0
            ALL:所有主機
            KNOWN
            UNKNOEN
            PARANOID

        EXCEPT:除了
        hosts.allow
            vsftp:172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1

        [:Options]
            deny:拒絕,主要用於host.allow文件中
            allow:允許用於host.deny文件,實現allow功能
            spawn:啓動額外應用程序
                vsftpd: ALL :spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/vsftpd.deny.log
                    %c  client ip
                    %s  server ip
                    %d  daemon name
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章