iptables防火墙

防火墙的几个知识点

1、防火墙的概念  
2、iptables的基本认识
3、iptables的组成
4、iptables的基本语法
5、iptables之forward的概念
6、iptables之地址转换法则
7、SNAT源地址转换的具体实现
8、DNAT目标地址转换的具体实现
9、firewalld介绍
10、firewalld配置命令
11、rich规则

防火墙概念

    防火墙一般分为硬件防火墙和软件防火墙。但实际上,不管是硬件和软件防火墙,它们都需要使用硬件来作为联机介质,
    也需要使用软件来设定安全政策,严格来说,两者间的差别并不太大,因此只能从使用的硬件与操作系统来加以区分:硬件防火墙使用专用的硬件,
    而软件式防火墙则使用一般的计算机硬件、硬件防火墙使用专有的操作系统,而软件式防火墙则使用一般的操作系统。
    根据工作方式,防火墙还是可以分为封包过滤式防火墙,应用层网关防火墙两种,其中广为采用的是封包过滤式防火墙,本次介绍的iptables防火墙就属于这一种。
    iptables是Linux系统内嵌的一个防火墙软件,它集成在系统内核中,因此执行效率非常高。iptables通过设置一些封包过滤规则,来定义什么数据可以接受,什么数据需要拒绝,因此,用户通过iptables可以对进出计算机的数据包进行IP过滤以达到保护主机的目的。

1、安全技术:
        检测与管理系统(Intrusion Detection Systems):
            特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报告和事后监督为主,提供有针对性的指导措施和安全决策依据。一般采用旁路部署方式
        防御系统(Intrusion Prevention System):
            以透明模式工作,分析数据包的内容如:溢出***、拒绝服务***、***、蠕虫、系统漏洞等进行准确的分析判断,在判定为***行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式
        防火墙(FireWall):
            隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略
            一般而然,对一台主机来讲网络通信就是通过网络通信接口设备,一般叫做网卡,通过报文交换来实现
            而主机所谓的防火墙,无非就是对此类的报文通信的来回交换给它予以隔离,称为"防火墙"
            防火墙功能本身是如何具体实施规则的,是需要用户根据自己的实际需求进行设置的
            防火墙防火是靠报文过滤实现的(Packet filter)
            定义一些特殊的访问行为特征

2、防火墙的分类:
        防火墙的分类
            主机防火墙:
                服务范围为当前主机
            网络防火墙:
                服务范围为防火墙一侧的局域网
            硬件防火墙:
                在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,Checkpoint,NetScreen
            软件防火墙:
                运行于通用硬件平台之上的防火墙的应用软件
            网络层防火墙:
                OSI模型下四层
            应用层防火墙/代理服务器:
                代理网关,OSI模型七层

            要想达到识别越透彻目的,所消耗的时间成本就越大,这是必然的
            从平均的角度来讲,因此应用层防火墙和网络层防火墙的主要区别在于:
                网络层防火墙性能好、但是识别的精确度就没有应用层那样高,但是应用层的识别很显然,它们对于时间的消耗或者对用户的访问带来的延迟略大、越长

3、网络型防火墙:
        包过滤防火墙
        网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
        优点:
            对用户来说透明,处理速度快且易于维护
        缺点:
            无法检查应用层数据,如病毒等

iptables防火墙

4、应用层防火墙:
        应用层防火墙/代理服务型防火墙(Proxy Service)
            将所有跨越防火墙的网络通信链路分为两段
            内外网用户的访问都是通过代理服务器上的“链接”来实现
            优点:在应用层对数据进行检查,比较安全
            缺点:增加防火墙的负载
        现实生产环境中所使用的防火墙一般都是二者结合体
            即先检查网络数据,通过之后再送到应用层去检查
            端口代表进程地址

iptables防火墙

iptables的基本认识

1、Netfilter组件:
    内核空间,集成在linux内核中
    扩展各种网络服务的结构化底层框架
    内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
    由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上
