firewall:防火墙,隔离工具,工作于主机或网络的边缘,对进出本主机或网络的报文根据事先定义好的规则做匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件。在报文的必经之处设置卡点,用规则去匹配。

        iptables/netfilter,防火墙在内核中实现,iptables是规则管理工具。iptables有四表五链,添加规则考量点:1、要实现那种功能:判断添加在那张表上。2、报文流经的路径:判断添加在那个链上。规则是从上到下过滤的,匹配范围小的放在上面,匹配频率大的放在上面。必要时合并规则,设置默认策略。

        关闭连接追踪功能,它会占用大量内存,会导致访问被拒绝。

        功能的优先级次序:raw --> mangle --> nat --> filter

链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

        流入:PREROUTING --> INPUT

        流出:OUTPUT --> POSTROUTING

        转发:PREROUTING --> FORWARD --> POSTROUTING

        这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

        1、PREROUTING (路由前)

        2、INPUT (数据包流入口)

        3、FORWARD (转发关卡)

        4、OUTPUT(数据包出口)

        5、POSTROUTING(路由后)

021217_0051_2.png

iptables

iptables命令:

语法:iptables -t table 选项 链 规则 -j 目标,iptables [-t table] option chain rule -j target

        -t         table filter,nat,mangle、raw

        -F         flush清空规则链。

        -N        new创建新的自定义链。

        -X        drop删除自定义链

        -Z        zero 清零

        -P        policy 为指定链设置默认策略,accept接受报文,drop丢弃报文,reject拒绝报文,用大写

        -E        rename重命名自定义链

        -A        append 将新规则追加与链的尾部

        -I         insert 插入到特定链位置

        -D       delete删除链指定规则,1、指定匹配条件 2、指定规则编号

        -R        replace 替换指定链上的规则

        -L        list 列出指定链上的所有规则,-n 不反解,以数字格式显示端口,-v 显示详细信息,-x exactly精确的,--line-numbers 显示规则编号

-t table

        filter:     INPUT,FORWARD,OUTPUT

        nat:       PREROUTING(DNAT),OUTPUT,POSTROUTING(SNAT)

        mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

        raw:      PREROUTING,OUTPUT

基本匹配:

       [!] -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      jump至指定的TARGET

               ACCEPT:     接受

               DROP:        丢弃

               REJECT:      拒绝

               RETURN:    返回调用链

               REDIRECT:  端口重定向

               LOG:           记录日志

               MARK:        做防火墙标记

               DNAT:        目标地址转换

               SNAT:         源地址转换

               MASQUERADE:地址伪装

       自定义链:由自定义链上的规则进行匹配检查


加入某条规则:

        例:iptables -t filter -A INPUT -d 192.168.96.128 -p tcp -j ACCEPT,访问本机的tcp协议都放行。在input链路加入规则,使用-s表示源地址,这里代表任意的地址所以可以省略。-A表示追加。

    0     0 ACCEPT     tcp  --  *      *       192.168.96.128       0.0.0.0/0           

        例:iptables -t filter -A OUTPUT -s 192.168.96.128 -p tcp -j ACCEPT,本机跟任何主机通信都允许出去。这里的源表示本机,目标任意可以省略,-A追加,-p为TCP协议,-j跳转到目标为接受。

    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.96.128      

        例:iptables -I INPUT -d 192.168.96.134 -p tcp --dport 22 -j ACCEPT,指定端口进入

        例:iptables -I OUTPUT -s 192.168.96.134 -p tcp --sport 22 -j ACCEPT,指定端口放行


删除某条规则:

        使用命令 iptables -L -n --line-number 查看规则,再用 iptables -D INPUT 1


multiport扩展:同时指定多个端口

        [!] --source-ports,--sports port[,port|,port:port]...            指明多个源端口,感叹号表示取反

        [!] --destination-ports,--dports port[,port|,port:port]...    指明多个离散的目标端口

        [!] --ports port[,port|,port:port]...                                      指定多个端口

        例:iptables -I INPUT -s 192.168.96.0/24 -d 192.168.96.128 -p tcp -m multiport --dports 22,80 -j ACCEPT

        例:iptables -I OUTPUT -d 192.168.96.0/24 -s 192.168.96.128 -p tcp -m multiport --sports 22,80 -j ACCEPT


