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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值