标签:linux 防火墙 解决方案 iptables 数据包
Linux之Iptables总结及应用
一、防火墙、Iptables简介
1、防火墙是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。常见的有三、四层的防火墙,叫网络层的防火墙(这层对源地址和目标地址进行检测),还有7层防火墙,其实是代理层的网关(对源端口或者目标端口,源地址或者目标地址进行检查)。
2、Iptabels简介:netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
iptables的前身叫ipfirewall (内核1.x时代),从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
工作在用户空间,定义规则的工具,本身并不算是防火墙。定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter(网络过滤器)。因此真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
在内核空间中选择了5个位置:
1)内核空间中:从一个网络接口进来,到另一个网络接口去的
2)数据包从内核流入用户空间的
3)数据包从用户空间流出的
4)进入/离开本机的外网接口
5)进入/离开本机的内网接口
这5个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1)PREROUTING (路由前) ##对数据包作路由选择前应用此链中的规则,注意:记住!所有的数据包进来的时侯都先由这个链处理
2)INPUT (数据包流入口) ##进来的数据包应用此规则链中的策略
3)FORWARD (转发管卡) ##转发数据包时应用此规则链中的策略
4)OUTPUT(数据包出口) ##外出的数据包应用此规则链中的策略
5)POSTROUTING(路由后)##对数据包作路由选择后应用此链中的规则,注意:所有的数据包出来的时侯都先由这个链处理
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链
3、规则链之间的优先顺序有三种情况:
1)入站数据流向:从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
2)转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
3)出站数据流向:防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
二、Iptables工作机制
1、iptables数据包传输过程如下图:
说明
1)当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
2)如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
3)如果数据包是要转发出去的,且内核允许转发,数据包就会如上图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出
2、iptables规则表和链关系
iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
注意一定要明白这些表和链的关系及作用,详见下图:
规则表说明:
1)filter表(过滤数据包 内核模块:iptables_filter)——三个链:INPUT、FORWARD、OUTPUT
2)Nat表(用于网络地址转换(IP、端口) 内核模块:iptable_nat)——三个链:PREROUTING、POSTROUTING、OUTPUT
3)Mangle表(修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle)——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
4)Raw表(决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw)——两个链:OUTPUT、PREROUTING
规则表之间的优先顺序:
Raw——mangle——nat——filter
三、iptables基本用法
启动动脚本:/etc/init.d/iptables {start|stop|restart|save}
save是将写好的规则保存到/etc/sysconfig/iptables,下次启动时会去读取此文件中的规则。也可使用iptables-save重定向到某个文件中,下次可以使用iptables-restore命令来导入规则。
1)基本语法:
iptables [-t TABLE] COMMAND CHAIN [RULE] [-j TARGET]
常见参数选项
-t:指明处理的表名,默认是filter
-A|-D|-I|R:增加、删除、插入、替换匹配的规则,后面是对应要处理的链名
-F:刷新规则库
-Z:清空计数器
-N|-X|-E:自己创建、删除、重命名一个链
-P:设置默认策略,经常用来设置黑名单、白名单
-L:列出对应表的防火墙规则,可以使用以下子选项
-n:以数字形式显示ip地址和端口号
-v -vv -vvv:显示信息的详细程度
-x:精确显示匹配到的包数和包的字节数
--line-numbers:列出每个规则的序列号
--modprobe=command:可以通过这个加载必要的模块
2)匹配条件的说明:
通用的匹配条件
-s:指明报文的源地址
-d:指明报文的目的地址
-p:指明报文的协议
-i:指明报文的进入的网卡,与INPUT链一起使用
-o:指明报文出去的网卡,与OUTPUT一起使用
注:每个选项前面都可以加 !来取反
扩展匹配
扩展匹配:隐式扩展、显式扩展,隐式扩展是 -p 指定协议的补充说明,显式扩展是用 -m 来指定特定的其他扩展选项。
常见隐式扩展:
tcp协议的扩展选项:
--sport:指定源端口,udp协议也同样适用
--dport:指定目标端口,udp协议也同样适用
--tcp-flags:指明tcp报文中的状态时,格式:--tcp-flags mask(要检查的状态值) comp(为1的状态值),可以设置的状态值有SYN ACK FIN RST URG PSH ,ALL表示所有的状态,NONE表示所有没有设定
如:--tcp-flags ALL ALL 检查所有状态都为1
--tcp-flags ALL NONE 检查所有状态都为0
--syn只检查SYN状态标志位为1
icmp协议常见扩展:
icmp-type:icmp报文的类型,常见的有0和8,0代表响应报文,8代表请求报文。
常见显式扩展:
iprange:指明ip范围的
--src-range:指明源地址的范围
用法:--src-range from[-to] 例如:--src-range 192.168.1.1-192.168.1.24
--dst-range:指明目标地址的范围,用法同--src-range相同
multiport:指明多端口,只能用于tcp和udp协议
--sports:指明多个源端口
例如:--sports 21,22,80,53
--dports:指明多个目标端口
--ports:指明多个端口,这些端口包括源端口和目标端口
connlimit:限定连接的并发数
--connlimit-above:同一客户端的连接并发数
--connlimit-msak:指明客户端的有掩码位数(prefix length)
limit:限制传输速率的
--limit-rate:限制传输速率的的
用法:--limit rate[/second|/minute|/hour|/day]
--limit-brust:brust是令牌桶,里面存放的是令牌的个数。简单的来说,客户端只用得带令牌才可以传输数据,此令牌数会累加
string:过滤字符串的
--algo:指明匹配字符串的加密类型 kmp和bm(根据人名命名的)
--string:指明匹配的字符串
--hex-string:匹配的字符串使用十六进制形式给出
--from:指明匹配字符串的开始处,默认是0
--to:指明匹配字符串的结束处,默认是65535
time:限定时间和日期
--datestart:起始日期,格式:YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop:截止日期,格式同上
--timestart:起始时间,格式是:hh:mm[:ss]
--timestop:截止时间,格式同上
--weekdays:指定星期数:Mon, Tue, Wed, Thu, Fri, Sat,Sun 也可以使用1-7
--monthdays day:指明一个月中的特定天数,1-31都可以使用
state:指明连接的状态
--state:指明连接状态,状态有:
NEW:新建立的连接
ESTABLISHED: 已建立的连接
RELATED: 关联的连接
INVILID:表示无效的状态
recent: 阻挡大量的请求,例如可以防止DOS的攻击
3)在内核里面维护了地址列表,这个列表可以通过--set, --rcheck, --update and --remove四种方法来修改列表。--set, --rcheck, --update and --remove 是相互排斥的,不可同时使用。recent模块个规则有返回值(布尔值),为真会执行 -j 指定的动作。
--set:将地址添加到地址列表中,包含地址的时间戳
--name:指定地址列表的名字,默认是DEFAULT
--rsource --rdest:指明当前的规则是应用到数据包的源地址还是目标地址,默认是源地址
--rcheck:检查地址是否在地址列表中
--remove:删除地址列表中的
--update:和rcheck作用一样,但他会刷新时间戳
--hitcount:指定时间内的命中数(在地址列表中匹配的次数),必须与-rcheck和--update同时使用
--seconds:用法:--seconds n (限制数据包里的地址记录到地址列表里的时间要小于n) ,必须与-rcheck和--update同时使用
4)目标:
一般有-j选项指定,常见的有:DROP,ACCEPT,REJECT,DNAT,SNAT,MASQUERADE,RETRUN,MARK,LOG
DROP,ACCEPT,REJECT常用与过滤数据包
DNAT,SNAT,MASQUERADE用在地址转换的模块
DNAT常与--to-destination一起使用,指明目标地址转换的地址
SNAT常与--to-source一起使用,指明目标地址转换的地址,但有时这个地址是动态获取的,所以就要借助于MASQUERADE来动态指明要转换的地址
RETRUN:是跳转,通常用在自定义的链上,在自义链中无法匹配报文时,将其返回主链
LOG:是定义日志功能的,常见的选项有 --log-prefix (用于在日志信息中标注信息)、 --log-level(用于指明日志的级别)
四、练习巩固
注意:以下练习iptables防火墙INPUT和OUTPUT默认策略为DROP;
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
# iptables -t filter -A INPUT -d 192.168.2.5 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.2.5 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT-s 192.168.2.5 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给192.168.2.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个
# iptables -t filter -R INPUT 2 -d 192.168.2.5 -s 192.168.2.0/24 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
# iptables -t filter -R INPUT 3 -d 192.168.2.5 -s 192.168.2.0/24 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.2.5 -s 192.168.2.0/24 -p tcp -m state --state ESTABLISHED -j ACCEPT
# iptables -t filter -A OUTPUT -d 192.168.2.0/24 -s 192.168.2.5 -p tcp -m state --state ESTABLISHED -j ACCEPT
3、开放本机的ssh服务给192.168.2.10-192.168.2.20中的主机,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
# iptables -t filter -A INPUT -d 192.168.2.5 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 192.168.2.10-192.168.2.20 -m limit --limit 2/min -j ACCEPT
# iptables -t filter -A INPUT -d 192.168.2.5 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 192.168.2.10-192.168.2.20 -j ACCEPT
# iptables -t filter -A OUTPUT -s 192.168.2.5 -p tcp --sport 22 -m iprange --dst-range 192.168.2.10-192.168.2.20 -m state --state ESTABLISHED -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
# iptables -t filter -A INPUT -d 192.168.2.5 -p --tcp-flags ALL ALL -j DROP
5、允许本机ping别的主机;但不开放别的主机ping本机;
# iptables -A INPUT -p icmp --icmp-type 8 -d 192.168.2.5 -j DROP
# iptables -A OUTPUT -p icmp --icmp-type 0 -s 192.168.2.5 -j ACCEPT
本文出自 “一万小时定律” 博客,请务必保留此出处http://daisywei.blog.51cto.com/7837970/1713246
标签:linux 防火墙 解决方案 iptables 数据包
原文地址:http://daisywei.blog.51cto.com/7837970/1713246