02-iptables-netfilter

02-iptables/netfilter

Rules

組成部分

    匹配條件

        基本匹配條件
        擴展匹配條件

    處理動作

        基本處理動作
        擴展處理動作
        自定義處理機制

iptables鏈

內置鏈
    對應於hook function
自定義鏈
    沒有hook function,不能直接使用,用於內置鏈的擴展和擴充,可實現更靈活的規則管理機制;其使用要通過調用纔可以

原則

添加規則的考量

1、要實現哪種功能:判斷添加到哪張表上
2、報文流經的路徑:判斷到那個鏈上
3、鏈上的規則次序,即爲檢查的次序,因此,隱含一定的應用法則

    同類規則:匹配範圍小的,規則嚴格的放在上面
    不同類的規則:匹配到報文頻率較大的放在上面
    可由一條規則描述的多個規則聯合
    設置默認策略;所有白名單,web服務黑名單

-

[root@husa security]# rpm -ql iptables
/etc/sysconfig/ip6tables-config
/etc/sysconfig/iptables-config
/usr/bin/iptables-xml
/usr/lib64/libip4tc.so.0
/usr/lib64/libip4tc.so.0.1.0
/usr/lib64/libip6tc.so.0
/usr/lib64/libip6tc.so.0.1.0
/usr/lib64/libiptc.so.0
/usr/lib64/libiptc.so.0.0.0
/usr/lib64/libxtables.so.10
/usr/lib64/libxtables.so.10.0.0
/usr/lib64/xtables
/usr/lib64/xtables/libip6t_DNAT.so
/usr/lib64/xtables/libip6t_DNPT.so
/usr/lib64/xtables/libip6t_HL.so
/usr/lib64/xtables/libip6t_LOG.so
/usr/lib64/xtables/libip6t_MASQUERADE.so
/usr/lib64/xtables/libip6t_NETMAP.so
/usr/lib64/xtables/libip6t_REDIRECT.so
/usr/lib64/xtables/libip6t_REJECT.so
/usr/lib64/xtables/libip6t_SNAT.so
/usr/lib64/xtables/libip6t_SNPT.so
/usr/lib64/xtables/libip6t_ah.so
/usr/lib64/xtables/libip6t_dst.so
/usr/lib64/xtables/libip6t_eui64.so
/usr/lib64/xtables/libip6t_frag.so
/usr/lib64/xtables/libip6t_hbh.so
/usr/lib64/xtables/libip6t_hl.so
/usr/lib64/xtables/libip6t_icmp6.so
/usr/lib64/xtables/libip6t_ipv6header.so
/usr/lib64/xtables/libip6t_mh.so
/usr/lib64/xtables/libip6t_rt.so

擴展模塊:

小寫用於匹配條件
大寫用於處理動作

iptables 命令

       iptables [-t table] {-A|-C|-D} chain rule-specification

       ip6tables [-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]

-t table

raw
mangle
nat
filter

options(COMMAND)

鏈管理
    -N:new,自定義一條新的規則鏈
    -X:delete,刪除自定義的規則鏈
    -P:policy,設置默認策略;對filter表中的鏈而言,其默認策略有
        ACCEPT:接受
        DROP:丟棄
        REJECT:拒絕
    -E:重命名自定義鏈,引用計數不爲0的自定義鏈不能夠被重命名,且不能被刪除

規則管理,選項後面接 鏈 的名稱
    -A:append,追加
    -I:insert,插入,要指明位置,省略時表示第一條
    -D:delete,刪除
        指明規則序號
        指明規則本身
    -R:replace,替換指定鏈上的規則
        指明規則序號
        指明規則本身
    -F:flush,清空指定鏈上的指定規則
    -Z;zero,置零
        iptables的每條規則都有兩個計數器
            匹配到的報文的個數

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

chain

PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

matches

