Firewall 工作于主机或网络边缘,对进出的报文根据定义的规则作出检查,进而分为两类。iptables用来写规则并发送到netfilter,netfilter最终生效,netfilter是真正的防火墙。

    主机防火墙

        工作于内核的tcp/ip协议栈上,只为本机作过滤。

    网络防火墙

        工作于网络进出口,为网络中的主机来往数据报文做过滤,匹配到的报文作相应处理的一种套件。

IDS: Intrusion Detect System ***检测系统。监控进程的行为,如果可疑行为做出相应的动作。

        HIDS:host ids

        NIDS :  network ids 

IPS : Intrusion protect system ***防御系统

HoneyPot : 蜜罐,

bt : backtrack 专为安全的linux发行版

    nessus:安装评估工具

    nmap:网络扫描工具

 

网络层防火墙,

应用层网关。  


写规则前需要:

1,确定功能(表)

2,确定报文流向 

3,确定要实现的目标   ,

4 ,  确定匹配条件

优化规则: 尽量减少规则条目,彼此不相关的规则把匹配机会较多的放在上面,属于同一功能的规则把精确匹配的放在上面。


iptables工作于传输层,网络层,链路层的防火墙。iptables是让用户生成规则,发送给工作于内核TCP/IP协议栈上的netfilter,真正实现报文过滤的是netfilter。

netfilter的五个钩子函数(5个链)

    INPUT:到达本机内部报文必经之路

    OUTPUT:同本机发出报文的必须之路

    FORWARD:经过本机转发的报文必经之路。

    PREROUTING : 路由前,进入本机报文最先经过的链

    POSTROUTING:路由后,从本机出去报文最后经过的链


规则的功能: 4 张表

    raw:主要目标是,让用户的请求经过nat时,nat表上启用connetion_track功能,关闭连接追踪功能

    mangle : 修改tcp/ip报文中首部的参数

    nat:地址转换

        SNAT

        DNAT

        PNAT

    filter:定义是否允许通过防火墙的规则


filter :  INPUT, OUTPUT, FORWARD

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

mangle : PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD

raw : POSTROUTING, OUTPUT



iptables 检查语法后把规则送往 netfilter,规则立即生效。写之前先放行自己的ssh会话。iptables的规则文件 在/etc/sysconfig/iptables.

    保存目前生效的iptables规则,会覆盖之前文件中的规则。

        1, iptables-save > /etc/sysconfig/iptables

        2,   service iptables save

    生效规则文件中的规则,会清空现运行的规则,而使规则文件中的规则生效。

        1,  iptables-restore < /etc/sysconfig/iptables

        2,  service iptables restart

------------------------------------------------------------------------------------------

语法格式:

        iptables [-t TABLE]   COMMAND   CHAIN  CRETIRIA   -j  TARGET

                -t TABLE 指定表

                    net , mangle , raw , filter 

                COMMAND,命令分为管理类,对规则做管理类,查看类

                     对链做管理

                            -F  (flush)清空规则链

                                # iptables -t net -F PREROUTING 

                            -N  (new)自建一条链

                                # iptables -t filter -N http_input         

                            -X   (delete)删除一条自定义的空链,并且链没有被引用。

                                # iptables -X http_input

                            -Z   (zero)把计数器归零

                                # iptables -t filter -Z

                            -P   (policy)设定链默认策略,对filter默认为ACCEPT或DROP

                                # iptables -t filter -P INPUT DROP

                            -E    (rename)重命名自定义链

                                 # iptables -E  http_input web_input


                      对链中的规则做管理

                            -A (append)附加规则,此规则位于最后面。用来添加规则。

                            -I  (insert)插入一条新规则,可以指定位置,如果不指定会放在第一条

                            -D (delete)删除规则

                                   # iptables -t filter -D INPUT 1       删除第一条规则

                            -R    (replace)替换规则

                                   # iptables -t filter -R OUTPUT  -s 172.16.100.7 -d 172.16.0.0/16 -o eth0 -p tcp -sprot 22 -j ACCEPT


                      查询链中的规则

                            -L 列出链中的规则

                                    -n  是数据字地址显示主机地址和端口

                                    -v   显示详细

                                    -vv  更详细

                                    -vvv    更更详细

                                    --line-numbers  显示规则编号

                                    -x   显示精确值,不对计算器做单位换算,直接显示精确值。

                        #iptables  -L -v -x --line-numbers

