本文共 6277 字,大约阅读时间需要 20 分钟。
Firewall是一种隔离工具,工作于主机或网络的边缘,对经由的报文根据预先定义的规则(识别条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件,主要有以下四种:
硬件防火墙:在硬件级别能部分防火墙,另一部分功能基于软件实现; 软件防火墙:应用软件处理逻辑运行通用硬件实现的防火墙;主机防火墙:服务范围为当前主机;网络防火墙:服务范围为局域网;
本文将介绍的是防火墙工具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:
INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING
对于网络中的报文,分为两种,一种是到本主机的报文,一种是经由本主机的转发报文,对于到本主机的报文,在内核中的传输过程是这样的,首先数据包会PREROUTING进入主机,在内核中进入tcp/ip协议栈,在这里会检查这个数据包的目的ip,查看是否是发送给本主机的,如果是发送给本主机的,会进入INPUT链,
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 caniptables -A can -j REJECTiptables -A INPUT -j can
结果如下:
然后本机访问自己的http服务:一条被调用的自定义链不能被删除,一条有规则的链也不能被删除,只有删除所有的调用,并且清空规则的自定义才能被删除:基本的扩展规则在对一条普通的报文还可行,但是对于ftp数据包无能为力,同时如果本机有多重服务,每个服务都有大量的访问量时,一条一条的规则匹配会浪费大量的时间,使用扩展匹配条件能够帮助我们减少规则数,提高用户的访问速率。
不用-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的标志位列表,余下出现在前面的标志位列表必须为0tcp的几个标志位: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 udp3.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)结果如下:显示到达不了目标主机,可以证明防火墙生效了。必须使用-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 ACCEPTiptables -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 1000ipset 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扩展iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/FROM/SOME_RULE_FILECentOS 6: 保存规则: service iptables save 自动保存规则至/etc/sysconfig/iptables文件中; 重载规则: server iptables restore 从/etc/sysconfig/iptables文件中重载规则; 规则优化: (1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接; (2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面; (3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面; (4) 设置默认策略; (a) 最后一条规则设定; (b) 默认策略设定;
转载于:https://blog.51cto.com/13412442/2310896