2、三种报文流向:
    流入本机:
        PREROUTING --> INPUT-->用户空间进程
    流出本机:
        用户空间进程-->OUTPUT--> POSTROUTING
    转发:
        PREROUTING --> FORWARD --> POSTROUTING
3、防火墙工具
4、iptables
    命令行工具,工作在用户空间
    用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
5、firewalld
    CentOS7 引入了新的前端管理工具
    管理工具:
        firewall-cmd命令行
        firewall-config图形   

iptables的组成

iptables由五个表和五个链以及一些规则组成
    五个表table:
        filter、nat、mangle、raw、security
        filter表:
            过滤规则表,根据预定义的规则过滤符合条件的数据包
        nat表:
            network address translation 地址转换规则表
        mangle:
            修改数据标记位规则表
        raw:
            关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
        security:
            用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
        优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
         conntrack
    五个内置链chain:
        INPUT
        OUTPUT
        FORWARD
        PREROUTING
        POSTROUTING

    表和链的对应关系:
        不同的功能,实现位置是不一样的
            filter:
                INPUT,FORWARD, OUTPUT
            nat:
                PREROUTING, INPUT, OUTPUT, POSTROUTING
            mangle:
                PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
            raw:
                PREROUTING, OUTPUT

    配置文件保存路径
        /etc/sysconfig/iptables
    从指定目录中读取或加载配置文件
        iptables-restore  < /etc/sysconfig/iptables

Netfilter表和链对应关系

iptables防火墙

数据包过滤匹配流程

iptables防火墙

IPTABLES和路由

路由功能发生的时间点
    报文进入本机后
        判断目标主机是否为本机
            是:INPUT
            否:FORWARD
    报文离开本机之前
        判断由哪个接口送往下一跳

iptables防火墙

内核中数据包的传输过程

内核中数据包的传输过程
    当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
    如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
    如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出

    进入,流出
    进入本机:PREROUTING
        目标为本机IP:INPUT
        目标非为本机IP:FORWARD
    流出本机:POSTROUTING
        转发:FORWARD
        本机发出:OUTPUT

    1、进入本机:从PREROUTING进来,然后到达INPUT
    2、转发:从PREROUTING进来,然后送给FORWARD,随后再路由就从选定哪块网卡发出以后,再由网卡离开的时候经由POSTROUTING
    3、本机发出:进入OUTPUT,随后进入POSTROUTING离开本机
    连接追踪机制;
        判定一个出去的报文是不是跟某个进来的请求有关联,如果对进来的某个请求进行响应,就是安全的,如果是本机莫名其妙的连接别人就因为是不安全的,因此我们可以把出行的时候策略设置为拒绝,而且我们也不明确放行任何出去的报文,也就是说跟进来的请求有关联才给予放行,要用到连接机制
    连接追踪,其实就是数据库,在本地保存一个会话数据库、每一次请求来了在数据库里面查下这个请求之前是否有请求记录
    连接追踪是把双刃剑,能帮我们识别连接,但也能够消耗很多系统资源
    面向互联网服务的高并发支撑的服务器一定不要启用连接追踪,除非内存资源足够大,mangle足够宽,否则这个连接是致命的

iptables规则

规则rule:
    根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
    匹配条件:
        默认为与条件,同时满足
        基本匹配:
            IP,端口,TCP的Flags(SYN,ACK等)
        扩展匹配:
            通过复杂高级功能匹配
            隐式扩展:
                TCP, UDP, ICMP
            显示扩展:
                必须明确指定扩展模块进行的扩展
    处理动作:
        称为target,跳转目标
            内建处理动作:
                ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...
            自定义处理动作:
                自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效;
    添加在自定义上不会自动生效
链chain:
    内置链:
        每个内置链对应于一个钩子函数
    自定义链:
        用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效

iptables添加要点

iptables规则添加时考量点
    要实现哪种功能:
        判断添加在哪张表上
    报文流经的路径:
        判断添加在哪个链上
    报文的流向:
        判断源和目的
    匹配规则:
        业务需要
