一.防火墙概念
(一)安全技术介绍
(1) 入侵检测与管理系统(Intrusion Detection Systems)
- 特点:是不阻断任何网络访问,量化、定位来自内外网络的威胁情 况,主要以提供报告和事后监督为主,提供有针对性的指导措 施和安全决策依据。一般采用旁路部署方式,主要起到监视的作用。
(2)入侵防御与管理系统(Intrusion Prevention System)
- 特点:以透明模 式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木 马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行 为后立即予以阻断,主动而有效的保护网络的安全,一般采用 在线部署方式,所谓的透明的工作模式就是不阻止正常网络的访问,只是针对有攻击特性的网络访问进行防御
(3)防火墙( FireWall ):
- 特点:隔离功能,工作在网络或主机边缘, 对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上 的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略
(二)防火墙的分类
- 主机防火墙:服务范围为当前主机
网络防火墙:服务范围为防火墙一侧的局域网
硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一 个部分功能基于软件实现,Checkpoint,NetScreen 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
网络层防火墙:OSI下面第三层
应用层防火墙/代理服务器:代理网关,OSI七层
(三)网络型的防火墙
网络层防火墙
- 包过滤防火墙
- 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑 ,被称为访问控制列表(ACL),通过检查数据流中每个数据的 源地址,目的地址,所用端口号和协议状态等因素,或他们的组 合来确定是否允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等 例如应用层发来一个50k的病毒数据包,但是网络层的mtu的分片大小只有1500个字节,将病毒数据包分割成很多片,所以无法整合辨析该数据包的类型,也就无法分析是否为病毒数据包
(四)应用层的防火墙
- 应用层防火墙/代理服务型防火墙(Proxy Service)
将所有跨越防火墙的网络通信链路分为两段
内外网用户的访问都是通过代理服务器上的“链接”来实现
优点:在应用层对数据进行检查,比较安全
缺点:增加防火墙的负载
注意:所谓代理服务防火墙就是防火墙本身会起到代理作用,也就是说当企业内部要访问外部浏览器时,是通过代理服务器防火墙来实现,代理服务器代替用户去访问外部浏览器,而不是转发,这是和路由器工作机制的区别- 在实际应用中,应用层防火墙和网络层防火墙是相结合的,既先在网络层中检查网络数据,然后送到应用层去检查数据包的安全性
二.iptables的基本认识
- 在内核空间,集成在linux内核中,属于netfilter组件
- 扩展各种网络服务的结构化底层框架
- 内核中选取五个位置放了五个hook(勾子) function(INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING), 而这五个hook function向用户开放,用户可以通过一个命令工 具(iptables)向其写入规则
- 由信息过滤表(table)组成,包含控制IP包处理的规则集( rules),规则被分组放在链(chain)上
- 三种报文流向:
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING- 防火墙工具,iptables本身并不是防火墙,而是一种防火墙工具软件
iptables
命令行工具,工作在用户空间
用来编写规则,写好的规则被送往netfilter,告诉内核如何去处 理信息包
(二)iptables的组成
- iptables由四个表和五个链以及一些规则组成
四个表table:filter、nat、mangle、raw
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
优先级由高到低的顺序为:raw-->mangle-->nat-->filter
五个内置链chain
INPUT OUTPUT FORWARD PREROUTING POSTROUTING
(1)Netfilter表和链对应关系
数据包过滤匹配流程
(2)IPTABLES和路由
- 路由功能发生的时间点
报文进入本机后
判断目标主机是否为本机
是:INPUT
否:FORWARD
报文离开本机之前
判断由哪个接口送往下一跳
内核数据包的传输过程
当数据包进入网卡时,首先进入prerouting进行检测,来判断该数据包的目的Ip是否发送本机的,如果是发往本机的,就会进入input链,本机进程处理数据后,就会通过output链将数据发送出去,最后经过postrouting发送出去
如果经过判断数据包的目的ip不是发送本机的,而是转发到别的主机时,则会将数据包送到forward链中,经过内核同意后,流入到postrouting后转发出去
(3)iptables规则
- 规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文 根据规则定义的处理动作作出处理
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
扩展匹配:通过复杂高级功能匹配
处理动作:称为target,跳转目标
内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT MASQUERADE,MARK,LOG...
自定义处理动作:自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效;添加在自定义上不会自动生效
链chain: 内置链:每个内置链对应于一个钩子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规 则组织管理机制;
只有Hook钩子调用自定义链时,才生效
(4)iptables添加要点
- iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上
报文流经的路径:判断添加在哪个链上
报文的流向:判断源和目的
匹配规则:业务需要
链上规则的次序,即为检查的次序,因此隐含一定的法则
同类规则(访问同一应用),匹配范围小的放上面
不同类规则(访问不同应用),匹配到报文频率较大的放上面
将那些可由一条规则描述的多个规则合并为一个
设置默认策略
实验环境准备:
Centos7: systemctl stop firewalld.service systemctl disable firewalld. service
Centos6:service iptables stop; chkconfig iptables off
三.iptables命令的应用
首先通过 man 8 iptables去了解一些相关命令的应用
扩展应用 man 8 iptables-extensions来了解
iptables -vnL和iptables -vnL -t 指定表来查看
(1)filter表中规则的使用
例: iptables -t filter -A INPUT -s 192.168.136.134 -j DROP
解释说明—:-t指定表(不写默认为使用filter表),-A代表增加规则,增加input链,-s代表源地址,-j跳转,将源地址丢弃,就是禁止源地址的访问
当清除策略后,会再次ping通 iptables -F清除策略
ping 成功
同样用ssh和curl也可以进行测试,其中-j DROP 也可以改为REJECT,拒绝的更直接
iptables -vnL --line-numbers 显示规则序号
iptables -I INPUT -s 192.168.136.133 -j ACCEPT——I代表插入的意思,直接加到iptbales表中的第一行,A代表追加,加到最后一行
指定加到第几行:iptables -I INPUT 2 -s 192.168.136.111 -j ACCEPT——将规则放到第二行
删除命令: iptables -D INPUT 6——指定删除第五行命令
iptables 匹配条件分类
(1)基本匹配条件:通用条件,不要额外加载模块,在iptables/netfilter中提供
1.-s --source address指定源地址:iptables -A INPUT -s 192.168.136.0/24 -j REJECT,整个网段都拒绝,但是注意设置策略的时候不要将自己也拒绝掉,所以要注意设置的策略
也可以一次写两个地址: iptables -A INPUT -s 192.168.136.170,192.168.136.180 -j REJECT
iptables -A INPUT !-s 192.168.136.180 -j REJECT——加入叹号代表除了180的地址都被拒绝
! -s 192.168.136.0/24 ——除了这个网段都被拒绝
2.-d --destination address 指定目标地址: iptables -A INPUT -s 172.18.254.242 -d 172.18.0.107 -j REJECT——指定目标地址
3.-p --protocol protocol 指定规定协议:protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp 参看:/etc/protocols
例: iptables -A INPUT -p icmp -j REJECT——规定icmp协议被拒绝,无法使用Ping命令测试网络连通性
但是并不影响别的协议的应用
注意:一般情况下很少拒绝tcp协议,因为tcp协议对应的端口和包含的命令很复杂
4.-i --in-interface name 报文流入的接口;只能应用于数据 报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
例: iptables -A INPUT -i eth0 -p icmp -j REJECT:拒绝从eth0这个网卡的ip的icmp协议,如果有两个网卡的话,另一个网卡的icmp协议不被禁止
5.-o --out-interface name:报文流出的接口;只能应用于数 据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
例: iptables -A OUTPUT -i eth0 -p icmp -j REJECT:拒绝output链的输出
(2)扩展匹配条件:需要加载模块来实现,MATCH EXTENTIONS
- 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so) ,方可生效 查看帮助 man iptables-extensions
1.隐式扩展方式:在使用-p选项指明了特定的协议时,无需再用-m选项 指明扩展模块的扩展机制,不需要手动加载扩展模块
(1)tcp协议的扩展选项
[!] --source-port, --sport port[:port]:匹配报文源端口, 可为端口范围
[!] --destination-port,--dport port[:port]:匹配报文目标 端口,可为范围
[!] --tcp-flags mask comp mask 需检查的标志位列表,用,分隔
例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须 为0,用,分隔
例: iptables -A INPUT -p tcp --dport 80 -j REJECT
示例:
--tcp-flags SYN,ACK,FIN,RST SYN 表示要检查 的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余 下的必须为0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
--tcp-flags ALL ALL ——不存在这种包,为错误数据包
--tcp_flags ALL NONE——同上
[!] --syn:用于匹配第一次握手 相当于:--tcp-flags SYN,ACK,FIN,RST SYN
例:iptables -A INPUT -p tcp --syn -j REJECT——第一次握手被拒绝,拒绝新的连接,但是旧的连接不会断开
无法连接
(2)udp
[!] --source-port, --sport port[:port]:匹配报文的 源端口;可以是端口范围
[!] --destination-port,--dport port[:port]:匹配报 文的目标端口;可以是端口范围
应用协议:dns和DHCP使用udp协议
(3) icmp
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
例:iptables -A INPUT -p icmp --icmp-type 8 -j REJECT——拒绝请求包,也就说明回应包也被拒绝
2.显式扩展:必须使用-m选项指明要调用的扩展模块的扩展 机制,要手动加载扩展模块 [-m matchname [per-match-options]]
(1)multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]... 指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口
[!] --ports port[,port|,port:port]...多个源或目标端口
例:iptables -A INPUT -s 192.168.136.134 -p tcp --mutiport --dports 22,80 -j REJECT
(2)iprange扩展 指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
iptables -A INPUT -m iprange --src-range 192.168.136.134-192.168.136.180 -p tcp -m --mutiport --dports 22,80 -j REJECT
(3)mac扩展 指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
例:iptables -A INPUT -m mac --mac-source 00:0c:29:67:c2:8b -p tcp-m --mutiport --dports 22,80 -j REJECT
(4)string扩展 对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
[!] --string pattern:要检测的字符串模式
[!] --hex-string pattern:要检测字符串模式,16进制格式
iptables -A OUTPUT -m string --algo bm --string "magedu" -j REJECT
(5)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:内核时区,不建议使用,CentOS7系统默认为UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
例:iptables -A OUTPUT -m time --timestart 01:00 --timestop 09:30 string --algo bm --string "magedu" -j REJECT——在这个时间段无法访问magedu.com,超过这个时间后就可以访问
更加完全的设置:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun
(6)connlimit扩展
根据每客户端IP做并发连接数数量匹配
可防止CC(Challenge Collapsar挑战黑洞)攻击
--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配 通常分别与默认的拒绝或允许策略配合使用
示例:iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 1 -j REJECT
解释:阻止并发连接的次数,不论是哪个源地址并发连接的次数都不能超过一次,超过一次以上就被拒绝,拒绝的是tcp端口的22端口,拒绝ssh的连接
第二次连接就会被拒绝
(7)limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
例:
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT——配合上述命令使用,代表含义是不符合上述条件的都被拒绝,而且该规则的位置应该在上述规则的下面,否则全都被拒绝,一定要注意顺序问题
(8)state扩展
根据”连接追踪机制“去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的 相关信息条目,因此,将其识别为第一次发出的请求 ESTABLISHED:NEW状态之后,连接追踪信息库中为 其建立的条目失效之前期间内所进行的通信状态 RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系 INVALID:无效的连接,如flag标记不正确 UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
例:
iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT:此规则的定义代表原来的连接保持
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j REJECT:新建立的SSH连接就拒绝
两个规则的定义一般配合使用,并且最好是旧连接的规则定义写在前面,新新建立的连接协议写在后面,这样节省资源
已经追踪到的并记录下来的连接信息库 /proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量 /proc/sys/net/nf_conntrack_max
调整最大连接数量:
vim /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
调整连接超时时间:
net.netfilter.nf_conntrack_tcp_timeout_established = 300 ——建立连接时间最大为300s
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 ——建立连接的等待时间
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 ——关闭连接的等待时间
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 ——通知对方等待关闭连接的时间
不同的协议的连接追踪时长 /proc/sys/net/netfilter/
注意:CentOS7 需要加载模块: modprobe nf_conntrack
lsmod |grep nf_conf——查看加载的模块
开放被动模式的ftp服务
(1) 装载ftp连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config
配置文件 IPTABLES_MODULES=" nf_conntrack_ftp "
加载 modproble nf_conntrack_ftp模块
(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
设置规则:
iptables -A INPUT -s 192.168.136.1 -j ACCEPT——先保证windows的连接
ipatbles -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT——接受已经建立的连接和相关联的连接
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT——新建立的连接,并走21目标端口的tcp协议接受连接
iptables -A INPUT -j REJECT——其他连接全部拒绝
设置完成后,进行测试
在另一台主机上:ftp 192.168.136.170
其他协议无法访问:curl 192.168.136.170
Target:
ACCEPT, DROP, REJECT, RETURN
LOG, SNAT, DNAT, REDIRECT, MASQUERADE,..
LOG: 非中断target,本身不拒绝和允许,放在拒绝和允许规则前
并将日志记录在/var/log/messages系统日志中
--log-level level 级别: emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix 日志前缀,用于区别不同的日志,最多 29个字符
例:
iptables -I INPUT -s 192.168.136.134 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections:"
在客户端用curl命令测试一下
补:相关链管理的应用:
-N:new, 自定义一条新的规则链
iptables -N deny_invalid_packect
iptables -A deny_invalid_packect -p tcp --tcp-flags ALL ALL -j REJECT——将标记位都是1的连接跳转到deny链中,进行匹配检查
iptables -A deny_invalid_packect -p tcp --tcp-flags ALL NONE -j REJECT——将标记位都是0的连接跳转到deny链中,进行匹配检查
iptables -A INPUT -s 192.168.136.0/24 -j deny_invalid_packect——将INPUT链与自定义的链相关联,只要下次有源地址来访问,就跳转到自定义规则中进行检查匹配
-X:delete,删除自定义的空的规则链
删除不能直接ipatbles -X deny_invalid_packect
iptables -F deny_invalid_packect
iptables -F INPUT
iptables -X deny_invalid_packect
练习:
iptables -N deny_icmp_ssh——建立新的规则链
iptables -A deny_icmp_ssh -s 192.168.136.134 -p tcp --dport 22 -j REJECT——设定规则,只要是192.168.136.134这个主机的tcp协议来访问本机的22端口就拒绝
ipatbles -A deny-icmp_ssh -s 192.168.136.180 -p icmp -j REJECT——只要是192.168.136.180这个主机来访问就禁止Ping命令
ipatbles -A INPUT -s 192.168.136.134,192.168.136.180 -j deny_icmp_ssh——input与自定义链相关联,只要是这两个ip来访问就跳转到自定义的链上,并分析后拒绝对应的ssh连接和ping
-P:Policy,设置默认策略;
对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
如果将默认策略改为DROP
iptables -P INPUT DROP
此时无法用ipatbles -F来进行清空,因为设置的是新的默认链且为drop,如果想要修改就要通过iptables -P INPUT ACCEPT来修改回来
如果一定要设置一个默认的拒绝规则可以通过 iptables -A INPUT -j REJECT来实现,并且该规则也可以通过ipatbles -F来清空
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名, 也不能被删除