-------------------------------------------------------------------------------------------

            匹配条件

                通用匹配

                     -s ip :检查报文源ip地址,匹配的范围。可以是ip也是可以是网络地址。!表示取反

                     --src    --source  与-s一样

                           # iptables -A INPUT -s 172.16.2.0 -p tcp --dport 22 -j ACCEPT

                     -d ip  : 检查报目标ip地址,匹配的范围。可以是ip也是可以是网络地址。!表示取反

                       --dst   --destination    与-d一样

                           # iptables -A OUTPUT -d 172.16.2.5 -p tcp --sport 22 -j ACCEPT

                     -p 协议 : 指定匹配报文的协议类型。一般有三种  tcp  udp  icmp

                     -i  网卡名  : 指定数据报文流入的接口,可用的链有: PREROUTTING INPUT  FORWARD

                     -o 网卡名 : 指定数据报文流出的接口 ,可用的位置有: OUTPUT , FORWARD , POSTROUTTING

               

                 扩展匹配,调用netfilter额外模块实现特殊检查机制。


                    隐式扩展:当使用-p {tcp|upd|icmp} 中的一种时,可以直接使用扩展专用箕。

                            -p tcp

                                --sport PORT :指定源端口,可以是一个端口范围[80-100]

                                --dport PORT :指定目标端口

                                --tcp-flags  后面格式,第一段是要检查标志位列表,用逗号分隔 。 第二位是必须为1的标志们,也用逗号分隔。如果第二段没有指定,则标志位必须为0.

                                        # iptables -I INPUT -p tcp --tcp-flags all all -j DROP    tcp标志位全为1的

                                        # iptables -I INPUT  -p -tcp --tcp-flags all none -j DROP   tcp标志为全为为的

                                        # iptables -I INPUT -P -tcp -tcp-flags --syn   只有syn为一的可以通过

                            -p udp

                                --sport PORT :指定源端口,可以是一个端口范围

                                --dport PORT :指定目标端口

                            -p  icmp [-m icmp]

                                --icmp-type

                                    0 : ping 响应

                                    8 : ping 请求

                                示例:只允许本机ping另人,不允许其它主机ping本机。检查icmp报文的类型实现。

                                    # iptables -A OUTPUT  -p icmp --icmp-type 8 -j ACCEPT

                                    # iptables -A INPUT  -p icmp --icmp-type 0 -j ACCEPT


                        显示扩展 : 必须明确说明使用那个模块做扩展,而后才使用其扩展专用选项

                            -m  告诉iptables调用那个模块。

=========================================================================================

-------------------------------------------------------------------------------------------

                                 multiport:多端口匹配,可用于匹配非连续或连续端口,一次最多可以指定15个端口

                                     专用选项

                                            --source-ports ,  --sports           指定多个源端口,不连续端口使用逗号分隔,连接使用冒号分隔

                                            --destination-ports , -dports           指定多个目标端口

                                            --ports                                   源和目标都匹配

                                    例如:放行22号端口和80号端口

                                        #iptables -I INPUT  -d 172.16.100.7 -p tcp -m multiport -dports 22,80 -j ACCEPT

                                        # iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport -sports 22,80 -j ACCEPT

-------------------------------------------------------------------------------------------

                                       iprange   匹配指定范围内的地址,或一段连续的地址而非整个网络

                                           [!] --src-range

                                            --dst-range

                                            例如:只允许172.16.2.0到172.16.2.30使用ssh协议访问管理本机

                                                # iptables -A INPUT  -d 172.16.2.16 -p tcp --dport 22 -m iprange --src-range 172.16.2.0-172.16.2.30 -j ACCEPT

                                                # iptables -A OUTPUT -s 172.16.2.16 -p tcp --sport 22 -m iprange --dst-range 172.16.2.0-172.16.2.30 -j ACCEPT

-------------------------------------------------------------------------------------------

                            string: 字符串匹配,能够检测报文应用层中字符串过滤。

                                         字符串比较高效算法有 kmp , bm

                                          专用选项

                                                --algo {kmp|bm}  比较时使用的算法

                                                --string "string"    指定要检查的字串。效率较底。

                                                --hex-string "HEX_STRING"    指定检查内容为转换成16进制的字串。与string只出现一次就行。

                                    例如:从本机出去的数据中,包含了wukui字符串的的网页文件都不让通过。

                                        # iptables -I OUTPUT -m string --algo kmp --string "wukui" -j DROP

-------------------------------------------------------------------------------------------

                          state    状态检查,可以对tcp,udp,icmp协议做状态检查。

调整连接追踪功能所能容纳连接最大值的内核参数文件 :/proc/sys/net/nf_conntrack_max.

