Firewall是一种隔离工具,工作于主机或网络的边缘,对经由的报文根据预先定义的规则(识别条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件,主要有以下四种:
硬件防火墙:在硬件级别能部分防火墙,另一部分功能基于软件实现;
软件防火墙:应用软件处理逻辑运行通用硬件实现的防火墙;
主机防火墙:服务范围为当前主机;
网络防火墙:服务范围为局域网;
本文将介绍的是防火墙工具iptables。
1.iptables结构
iptables由五个表和五个链以及一些规则组成:
五个表table:filter、nat、mangle、raw、security:
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包,filter表是默认规则表
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
五个内置链chain:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
对于网络中的报文,分为两种,一种是到本主机的报文,一种是经由本主机的转发报文,对于到本主机的报文,在内核中的传输过程是这样的,首先数据包会PREROUTING进入主机,在内核中进入tcp/ip协议栈,在这里会检查这个数据包的目的ip,查看是否是发送给本主机的,如果是发送给本主机的,会进入INPUT链,
2.iptables基本语法匹配规则
iptables的语法主要有三部分,第一部分是定义操作,第二不会是检查条件,第三步是是处理动作。
首先说一下对链的操作:
-P 定义某张表的某条链的默认策略
-N 新建一条自定义的规则链,但自定义规则链只有在被主链调用时才能生效
-X 删除引用数为0的自定义规则链
-F 清空某张表的某条链,不指定是清空某张表的所有的表规则
-E 重命名某条引用为0的自定义规则链
-L 列出某张表某条链的所以规则,不指定时列出所有的表规则
-v 详细显示表规则
-n 不进行地址解析
操作有以下几个选项:
-A 追加,在某一表的某一条链上追加一条规则
-I 插入,在某一张表的某一条链的特定位置插入一条规则
-D 删除,删除某一个表的某一条链的规则
-R 替换,用某一条规则替换掉某张表的某条规则
检查条件有一下几项:
-s 检查报文中的源ip地址是否符合此处指定的ip地址范围
-d 检查报文中的目的ip地址是否符合此处指定的ip地址范围
-i 检查报文的流入借口
-o 检查报文的流出借口
-p 检查报文的协议是否符合此处指定的协议
1.主链
可以看下面这些例子:
查看filter表的表规则:
我们先保证ssh能够连接,这样不管我们怎么修改,都不会让我们的xshell连接不上,命令如下:
iptables -t filter -A INPUT 1 -d 192.168.123.44/24 -p tcp -i ens34 --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.123.44/24 -p tcp -o ens34 --sport 22 -j ACCEPT
执行结果如下:
然后把默认规则设置为DROP,表的默认规则只能是DROP和ACCEPT,不能是REJECT,命令如下:
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
执行结果如下:
然后访问本机的http服务,命令如下:
curl http://192.168.123.44/hello.html
执行结果如下:
因为防火墙只允许通往192.168.123.44的ssh服务通过,默认策略又是拒绝的,这里访问http服务的包会被丢掉。
我们修改防火墙策略,将http服务设置为允许,命令如下:
iptables -t filter -A INPUT -p tcp -d 192.168.123.44 --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -s 192.168.123.44 --sport 80 -j ACCEPT
分别在centos6(192.168.123.22)和本机(192.168.123.44)访问,结果如下:
centos6:
centos7:
然后开放允许本机访问,命令如下:
iptables -A INPUT -p tcp -s 192.168.123.44 -d 192.168.123.44 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.168.123.44 -s 192.168.123.44 -j ACCEPT
执行结果如下:
防火墙策略入下:
对于访问本机的http服务,数据流是这样的,请求报文开一个随机端口,从OUTPUT链流出,出POSTROUTING链出,从PREROUTING进到INPUT80端口,然后从80出进入随机端口。所有本机访问时要把本机对本机的随机端口的访问打开。
虽然对于白名单和黑名单来说,白名单相对来说安全的多,但是当我们的服务是一个开放的文件共享服务如samba或者http服务,那么白名单就不适合了,黑名单更加实用,而且我们不要把链的默认规则设置为禁止访问,如果这样做,当我们清空防火墙时,会发现我们的ssh也连接不上了。
2.自建链
自建链单独自己是不能生效的,必须要主链调用才能生效,我们可以用下面命令来创建一条自定义链,并且调用他:
iptables -t filter -N can
iptables -A can -j REJECT
iptables -A INPUT -j can
结果如下:
然后本机访问自己的http服务:
一条被调用的自定义链不能被删除,一条有规则的链也不能被删除,只有删除所有的调用,并且清空规则的自定义才能被删除:
3.iptables扩展匹配
基本的扩展规则在对一条普通的报文还可行,但是对于ftp数据包无能为力,同时如果本机有多重服务,每个服务都有大量的访问量时,一条一条的规则匹配会浪费大量的时间,使用扩展匹配条件能够帮助我们减少规则数,提高用户的访问速率。
1.隐式扩展
不用-m选项指出matchname即可使用此match的专用选项进行匹配
1.tcp扩展
--source-port,--sport 端口,--destination-port,--dport 端口,在这里指定-p tcp时隐含包括了-m tcp ;--sport匹配传输层源端口,--dport匹配传输层目的端口,例如:
iptables -t filter -A INPUT -p tcp --dport 20:80 -d 192.168.123.44 -j REJECT
这样20到80的所有端口都不能被访问了,结果如下:
使用ssh和http在centos6(192.168.123.22)上测试,结果如下:
--tcp-flags 标志位列表 必须为1的标志位列表,余下出现在前面的标志位列表必须为0
tcp的几个标志位:SYN,ACK,FIN,RST,URG,PSH;
SYN表示请求序列
ACK回应的序列
FIN表示开始断开
RST复位标志
URG紧急标志位
PSH标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。
例如阻断tcp连接的首次连接:
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
结果如下:
用本机测试http服务:
--syn:
相当于--tcp-flags SYN,ACK,FIN,RST SYN
2.udp扩展
--source-port,--sport port 端口,匹配报文中传输层的源端口
--destination-port,--dport port 端口匹配报文中传输层的目标端口,这里是使用UDP协议时隐含包括了-m udp
3.icmp扩展
icmp扩展,指定-p icmp时,隐含了-m icmp,语法是--icmp-type 报文类型,请求报文类型是8,响应报文类型是0,例如:
在centos7上的INPUT链关闭请求报文,命令如下:
iptables -t filter -A INPUT -p icmp --icmp-type 8 -j REJECT
结果如下:
在centos6(192.168.123.22)上pingcentos7(192.168.123.44)结果如下:
显示到达不了目标主机,可以证明防火墙生效了。
2.显式扩展
必须使用-m选项指出matchname,有的match可能存在专用的选项
1.multiport扩展
multiport扩展的目的是以离散或连续的方式定义多端口匹配条件,语法如下:
--source-ports,--sports port[,port|,port:port]...:指定多个源端口;
--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
--ports port[,port|,port:port]...:指定多个端口;
例如指定目的端口为centos7的20到80还有3306端口,命令如下:
iptables -A INPUT -p tcp -m multiport --dports 20:80,3306 -j ACCEPT
iptables -A INPUT -j REJECT
结果如下:
在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上的ssh服务和http服务:
ssh:
http:
2.iprange扩展
iprange以连续的ip地址范围指明连续的多地址匹配条件,语法如下:
--src-range 地址范围 -------------------用来匹配源IP地址;
--dst-range 地址范围 -------------------用来匹配目标IP地址;
例如允许192.168.123.1-192.168.123.33的地址访问centos7的http服务,命令如下:
iptables -t filter -I INPUT 2 -p tcp -m iprange --src-range 192.168.123.1-192.168.123.33 --dport 80 -j ACCEP
结果如下:
分别在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上访问centos7的http服务:
centos6:
centos7:
3.set扩展
set扩展依赖于ipset命令行工具,set扩展的目的就是解决离散型ip地址的匹配问题,首先是利用ipset生成一个ip地址表,命令如下:
ipset create httplist hash:net maxelem 1000
ipset add httplist 192.168.123.22
执行结果如下:
然后将这张表添加进防火墙规则,命令如下:
iptables -I INPUT 2 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT
-m指定扩展的模块,--match-set指定ip地址表,src/dst指定是源海市目的地址列表
结果如下:
分别在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上访问centos7的http服务:
centos6:
centos7:
4.string扩展
string扩展是对报文中的应用层数据做字符串匹配检测,语法为:
--string pattern:要检测字符串模式;
--algo {bm|kmp}
例如我们对centos7上的hello.html网站进行过滤,命令如下:
iptables -I INPUT 2 -p tcp -m string --algo bm --string hello -j REJECT
结果如下:
使用本机访问hello.html:
5.time扩展
time扩展是用来指定在规定时间内才能访问该主机,例如下面的命令:
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--monthdays day[,day...]
--weekdays day[,day...]
--kerneltz:使用内核中配置的时区
6.connlimit扩展
--connlimit-upto n:连接数数量小于等于n,此时应该允许;
--connlimit-above n:连接数数量大于n,此时应该拒绝;
7.limit扩展
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number:峰值速率
8.state扩展
4.保存,重载和优化
iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/FROM/SOME_RULE_FILE
CentOS 6:
保存规则:
service iptables save
自动保存规则至/etc/sysconfig/iptables文件中;
重载规则:
server iptables restore
从/etc/sysconfig/iptables文件中重载规则;
规则优化:
(1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
(2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;
(3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;
(4) 设置默认策略;
(a) 最后一条规则设定;
(b) 默认策略设定;
原文地址:http://blog.51cto.com/13412442/2310896