iprange扩展:指明连续的ip地址范围,但一般是不能扩展为整个网络,

        [!] --src-range from[-to]        指明连续的源IP地址范围

        [!] --dst-range from[-to]        指明连续的目标IP地址范围

        例:iptables -I INPUT -d 192.168.96.128 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.96.1-192.168.96.180 -j ACCEPT

        例:iptables -I OUTPUT -s 192.168.96.128 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 192.168.96.1-192.168.96.180 -j ACCEPT


string扩展:匹配报文中指定的字符串

        --algo {bm|kmp}     指定算法,bm = Boyer-Moore,kmp = Knuth-Pratt-Morris

        [!] --string pattern  指定正则

        例:iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT


time扩展:根据时间进行匹配

        --datestart 

        --datestop

        --timestart

        --timestop

        --monthdays

        --weekdays

        例:iptables -I INPUT -d 192.168.96.128 -p tcp --dport 80 -m time --timestart 7:00 --timestop 8:00 -j REJECT


connlimit扩展:每个客户端的并发量

        --connlimit-above n      连接的数量大于n

        --connlimit-upto n        连接的数量小于等于n

        例:iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT


limit扩展:基于收发报文的速率做检查

        令牌桶过滤器

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

        --limit-burst number

        例:iptables -A INPUT -d 192.168.96.128 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT


state扩展:根据连接追踪机制检查连接的状态

        调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_conntrack_max

        已经追踪到并记录下的连接:/proc/net/nf_conntrack

        不同协议或连接类型追的时长:/proc/sys/net/netfilter/

        可追踪的连接状态:

                NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求

                ESTABLISHED:NEW状态之后,已建立的连接;连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态

                RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系

                INVALIED:无法识别的连接

        使用格式:

                --state STATE1,STATE2,...

        对某端口做连接追踪:

        iptables -I INPUT -d 192.168.96.128 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

        iptables -I OUTPUT -s 192.168.96.128 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

        对ping做连接追踪:

        iptables -A INPUT -d 192.168.96.128 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT

        iptables -A OUTPUT -s 192.168.96.128 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT


合并规则:将能够进来的连接都能够放行出去,这样就可以将上面的多条规则合并为一条。

        出口:iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT

        入口:iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT

        iptables -I INPUT -d 192.168.96.128 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT


放开被动模式的ftp服务:

        问题的关键在于ftp服务分为控制连接和数据连接,在服务器角度控制连接是被动连接,数据连接是主动连接,也是相关连接,所以要将RELATED状态的连接放行。

1、装载ftp追踪时的专用的模块:

        modprobe nf_conntrack_ftp

2、放行请求报文:

        命令连接:NEW, ESTABLISHED

        数据连接:RELATED, ESTABLISHED

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

        iptables -A INPUT -d 192.168.96.128 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

3、放行响应报文:ESTABLISEHD

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


保存与导入规则

        保存:iptables-save > /root/iptables

        导入:iptables-restore < /root/iptables

CentOS 6中还可以使用如下命令:

        service iptables save ,相当于:iptables-save > /etc/sysconfig/iptables

        service iptables restart,相当于:iptables-restore < /etc/sysconfig/iptables


firewalld工具:

        在CentOS 7中引入了firewalld工具,可以不适用,不使用的方法是将firewalled停掉,systemctl disable firewalld.service,systemctl stop firewalld.service。在CentOS 7上任然可以使用iptables工具。


开机自动加载防火墙规则:

        使用service iptables save保存规则。iptables不是服务,重启iptables只是重新加载规则,在脚本/etc/init.d/iptables中定义了这个规则的路径。我们不用修改这个脚本文件,只要修改iptables的配置文件即可,配置文件为/etc/sysconfig/iptables-config,在这个配置文件中你那个将自动装载模块填写到 IPTABLES_MODULES="nf_conntrack_ftp" 中,多个模块使用空格分格。