基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供

    [!]-s,--source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍

    [!]-d,--destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍

    [!]-p, --protocol protocol:一般使用tcp、udp和icmp
        tcp, udp, udplite, icmp,icmpv6,esp, ah, sctp, mh or the special keyword "all", or A  protocol  name  from /etc/protocols is also allowed.

    [!] -i, --in-interface name:數據報文流入的接口;只能應用於數據報文流入的環節,只能應用於INPUT, FORWARD and PRE‐ROUTING chains).可以添加邏輯運算 ! ,接口末尾是一個+表示任何以這個名字開頭的都會匹配

    [!] -o, --out-interface name:數據報文流出的接口;只能應用於數據報文流出的環節,只能那個應用於FORWARD,  and POSTROUTING chains). 可以添加邏輯元算 !,接口末尾添加一個+表示任何以這個名字開頭的都會匹配

-

擴展匹配條件:需要加載擴展模塊方可生效


        隱式擴展:不需要手動加載擴展模塊;因爲他們是對協議的擴展,所以,但凡使用-p指明瞭協議,就表示已經指明瞭要擴展的模塊;直接使用-p指明這些隱式擴展

        tcp:
            [!] --source-port,--sport port[:port]...:匹配報文的源端口;可以是端口範圍,必須連續
            [!] --destination-port,--dport port[:port]...:匹配報文的目標端口;可以是端口範圍,必須連續
            [!] --tcp-flags mask comp:
                mask is the flags which we should examine,written as a comma-separated list,例如SYN,ACK,FIN,RST
                comp is a comma-separated list of flags which must be set,例如SYN
                例如:”“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標誌位爲SYN,ACK,FIN,RST四個,七種SYN必須爲1
            [!] --syn:用於匹配第一次握手,相當於“--tcp-flags SYN,ACK,FIN,RSR SYN”

        udp:
            [!] --source-port,--sport port[:port]:匹配報文的源端口,可以是端口範圍
            [!] --destination-port,--dport port[:port]:匹配報文的目標端口,可以是端口範圍

        icmp:

            [!] --icmp-type {type[/code]|typename}:
                echo-request:8類型表示請求
                echo-reply:0類型表示回覆

    -m

        顯示擴展:必須顯示地指明使用的擴展模塊進行的擴展
            使用幫助
                CentOS 6:man iptables
                CentOS 7:man iptables-extensions

            multiport擴展:
                以離散方式定義多端口匹配;最多定義15個端口
                [!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口
                [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口
                [!] --ports port[,port|,port:port]...:指明多個端口,無論源或者目標



            iprange擴展:
                指明連續的ip地址範圍;

                [!] --src-range from[-to]:源IP地址;
                [!] --dst-range from[-to]:目標IP地址;

                ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP


            string擴展:
                對報文中的應用層數據做字符串模式匹配檢測;這裏的模式就是普通的字符串而已

                --algo {bm|kmp}:字符串匹配檢測算法;
                    bm:Boyer-Moore
                    kmp:Knuth-Pratt-Morris
                [!] --string pattern:要檢測的字符串模式;
                [!] --hex-string pattern:要檢測的字符串模式,16進制格式;

                ~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT


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

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

                --timestart hh:mm[:ss]  #表示每天
                --timestop hh:mm[:ss]

                [!] --monthdays day[,day...]    #表示每月的幾號
                [!] --weekdays day[,day...]     #表示每週的幾天

                --kerneltz:表示使用內核上的時區,而非默認的UTC;

                ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP


            connlimit擴展:
                根據每客戶端IP做 併發連接 數數量匹配;

                --connlimit-upto n:連接的數量小於等於n時匹配;
                --connlimit-above n:連接的數量大於n時匹配;

                ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT



            limit擴展:
                基於 收發報文的速率 做匹配;

                --limit rate[/second|/minute|/hour|/day]:表示正常放行多少個請求
                --limit-burst number:表示初始化時一次性放行多好個請求

                ~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
                ~]# iptables -I INPUT 2 -p icmp -j REJECT


            state擴展:
                根據”連接追蹤機制“去檢查連接的狀態;
                這裏的state追蹤的是IP層的狀態而不是運輸層的狀態

                conntrack機制:追蹤本機上的請求和響應之間的關係;狀態有如下幾種:
                    NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別爲第一次發出的請求;
                    ESTABLISHED:NEW狀態之後,連接追蹤模板中爲其建立的條目失效之前期間內所進行的通信狀態;可以理解爲IP層中已經建立連接的主機的IP已經被記錄了,以後的都是ESTABLISHED
                    RELATED:相關聯的連接;如ftp協議中的數據連接與命令連接之間的關係;
                    INVALID:無效的連接;
                    UNTRACKED:未進行追蹤的連接;

                [!] --state state

                ~]#  iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
                ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

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

                [root@husa ~]# cat /proc/sys/net/nf_conntrack_max 
                65536               

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

                [root@husa ~]# cat /proc/net/nf_conntrack
                    ipv4     2 tcp      6 429405 ESTABLISHED src=172.16.11.207 dst=172.16.11.206 sport=56348 dport=22 src=172.16.11.206 dst=172.16.11.207 sport=22 dport=56348 [ASSURED] mark=0 zone=0 use=2
                    ipv4     2 tcp      6 429823 ESTABLISHED src=172.16.250.35 dst=172.16.11.206 sport=14354 dport=22 src=172.16.11.206 dst=172.16.250.35 sport=22 dport=14354 [ASSURED] mark=0 zone=0 use=2
                    ipv4     2 tcp      6 299 ESTABLISHED src=172.16.250.35 dst=172.16.11.206 sport=2726 dport=22 src=172.16.11.206 dst=172.16.250.35 sport=22 dport=2726 [ASSURED] mark=0 zone=0 use=2
                    ipv4     2 udp      17 23 src=172.16.250.119 dst=172.16.255.255 sport=137 dport=137 [UNREPLIED] src=172.16.255.255 dst=172.16.250.119 sport=137 dport=137 mark=0 zone=0 use=2
                    ipv4     2 tcp      6 429815 ESTABLISHED src=172.16.11.207 dst=172.16.11.206 sport=56353 dport=22 src=172.16.11.206 dst=172.16.11.207 sport=22 dport=56353 [ASSURED] mark=0 zone=0 use=2





        不同的協議的連接追蹤時長:
            /proc/sys/net/netfilter/目錄下是各種協議的追蹤時長

                [root@husa ~]# ls /proc/sys/net/netfilter/ 
                    nf_conntrack_acct                  nf_conntrack_log_invalid              nf_conntrack_tcp_timeout_max_retrans
                    nf_conntrack_buckets               nf_conntrack_max                      nf_conntrack_tcp_timeout_syn_recv
                    nf_conntrack_checksum              nf_conntrack_tcp_be_liberal           nf_conntrack_tcp_timeout_syn_sent
                    nf_conntrack_count                 nf_conntrack_tcp_loose                nf_conntrack_tcp_timeout_time_wait
                    nf_conntrack_events                nf_conntrack_tcp_max_retrans          nf_conntrack_tcp_timeout_unacknowledged
                    nf_conntrack_events_retry_timeout  nf_conntrack_tcp_timeout_close        nf_conntrack_timestamp
                    nf_conntrack_expect_max            nf_conntrack_tcp_timeout_close_wait   nf_conntrack_udp_timeout
                    nf_conntrack_generic_timeout       nf_conntrack_tcp_timeout_established  nf_conntrack_udp_timeout_stream
                    nf_conntrack_helper                nf_conntrack_tcp_timeout_fin_wait     nf_log
                    nf_conntrack_icmp_timeout          nf_conntrack_tcp_timeout_last_ack                

        iptables的鏈接跟蹤表最大容量爲/proc/sys/net/ipv4/ip_conntrack_max,鏈接碰到各種狀態的超時後就會從表中刪除;當模板滿載時,後續的連接可能會超時

        解決方法一般有兩個:
            (1) 加大nf_conntrack_max 值
            vi /etc/sysctl.conf
            net.ipv4.nf_conntrack_max = 393216
            net.ipv4.netfilter.nf_conntrack_max = 393216

            (2)  降低 nf_conntrack timeout時間
            vi /etc/sysctl.conf
            net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
            net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
            net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
            net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120


                [root@husa etc]# less sysctl.conf 
                # System default settings live in /usr/lib/sysctl.d/00-system.conf.
                # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
                #
                # For more information, see sysctl.conf(5) and sysctl.d(5).