当前追踪的所有连接的记录文件   /proc/net/nf_conntrack  

不同协议连接类型的属性位于   /proc/sys/net/netfilter 目录中所有文件


                                NEW:新建立第一个会话的第一次请求,tcp udp icmp都适用,但连接追踪保存时间不一样。

                                ESTABLISHED:已建立的连接

                                RELATED:有关联关系的连接

                                INVALID:无法识别的连接

                            示例: 只允许10.0.0.0/8 ping能172.16.0.0/16 ,而不允许 172.16.0.0/16 ping通 10.0.0.0/8 .FORWARD链默认为DROP

                                 # iptables -A FORWARD -d 10.0.0.0/8 -s 172.16.2.13 -m state --state ESTABLISHED -j ACCEPT

                                # iptables -R FORWARD 1 -d 172.16.0.0/16 -s 10.0.0.0/8 -m state --state ESTABLISHED,NEW -j ACCEPT

                            示例2,为ftp服务打开连接。

                                #  modprobe nf_conntrack_ftp     需要此模块来识别通信进程的关联。一般不用装载。

                                        注意: 这种写法在重启后会失效,如果重启后想生效,需要修改配置文件(/etc/sysconfig/iptables-config) 或都把iptables写成一个脚本,在启动系统时自动执行脚本。

                                # iptables -A INPUT -s 172.16.2.16 -p tcp --dport 21 -m state --state NEW -j ACCEPT

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

                                # iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-------------------------------------------------------------------------------------------

                            limit   做速率限制

                                专用选项

                                    --limit N [/second|/mminute|/hour|/day]    每多长时间可以发多少个包

                                    --limit-burst N     此前没有发送数据包,第一次来最多可以一次发多少个数据包。

                                        示例:# iptables -R FORWARD 1 -m limit --limit 60/second --limit-burst 500 -j ACCEPT     前提是FORWARD链默认规则为DROP

-------------------------------------------------------------------------------------------

                            time   做时间段访问限制

                                    --datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]    指定起始日期和时间

                                    --datestop                指定结束日期和时间

                                    --timestart hh:mm[:ss]     指定起始的时间,仅能指定时间。

                                    --timestop                    指定结束时间

                                    --weekdays day[,day]            指定以星期几限定

                                            Mon,Tue,

                                例如:每周一周二和周四周五的早上8点20到下午的18点40只不允许访问本机的80端口

                                    # iptables -A INPUT -d 172.16.2.16 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j DROP

-------------------------------------------------------------------------------------------

                            connlimit: 连接数据限制,对每个IP所能够发起并发连接数做限制

                              专用选项:  

                                    --connlimit-above N   ,连接小于设定,放行,超出限定,超出部分drop

                                  示例: 经过本机转发,为一个ip最多转发3个ping进程,超出全部DROP

                                            # iptables -A FORWARD -p icmp -m connlimit --connlimit-above 3 -j DROP

-------------------------------------------------------------------------------------------

            处理目标

                内置目标

                        DROP 丢弃,没有返回值

                        REJECT  拒绝通过,但会给请求一个返回值

                        ACCEPT  允许通过

                        RETURN:一般用于在自定义链最后没有匹配到报文时返回主链继续做处理的命令。

                            例如: iptables -A http_in -j RETURN

                        自定义的链:在-j 后面加上链的名称。


-------------------------------------------------------------------------------------------

NAT 网络地址转换

    在做源地址转换时,只需要配置数据包发向公网方向的包,不用配置公网返回的数据包,配置好出去的包后,系统会自动关联出去与回来包的关系。

       

        SNAT : 源端口转换

            --to-source : 用来指定转换到那个源地址,通常是本地可以连接外接的公网ip

            # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.2.16

        MASQUERADE :当使用ADSL括号上网时,被转换的公网地址不确定。使用SNAT无法灵活指定,就需要使用此功能了,它也是SNAT的一种。它会自动把每次ADSL括号得到的地址做为源地址的。但是它的开销要比SNAT大,它每次转换时都会判断自己的那个地址可以用作转换地址。

            # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

        DNAT:目标地址转换

            # iptables -t nat -A PREROUTING   -j DNAT  -to-destination 192.168.1.10

        PNAT:端口地址转换,一般是转换目标方向的端口和IP

             # iptables -t nat -A PREROUTING  -p tcp --dport 80 -j DNAT  -to-destination 192.168.1.10:8080

        FULL NAT : 全地址转换,会把源地址和目标主机都转换。一般用在负载均衡上。