实验环境准备:
    Centos7:
        systemctl stop firewalld.service
        systemctl disable firewalld.service
    Centos6:
        service iptables stop
        chkconfig iptables off

扩展匹配又分为两类:
1、隐式扩展
端口、TCP属于隐式扩展
2、显示扩展:
我们自己必须明确手动指定如何扩展

iptables命令

1、man 8 iptables
        iptables [-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]
2、规则格式:
        iptables[-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname[per-target-options]
3、-t table:
        raw, mangle, nat, [filter]默认
4、SUBCOMMAND:
        1、链管理:
            -N:new, 自定义一条新的规则链
            -X:delete,删除自定义的空的规则链
            -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
                ACCEPT:接受
                DROP:丢弃
            -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
        2、查看:
            -L:
                list, 列出指定链上的所有规则,本选项须置后
            -n:
                numberic,以数字格式显示地址和端口号
                [root@node7 ~]#iptables -vnL 
            -v:
                verbose,详细信息
                 -vv更详细
            -x:
                exactly,显示计数器结果的精确值,而非单位转换后的易读值
            --line-numbers:
                显示规则的序号
            常用组合:
                -vnL
                -vvnxL--line-numbers

                [root@node7 ~]#iptables -vnL --line-number
            -S:
                selected,以iptables-save 命令格式显示链上规则

        3、规则管理:
                -A:
                    append,追加
                -I:
                    insert, 插入,要指明插入至的规则编号,默认为第一条
                -D:
                    delete,删除
                        (1) 指明规则序号
                        (2) 指明规则本身
                -R:
                    replace,替换指定链上的指定规则编号
                -F:
                    flush,清空指定的规则链
                -Z:
                    zero,置零
                iptables的每条规则都有两个计数器
                    (1) 匹配到的报文的个数
                    (2) 匹配到的所有报文的大小之和
5、chain:
        PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
6、匹配条件
        基本:通用的,PARAMETERS
        扩展:需加载模块,MATCH EXTENTIONS
7、基本匹配条件:
        无需加载模块,由iptables/netfilter自行提供
        [!] -s, --source address[/mask][,...]:源IP地址或范围
        [!] -d, --destination address[/mask][,...]:目标IP地址或范围
        [!] -p, --protocol protocol:指定协议,可使用数字如0(all)
            protocol: tcp, udp, icmp, icmpv6,udplite,esp, ah, sctp, mhor“all“
            参看:/etc/protocols
        [!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
        [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链

8、 扩展匹配条件:
        需要加载扩展模块(/usr/lib64/xtables/\*.so),方可生效
9、查看帮助man iptables-extensions
10、隐式扩展:
        在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
    tcp协议的扩展选项
        [!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
        [!] --destination-port,--dportport[:port]:匹配报文目标端口,可为范围
        [!] --tcp-flags mask comp
            mask 需检查的标志位列表,用,分隔
                例如SYN,ACK,FIN,RST
        comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
    udp
        [!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
        [!] --destination-port,--dportport[:port]:匹配报文的目标端口或端口范围

    icmp
        [!] --icmp-type {type[/code]|typename}
            type/code
                0/0 echo-replyicmp应答
                8/0 echo-request icmp请求
    显式扩展:
        必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块   
        [-m matchname[per-match-options]]
11、处理动作:
    -j targetname[per-target-options]
        简单:
            ACCEPT,DROP
        扩展:
            REJECT:
                --reject-with:icmp-port-unreachable默认
            RETURN:
                返回调用链
            REDIRECT:
                端口重定向
            LOG:
                记录日志,dmesg
            MARK:
                做防火墙标记
            DNAT:
                目标地址转换
            SNAT:
                源地址转换
            MASQUERADE:
                地址伪装
            ...
            自定义链:
12、显式扩展:
        必须显式地指明使用的扩展模块进行的扩展
    使用帮助:
        CentOS 6: man iptables
        CentOS 7: man iptables-extensions
    12.1、multiport扩展
        以离散方式定义多端口匹配,最多指定15个端口
        [!] --source-ports,--sports port[,port|,port:port]...
        指定多个源端口
        [!] --destination-ports,--dportsport[,port|,port:port]...
        指定多个目标端口
        [!] --ports port[,port|,port:port]...多个源或目标端口
        示例:
        iptables -A INPUT -s 192.168.137.0/24 -d 192.168.137.56 -p tcp -m multiport --dports 20:22,80,445 -j ACCEPT

    12.2、iprange扩展:
        指明连续的(但一般不是整个网络)ip地址范围
        [!] --src-range from[-to]源IP地址范围
        [!] --dst-range from[-to]目标IP地址范围

        示例:
        iptables -A INPUT -d 192.168.137.56 -p tcp --dport 80 -m iprange --src-range 192.168.137.100-192.168.137.200 -j DROP

    12.3、mac扩展
        指明源MAC地址
        适用于:PREROUTING, FORWARD,INPUT chains
        [!] --mac-source XX:XX:XX:XX:XX:XX
        示例:
            iptables-A INPUT -s 192.168.137.56 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
            iptables-A INPUT -s 192.168.137.56 -j REJECT

    12.4、string扩展
        对报文中的应用层数据做字符串模式匹配检测
            --algo{bm|kmp}字符串匹配检测算法
                bm:Boyer-Moore
                kmp:Knuth-Pratt-Morris
            --from offset 开始偏移
            --to offset 结束偏移
            [!] --string pattern要检测的字符串模式
            [!] --hex-string pattern要检测字符串模式,16进制格式

        示例:
        iptables -A OUTPUT -s 192.168.137.56 -d 0/0 -p tcp --sport 80 -m string --algobm --string “google" -j REJECT

    12.5、time扩展
        根据将报文到达的时间与指定的时间范围进行匹配
            --datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
            --datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]
            --timestarthh:mm[:ss] 时间
            --timestophh:mm[:ss]
            [!] --monthdaysday[,day...] 每个月的几号
            [!] --weekdays day[,day...] 星期几,1 –7 分别表示星期一到星期日
            --kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
            注意:centos6 不支持kerneltz,--localtz指定本地时区(默认)
        示例:
        iptables -A INPUT -s 192.168.137.0/24 -d 192.168.137.56 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

    12.6、connlimit扩展
        根据每客户端IP做并发连接数数量匹配
        可防止CC(Challenge Collapsar挑战黑洞)***--connlimit-upto#:连接的数量小于等于#时匹配
        --connlimit-above #:连接的数量大于#时匹配
        通常分别与默认的拒绝或允许策略配合使用
        示例:
            iptables -A INPUT -d 192.168.137.56 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

    12.7、limit扩展
        基于收发报文的速率做匹配
        令牌桶过滤器
            --limit #[/second|/minute|/hour|/day]
            --limit-burst number
        示例:
        iptables -I INPUT -d 192.168.137.56 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
        iptables -I INPUT 2 -p icmp -j REJECT

    12.8、state扩展
        根据”连接追踪机制“去检查连接的状态,较耗资源

        conntrack机制:
            追踪本机上的请求和响应之间的关系

        状态有如下几种:
            NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
            ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
            RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
            INVALID:无效的连接,如flag标记不正确
            UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

        [!] --state state       
        示例:
        iptables -A INPUT -d 192.168.137.56 -p tcp-m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -s 192.168.137.56 -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 需要加载模块:modprobenf_conntrack

        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_conntracktimeout时间
            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整体命令大体上归并成 iptables [-t table][subcommand][chain][rulenum][rule-specifiacation]
    子命令当中简单归类:
    subcommand
        规则管理:
            增加:-A -I
            修改:-R
            查看:-L
            删除:-D
        链管理:
            自定义:-N
            删:-X
            查:-L
            清空:-F 
            置零:-Z
            重命名: -E
            设定链的默认策略:-P
    对于不同表来讲,可用链不同,究竟把规则放在哪个表的哪个链上,则取决我们对报文请求如何响应发送方向的判别来决定,然后rulenum不同的选项支持不一样

    规则编写时,定义rule-specifiacation时候是如何定义规则的
        rule specifiacation
            常见的两类:
                基本匹配表达式:
                        匹配报文源地址:-s
                        匹配报文目标地址:-d
                        匹配报文四层协议类型:-p
                        匹配报文流入和流出的接口: -i, -o
                扩展匹配表达式:
                    隐式扩展
                    显示扩展

        target

tcp协议的扩展选项

示例:
    --tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
    --tcp-flags SYN,ACK,FIN,RST SYN,ACK
    --tcp-flags ALL ALL
    --tcp_flagsALL NONE
[!] --syn:
    用于匹配第一次握手
    相当于:--tcp-flags SYN,ACK,FIN,RST SYN

iptables简单示例

以下实验的默认ACCEPT都被修改成DROP下进行的 
白名单设置:
    先把ssh远程连接允许连接的IP添加进去
        [root@node7 ~]#iptables -A INPUT -s 192.168.137.0/24 -d 192.168.137.57 -p tcp --dport 22 -j ACCEPT
        [root@node7 ~]#iptables -A OUTPUT -d 192.168.137.0/24 -p tcp --sport 22 -j ACCEPT
    然后把默认允许改成拒绝
        [root@node7 ~]#iptables -P OUTPUT DROP

    删除规则用 -D
    删除INPUT和OUTPUT中的第二条规则,
        [root@node7 ~]#iptables -D INPUT 2
        [root@node7 ~]#iptables -D OUTPUT 2 

    只开放特定web80端口允许访问
        [root@node7 ~]#iptables -A  INPUT -d 192.168.137.57 -p tcp --dport 80 -j ACCEPT
        [root@node7 ~]#iptables -A OUTPUT -s 192.168.137.57 -p tcp --sport 80 -j ACCEPT
    然后通过网页测试或者Linux客户端用curl来访问
        [root@node6 ~]#curl http://192.168.137.57
        welcome dklwj.com
修改规则  -R 
    修改只从指定接口出去
    [root@node7 ~]#iptables -R INPUT 2 -p tcp --dport 80 -i ens33 -j ACCEPT
    [root@node7 ~]#iptables -R OUTPUT 2 -p tcp --sport 80 -o ens33 -j ACCEPT

只允许本机ping别的主机,不允许别的主机ping本机
    [root@node7 ~]#iptables -A OUTPUT -s 192.168.137.57 -o ens33 -p icmp --icmp-type 8 -j ACCEPT
    [root@node7 ~]#iptables -A INPUT -d 192.168.137.57 -i ens33 -p icmp --icmp-type 0 -j ACCEPT

开放多个零散端口
    [root@node7 ~]#iptables -I INPUT -d 192.168.137.57 -i ens33 -p tcp -m multiport --dports 21:22,80,139,445 -j ACCEPT
    [root@node7 ~]#iptables -I OUTPUT -s 192.168.137.57 -o ens33 -p tcp -m multiport --sports 21,22,80,139,445 -j ACCEPT

只允许网段中的其中哪些IP段
    [root@node7 ~]#iptables -I INPUT 2 -d 192.168.137.57 -i ens33 -p tcp --dport 23 -m iprange --src-range 192.168.137.50-192.168.137.60 -j ACCEPT
    [root@node7 ~]#iptables -I OUTPUT 2 -s 192.168.137.57 -o ens33 -p tcp --sport 23 -m iprange --dst-range 192.168.137.50-192.168.137.60 -j ACCEPT
    [root@node7 ~]#iptables -vnL 

过滤网页中的某敏感字符
    [root@node7 ~]#echo this is 1024 > /var/www/html/test.html
    [root@node7 ~]#iptables -I OUTPUT -m string --string "1024" --algo kmp -j DROP

    [root@node6 ~curl http://192.168.137.57
    welcome dklwj.com
    [root@node6 ~]#curl http://192.168.137.57/test.html
基于时间控制访问:
    [root@node7 ~iptables -I INPUT -d 192.168.137.57 -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00  --weekdays Mon,Tue,Wed,Thu,Fri -j DROP
    不过这里的时区是为UTC时区,还得需要用其他模块来控制
    [root@node7 ~]#iptables -R INPUT 1 -d 192.168.137.57 -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --kerneltz --weekdays Mon,Tue,Wed,The,Fri -j DROP
[root@node7 ~]#

设置ssh连接的并发数为2
    [root@node7 ~]#iptables -I INPUT -d 192.168.137.57 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

连接追踪示例:

    先把默认规则改成drop
    [root@node6 ~]#iptables -A INPUT -j DROP 
    [root@node6 ~]#iptables -A OUTPUT -j DROP
    [root@node6 ~]#iptables -A INPUT -d 192.168.137.56 -p tcp -m multiport --dports 22,80,443,139,445 -m state --stete NEW,ESTABLISHED -j ACCEPT
    [root@node6 ~]#iptables -A OUTPUT -s 192.168.137.56 -p tcp -m multiport --sports 22,80,443,139,445 -j ACCEPT

修改除本地接口lo除外其它都拒绝
[root@node6 ~]#iptables -R INPUT 3 ! -i lo -j DROP
[root@node6 ~]#iptables -R OUTPUT 2 ! -o lo -j DROP 

放行ftp服务
    [root@node6 ~]#iptables -I INPUT  1 -d 192.168.137.56 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    [root@node6 ~]#iptables -I INPUT 2 -d 192.168.137.56 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    [root@node6 ~]#iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT

    RELATED是个单独的模块,需要手动加载到内核中去
    [root@node6 ~]#lsmod | grep conntrack
    nf_conntrack_ipv4      15053  5 
    nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
    xt_conntrack           12760  5 
    nf_conntrack          133053  2 xt_conntrack,nf_conntrack_ipv4
    libcrc32c              12644  2 xfs,nf_conntrack
    [root@node6 ~]#modprobe nf_conntrack_ftp
    [root@node6 ~lsmod | grep conntracktp   
    nf_conntrack_ftp       18638  0 
    nf_conntrack_ipv4      15053  5 
    nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
    xt_conntrack           12760  5 
    nf_conntrack          133053  3 xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
    libcrc32c              12644  2 xfs,nf_conntrack
客户端测试:
    [root@node7 ~]#lftp 192.168.137.56
    lftp 192.168.137.56:~> ls
    drwxr-xr-x    2 0        0              19 Oct 22 12:26 pub
    drwxr-xr-x    2 14       50              6 Oct 22 13:11 upload
    lftp 192.168.137.56:/> 

优化规则
[root@node6 ~]#iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@node6 ~]#iptables -R INPUT 2 -d 192.168.137.56 -p tcp -m multiport --dports 21:22,80,443,139,445 -m state --state N -j ACCEPT
[root@node6 ~]#iptables -D INPUT 3
[root@node6 ~]#iptables -D INPUT 3

放行自己出去请求别的服务器的80和443
[root@node6 ~iptables -R OUTPUT 2 -s 192.168.137.56 -p tcp -m multiport --dports 80,443 -m state --state NEW -j ACCEPT

保存和恢复规则:
先保存
[root@node6 ~]#iptables-save > /etc/sysconfig/iptables
然后清空规则
[root@node6 ~]#iptables -F
[root@node6 ~]#iptables -vnL 
Chain INPUT (policy ACCEPT 67 packets, 3568 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 53 packets, 3248 bytes)
 pkts bytes target     prot opt in     out     source               destination         
恢复之前保存的规则
[root@node6 ~]#iptables-restore < /etc/sysconfig/iptables
[root@node6 ~]#iptables -vnL 
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  868 26292 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.137.56       multiport dports 21:22,80,443,139,445 state NEW
    0     0 DROP       all  --  !lo    *       0.0.0.0/0            0.0.0.0/0           

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

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  852 27188 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       192.168.137.56       0.0.0.0/0            multiport dports 80,443 state NEW
    0     0 DROP       all  --  *      !lo     0.0.0.0/0            0.0.0.0/0           
[root@node6 ~]#
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章