前端負載均衡上一定不要使用狀態追蹤及其模塊,降低性能

內核參數:/proc/sys/net/netfilter

匹配條件之間是與關係,同時滿足才匹配

target(處理動作)

-j targetname [per-target-options]
    ACCEPT
    DROP
    REJECT
    RETURN:返回調用鏈
    REDIRECT:端口重定向
    LOG:記錄日誌
        LOG:
            --log-level level   指明日誌級別
            --log-prefix prefix 指明日誌前綴
    MARK:做防火牆標記
    DNAT:目標地址轉換
    SNAT:源地址轉換
    MASQUERADE:地址僞裝
    自定義鏈:匹配到跳轉至自定義鏈

自定義鏈規則的使用

自定義鏈:需要被調用才能生效;自定義鏈最後需要定義返回規則;

返回規則使用的target叫做RETURN;

創建自定義鏈並修改名稱,修改名稱中只有reference爲0的才能夠修改

[root@localhost ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 248 packets, 24070 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 50 packets, 7457 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@localhost ~]# iptables -N icmp
[root@localhost ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 10 packets, 840 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 5 packets, 616 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain icmp (0 references)
 pkts bytes target     prot opt in     out     source               destination         
[root@localhost ~]# iptables -E icmp rename-icmp
[root@localhost ~]# iptables -L -n -v           
Chain INPUT (policy ACCEPT 8 packets, 934 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 3 packets, 456 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain rename-icmp (0 references)
 pkts bytes target     prot opt in     out     source               destination  



[root@localhost ~]# iptables -X rename-icmp        #表示刪除自定義鏈

iptables -X rename-icmp #表示刪除自定義鏈


防火牆開啓關閉

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

firewalld服務管理複雜,使用iptables簡單一些,所以關閉firewalld服務

systemctl disable firewalld.service
systemctl stop firewalld.service

規則的配置

規則的有效期限

使用iptables命令定義的規則,手動刪除之前,起生效期限爲kernel存活期限

保存規則

1 service iptables save,此命令僅限於CentOS 6

將規則保存至/etc/sysconfig/iptables文件中
[root@localhost ~]# ls /etc/sysconfig/iptables
ls: cannot access /etc/sysconfig/iptables: No such file or directory
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@localhost ~]# ls /etc/sysconfig/iptables
/etc/sysconfig/iptables

# 查看
[root@localhost ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Sun Dec 20 14:43:28 2015
*filter
:INPUT ACCEPT [751:77766]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [154:21292]
:icmp - [0:0]
-A INPUT -d 172.16.11.207/32 -j icmp 
-A icmp -d 172.16.11.207/32 -p icmp -j REJECT --reject-with icmp-port-unreachable 
-A icmp -j RETURN 
COMMIT
# Completed on Sun Dec 20 14:43:28 2015

2 iptables-save命令 iptables-save — dump iptables rules to stdout

將規則保存至指定的文件中
    iptables-save /path/to/somefile
[root@localhost ~]# iptables-save > /root/iptables
[root@localhost ~]# cat /root/iptables
# Generated by iptables-save v1.4.7 on Sun Dec 20 14:46:14 2015
*filter
:INPUT ACCEPT [1221:125655]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [309:45748]
:icmp - [0:0]
-A INPUT -d 172.16.11.207/32 -j icmp 
-A icmp -d 172.16.11.207/32 -p icmp -j REJECT --reject-with icmp-port-unreachable 
-A icmp -j RETURN 
COMMIT
# Completed on Sun Dec 20 14:46:14 2015

載入規則

iptables-restore命令
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
icmp       all  --  0.0.0.0/0            172.16.11.207       

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain icmp (1 references)
target     prot opt source               destination         
REJECT     icmp --  0.0.0.0/0            172.16.11.207       reject-with icmp-port-unreachable 
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables-restore < /root/iptables 
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
icmp       all  --  0.0.0.0/0            172.16.11.207       

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain icmp (1 references)
target     prot opt source               destination         
REJECT     icmp --  0.0.0.0/0            172.16.11.207       reject-with icmp-port-unreachable 
RETURN     all  --  0.0.0.0/0            0.0.0.0/0     

自動添加iptables規則

(1) 用腳本保存各iptables命令;讓此腳本開機後自動運行;
    /etc/rc.d/rc.local文件中添加腳本路徑;
        /PATH/TO/SOME_SCRIPT_FILE

(2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則;
    /etc/rc.d/rc.local文件添加:
        iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章