防火墙的概念
入侵检测与管理系统(Intrusion Detection Systems): 特点是阻断任何网络访问,量化,定位来自内外网络的威胁情况,主要以提供报告和事后监督为主,提供有针对性的的指导措施和安全决策依据.一般采用旁路部署方式
入侵检测系统(Intrusion Prevertion System): 以透明模式工作,分析数据包的内容: 溢出攻击,拒绝服务攻击,木马,蠕虫,系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式
防火墙(Firewall): 隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时定义的行为进行处理的一组规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是在默认的情况下关闭所有的通过型访问,只开放允许访问的策略
防火墙的分类:
主机防火墙: 服务范围为当前主机
网络防火墙: 服务范围为防火墙一侧的局域网
硬件防火墙: 在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如Checkpoing,NetScreen
软件防火墙: 运行于通用硬件平台上的防火墙的应用软件
网络层防火墙: OSI下面三层
应用层防火墙/代理服务器: 代理网关,OSI七层
网络型防火墙
包过滤防火墙
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每一个数据的源地址,目标地址,所用的端口和协议等状态等因素,或他们的组合来确定是否允许该数据包通过
优点: 对用来说透明,处理速度快且易于维护
缺点: 无法检查应用层数据,如病毒等
应用层防火墙
应用层防火墙/代理服务器(Proxy Service)
将所有跨防火墙的网络通信链路分为两段
内外网用户的访问都是通过代理服务器上的"链接"来实现
优点: 在应用层对数据进行检查,比较安全
缺点: 增减防火墙的负载
在现实生产中所使用的防火墙一般都是二者的结合,即先检查网络数据,通过后再送到应用层去检查
在linux中,防火墙的是在有Netfilter组件实现的
Netfilter组件
在内核空间,继承与linux内核中
扩展各种网络服务的结构化底层框架
内核选取5个位置放置五个hook(钩子)function(INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables,firewalld)向其写入规则
由信息过滤表(table)组成,包含控制IP包处理规则集(rules),规则被分组放在chain上
由此我们可以规定数据包的的三种流向:
流入本机: PREROUTING --> INPUT --> 用户空间
流出本机: 用户空间 --> OUTPUT --> POSTROUTING
转发: PREROUTING -->FORWARD --> POSTROUTING
四个表table: filter, nat, mangle, raw
filter表: 过滤规则表,根据预定义的规则过滤符合条件的数据包
nat: network address translation 地址转换规则表
mangle: 修改数据标记为规则表
raw: 关闭nat表上启用的连接追踪机制,加快封装包穿越防火墙速度
优先级: raw --> mangle --> nat --> filter
五个内置的链(chain),即上面提到的钩子函数
INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING
路由发生的时刻
报文进入本主机后
判断目标主机
报文发出之前
判断经由哪个接口送往吓一跳
2 iptables命令的使用
iptables规则
组成部分 报文的匹配条件 匹配到后处理动作
匹配条件 根据协议报文特征指定
基本匹配条件
扩展匹配条件
处理动作
内建处理机制
自定义处理机制
注意 报文不会经过自定义链 只能在内置链上通过规则进行引用后生效
iptables-save > /path/to/file #可以将现在的防火墙规则保存到指定文件
ipstables-restore < /path/to/file #可以将保存到文件中的防火墙规则重新导入
iptables [-t table] SUBCOMMAND CHAIN CRETERIA(规则) -j TARGET
-t
filter nat mangle fraw 默认是filter
链管理
-F flush 清空规则链 省略链 表示清空指定表上的所有链
-N new 自定义规则链 创建自定义的规则链
-X delete 删除用户自定义的规则链(必须是空的),并切其他链没有和它关联
-Z zero 清零 置零规则计数器
-P policy 为指定链设置默认策略 对filter表中的链而言,默认策略通常有ACCEPT,DROP,REJECT
-E rEname 重命名自定义链 引用计数不为零的自定义链 无法改名 也无法删除
规则管理
-A append 将规则追加到指定链的尾部
-I insert 将规则插入到指定的链的指定位置
-D delete
两种指定规则
1 指定匹配条件
2 指定规则编号
-R replace 替换指定链上的指定规则
查看
-L list 列出指定链上的所有规则
-n numberic 以数字格式显示地址和端口
-v verbose 显示详细信息
-vv -vvv
--line-numbers 显示规则行号
-x exactly 精确值
目标 jump 跳转
-j TARGET jump至指定的TARGET
ACCEPT 接受
DROP 拒绝
REJECT 强烈的拒绝
REDIRECT 端口重定向
LOG 记录日志
MARK 做防火墙标记的
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址伪装
RETURN 返回指定的链
-s ,--src ,--source IP | NETaddr 检查报文的源地址是否符合此处指定的地址范围
-d ,--dst ,--destination IP |NETaddr 检查报文的目标地址是否符合此处指定的地址范围
-p ,--protocol {tcp|udp|icmp} 检查报文中的协议,即ip首部中的protocol所标识的协议
-i ,--in-interface IFACE 数据报文的流入接口 仅能用于PREROUTING INPUT及FORWARD链上
-o ,--out-interface IFACE 数据报文的流出接口 仅能用于POSTOUTING OUTPUT及FORWARD链上
iptables -t filter -A INPUT -d 172.18.23.60 -p tcp -j ACCEPT # 接受目标地址到172.18.23.60 tcp协议的请求
iptables -A INPUT -d 172.18.23.60 -p icmp -j ACCEPT #接受到172.18.23.60的icmp协议请求
iptables -A INPUT -d 172.18.23.60 -i eth0 -j ACCEPT #接受到172.18.23.60并且是从eht0接口进来的请求
iptables -A INPUT -d 172.18.23.60 -j DROP # 最后设置一个默认规则
-m 指明要是用扩展匹配 match_name --space_options
例如 -m tcp --dport 22 匹配tcp的22端口
隐式扩展 对 -p protocol 指明的协议进行的扩展,可省略-m 选项
-p tcp
--dport PORT[-PORT] 目标端口,可以是单个端口,也可以是多个端口
iptables -A INPUT -d 172.18.23.60 -p tcp --dport 22 -j ACCEPT(开启22)
iptables -A OUTPUT -s 172.18.23.60 -p tcp --sport 22 -j ACCEPT
iptables -A INPUT -d 172.18.23.60 -p tcp --dport 80 -j ACCEPT(开启80)
iptables -A OUTPUT -s 172.18.23.60 -p tcp --sport 80 -j ACCEPT
--tcp-flags: LIST1 LIST2 检查list1所指明的所有标志位,且其中 list2所表示出的所有标记位必须为1 而余下的必须为0 没在list1中指明的,不做检查
SYN,ACK,FIN,RST,PSH,URG
请求同步 确认号有效 断开 重置 推送 紧急指令(更快)
--tcp-flags SYN,ACK,FIN,RST SYN 和 --syn 参数一样效果
--tcp-flags ALL ALL 所有位都为1
--tcp-flags ALL NONE 所有位都为0
-p udp
--dport
--sport
-p icmp
--icmp-type
0 echo-reply
8 echo-request
iptables -A OUTPUT -s 172.18.23.60 -p icmp --icmp-type 8 -j ACCEPT #本机请求
iptables -A INTPUT -d 172.18.23.60 -p icmp --icmp-type 0 -j ACCEPT #其他主机回应本机
显式扩展 必须使用-m选项指定使用的扩展
centos 6 man iptables,手册
centos 7 man iptables-extensions,手册
1 multiport 多端口匹配 [!] 可以使用
以离散方式定义多端口匹配,最多指定15个端口
--source-ports, --sports port...
--destination-ports, --dports port...
iptables -I INPUT -s 172.18.0.0/16 -d 172.18.23.60 -p tcp -m multiport --dports 20,80 -j ACCEPT
2 iprange扩展 [!]
指明连续的(但一般不能扩展为整个网络) IP地址范围时,使用
--src-range from 指明连续的源ip地址范围
--dst-range from 指明连续的源ip地址范围
iptables -I INPUT -d 172.18.23.60 -p -tcp -m multiport --dports 22:23,80 -m iprange -src-range 172.18.100.0-172.18.150.0 -j ACCEPT
3 string扩展
检查报文中的出现的字符串
--algo{bm|kmp}
bm=boyer-moore
kmp=knuth-pratt-morris
--string=pattern 可以使用表达式
iptables -I OUTPUT -m string --algo bm --string "movie" -j REJECT #根据协议报文匹配到的字符进行控制(不支持加密协议)
4 time 扩展
根据报文到达的时间与指定的时间范围进行匹配
--datastart
--datastop
--timestart
--timestop
--monthsdays
--weekdays
centos6 默认使用的是本地时间,centos7 使用的UTC时间
iptables -I INPUT -d 172.18.23.60 -p tcp --dport 80 -m timestart 14:00 --timestop 16:00 -j REJECT # 在14:00-16:00之间拒绝到172.18.23.60服务
5 connlimit 连接限制
根据没客户端ip(也可以是地址块)做并发连接的匹配
--connlimit-above n 链接数量大于n
--connlimit-upto n 链接数量小于等于n
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
6 limit 扩展
基于收发报文的速率进行检查
iptables -A INPUT -d 172.18.23.60 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
iptables -A OUTPUT -s 172.18.23.60 -p icmp --icmp-type 0 -j ACCEPT
7 state扩展
根据连接追踪机制检查连接时状态
调节连接追踪功能能够容纳的最大连接数量
cat /proc/net/nf_conntrack
已经追踪并记录下的连接
/proc/net/nf_conntrack
不同协议或连接类型追踪的时长
/proc/sys/net/netfilter
可追踪的连接状态,不同于http协议的有限状态机
NEW 新发出的请求 连接追踪模板不存此链接相关的信息条目,因此 将其识别为第一次发出的请求
ESTABLISHED NEW 状态之后,连接追踪模块为其建立的条目失效之前期间所进行的通信的状态
RELATED 相关的连接 如ftp协议命令连接与数据连接的之间的关系
INVALIED 无法识别的连接
需要指定特定的模块,即state的模块
如何开放ftp的 防火墙
如果有必要需手动安装nf_conntack_ftp.io
1 装载专用模块
insmod nf_conntrack_ftp.so
2 放行请求报文
命令连接 NEW,ESTABLISHED
数据连接 RELATED,ESTABLISHED
iptables -A INPUT -d 172.18.23.60 -p tcp --dport 21 -m state --state NEW,ESTABLISHED - j ACCEPT
iptables -A INPUT -d 172.18.23.60 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
3 放行响应报文
iptables -A OUTPUT -s 172.18.23.60 -p tcp -m state --state ESTABLISHED -j ACCEPT
8 log的扩展:记录日志,方便后期做检测
-j LOG --log-levle level --log-prefix "connect:"
iptables -I INPUT -s 172.18.0.0/16 -p tcp -m multimport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: "
nat 安全性 完成隐藏本地主机的目的 network address translation 网络层或传输层实现
proxy 代理 应用层
redirect #实现端口转发
nat
SNAT 只修改请求报文的源地址 在POSTROUTING 位置实现
DNAT 只修改请求报文的目标地址 在PREROUTING 位置实现
pnat 端口映射,防止nat的服务,端口冲突,发出去的报文无法回来,地址冲突
redirect 端口转发
iptables -t nat -A PREROUTING -d ip -p tcp -m multiport --dports port1,port2 -j REDIRECT --to-ports 80
网关设置 nat 转换
iptables -t nat -A POSTROUTING -s 192.168.150.0/24 -d ! 192.168.150.0/24 -p tcp --dport 80 -j SNAT --to-source 172.18.23.60(有服务的外网主机)
iptables -t nat -APREROUTING -d 172.18.23.60 -p tcp --dport 80 -j DNAT --to-destionation ip(有服务的内网主机)
ssh
iptables -t nat -A PREROUTING -d 172.18.23.60 -p tcp --dport 22 -j DNAT --to-destination ip(有ssh服务器的主机)
端口映射
iptables -t nat -A PREROUTING -d 172.18.23.60 -p tcp --dport 80 -j DNAT --to-destination ip:8080
iptables -t nat -A PREROUTING -d 172.18.23.60 -p tcp --dport 22 -j DNAT --to-destination ip:222
adsl 拨号 ip 地址会经常改变
iptables -t NAT POSTROUTING -s 192.168.150.0/24 -d ! 192.168.150.0/24 -j MASQUERADE 地址伪装
网友评论