1. 程式人生 > >iptables: 包過濾型防火墻

iptables: 包過濾型防火墻

數據連接 不能 n) works des 大於 指定表 過濾器 war

iptables: 包過濾型防火墻

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

ipfw

ipchains

iptables/netfilter
    framework: netfilter
        hooks function  
    rule utils: iptables

功能:(四表)
    filter: 過濾,防火墻;
    nat: network address translation, 網絡地址轉換;
    mangle:拆解報文,做出修改,封裝報文;
    raw:關閉nat表上啟用的連接追蹤機制;

鏈(內置): (五鏈)
    PREROUTING
    INPUT
    FORWARD
    OUTPUT
    POSTROUTING

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

各功能的分別實現:
    filter:INPUT, FORWARD, OUTPUT    (iptables -t filter -L -n)
    nat: PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)   (iptables -t nat -L -n)
    mangle:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING    (iptables -t mangle -L -n)
    raw:PREROUTING, OUTPUT     (iptables -t raw -L -n)

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

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

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

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

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

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

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

    規則和鏈有計數器:
        pkts:由規則或鏈所匹配到的報文的個數;
        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

   -t table:
        filter, nat, mangle, raw

    鏈管理:
        -F:flush,清空規則鏈;省略鏈,表示清空指定表上的所有的鏈;
        -N:new, 創建新的自定義規則鏈;
        -X:drop, 刪除用戶自定義的空的規則鏈;
        -Z:zero,清零,置零規則計數器;
        -P:Policy,為指定鏈設置默認策略;對filter表中的鏈而言,默認策略通常有ACCEPT, DROP, REJECT; 
        -E: rEname,重命令自定義鏈;引用計數不為0的自定義鏈,無法改名,也無法刪除;
    規則管理:
        -A:append,將新規則追加於指定鏈的尾部;
        -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首部中的protocols所標識的協議;
            [!] -i, --in-interface IFACE:數據報文的流入接口;僅能用於PREROUTING, 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: 記錄日誌
            MARK:做防火墻標記
            DNAT:目標地址轉換
            SNAT:源地址轉換
            MASQUERADE:地址偽裝
            ...
            自定義鏈:由自定義鏈上的規則進行匹配檢查

    四表:filter, nat, mangle, raw
    五鏈:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

    -j TARGET:
        ACCEPT, DROP, REJECT, RETURN, LOG, MARK, DNAT, SNAT, MASQUEARDE, ...

    匹配標準:
        通用匹配:-s, -d, -p, -i, -o
        擴展匹配
            隱含擴展:
                -p tcp: --dport, --sport, --tcp-flags, --syn (--tcp-flags SYN,ACK,FIN,RST SYN)
                -p udp: --dport, --sport
                -p icmp: --icmp-type 
            顯式擴展: -m 

iptables:

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

    CentOS 6: man iptables
    CentOS 7: 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/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
    ~]# iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT

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.16.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.16.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 ‘movie‘ -j REJECT

4、time擴展
    根據報文到達的時間與指定的時間範圍進行匹配;

    --datestart 
    --datestop

    --timestart
    --timestop

    --monthdays
    --weekdays

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

    --connlimit-above n:連接的數量大於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

    不同協議或連接類型追的時長:
        /proc/sys/net/netfilter/

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

    --state STATE1,STATE2,...

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

        (1) 裝載ftp追蹤時的專用的模塊:
            # modprobe nf_conntrack_ftp

        (2) 放行請求報文:
            命令連接:NEW, ESTABLISHED
            數據連接:RELATED, ESTABLISHED

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

        (3) 放行響應報文:
            ESTABLISEHD

            # iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT

如何保存及重載規則:

    保存規則至指定文件:
        iptables-save > /PATH/TO/SOMEFILE

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

    CentOS 6:
        service iptables save 
            iptables-save > /etc/sysconfig/iptables

        service iptables restart
            iptables-restore < /etc/sysconfig/iptables

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

    關於firewalld:
        http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html

核心轉發:/proc/sys/net/ipv4/ip_forward
    /etc/sysct.conf
    net.ipv4.ip_forward = 1

iptables:
    顯式擴展、網絡防火墻

    顯式擴展:multiport, iprange, string, time, connlimit, limit, state
        state:
            /proc/net/nf_conntrack
            /proc/sys/net/nf_conntrack_max

            NEW, ESTABLISHED, RELATED, INVALID

iptables:

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

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

nat表:
    PREROUTING:DNAT
    OUTPUT
    POSTROUTING:SNAT

源地址轉換:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source 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_conntrack_max,鏈接碰到各種狀態的超時後就會從表中刪除。

    所以解決方法一般有兩個:
    (1) 加大 ip_conntrack_max 值
    vi /etc/sysctl.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

ssh: 遠程連接,

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

1.利用connlimit模塊將單IP的並發設置為3;會誤殺使用NAT上網的用戶,可以根據實際情況增大該值;
2.利用recent和state模塊限制單IP在300s內只能與本機建立2個新連接。被限制五分鐘後即可恢復訪問。

下面對最後兩句做一個說明:
1.第二句是記錄訪問tcp 22端口的新連接,記錄名稱為SSH
--set 記錄數據包的來源IP,如果IP已經存在將更新已經存在的條目

2.第三句是指SSH記錄中的IP,300s內發起超過3次連接則拒絕此IP的連接。
--update 是指每次建立連接都更新列表;
--seconds必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--update同時使用

3.iptables的記錄:/proc/net/xt_recent/SSH

也可以使用下面的這句記錄日誌:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"

iptables實現七層訪問過濾:

    模塊:layer7
        識別應用層協議

    iptables/netfilter
        iptables -m state, 
        netfilter state

    對內核中的netfilter,打補丁layer7,重新編譯內核
    對iptables打補丁,補上layer7模塊,重新iptables

iptables: 包過濾型防火墻