首页 > 代码库 > NETFILTER/IPTABLES

NETFILTER/IPTABLES

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 [-t TABLE]   COMMAND   CHAIN  CRETIRIA   -j  TARGET

                -t TABLE 指定表

                    net , mangle , raw , filter

                COMMAND

                     对链做管理

                            -F  (flush)清空规则链

                            -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     需要此模块来识别通信进程的关联。一般不用装载。

                                # 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:一般用于在自定义链最后没有匹配到返回主链的命令。

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

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