个人博客地址:http://www.pojun.tech/ 欢迎访问
关于什么是防火墙,凡是接触过计算机的朋友应该都会了解。在现代计算机通信中,有很多的安全技术,防火墙就是其中最基本的一种。
同时,防火墙具备一些有效的隔离功能,能够对经过防火墙的网络包按照一定的规则进行检查,从而控制网络包的进入进出,以达到限制网络访问的一些目睹,这其中最著名的莫过于我们的长城防火墙(GFW)。
今天我们要讨论的就是,作为一种安全技术,防火墙是如何实现控制网络通信的。当然,我们是基于CentOS上的防火墙进行的讨论,并且仅限于命令上的使用,并不切入到内核代码的实现。
防火墙实际应用的场景有很多,根据不同的场景可以大致有如下几个分类:
- 主机防火墙:服务范围为当前主机
网络防火墙:服务范围为防火墙一侧的局域网
根据防火墙的实现方式,可以划分为下面两种:
硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,Checkpoint,NetScreen
软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
而根据防火墙工作的协议栈的层次,可以划分为下面几种;
网络层防火墙:OSI下面第三层
- 应用层防火墙/代理服务器:代理网关,OSI七层
关于每种类型防火墙的工作特点,以及不同种类防火墙之间的区别,不是此文介绍的重点,大家可以自行上网查阅。
Linux操作系统,在内核级别就已经集成了防火墙功能,也就是Netfilter组件。而我们在日常生产中使用的iptables则是系统提供给我们的软件工具而已。
CentOS 操作系统用来管理防火墙的软件工具是iptables,而在CentOS 7 中,系统又提供了更为强大的firewalld 工具。二者的使用方式相似,都是将写好的规则送往netfilter,告诉内核如何去处理信息包。但是在使用的过程中一定要注意,iptables 和 firewalld 二者用其一就好,避免冲突。
防火墙的的过滤规则由4个规则表(filter、nat、mangle、raw)和5个内置链(INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING)组成。
四个规则表的功能,各有不同
- filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
- nat表:network address translation 地址转换规则表
- mangle:修改数据标记位规则表
- Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
优先级由高到低的顺序为:raw–>mangle–>nat–>filter
四个规则表与五个内置链之间的包含关系则如下图所示。(图片转自网络)
既然每张规则表都包含一定的数据链,那么数据是如何流转的呢,可以参考如下图片。(图片转自网络)
上面的数据流转过程,可能并不能很好的表达整个数据流的流转的过程,那么可以参考一下下面的这张图,或许就能够有一个清晰的认识。
下面是各个规则表,与内置链之间更复杂的关系图表(右击,在新标签页中打开,可查看大图)。
图片转载自 维基百科—https://en.wikipedia.org/wiki/Netfilter
前面已经说过,CentOS 7 中可以用来设置防火墙规则的工具有iptables和firewalld,二者用哪个都行,我们就简要iptables的相关操作。
iptables 的命令格式 如下
iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions]
下面对命令中的选项以及相关指令加以说明。
-t table:
指明要操作的是哪张表。 raw, mangle, nat, [filter]默认。
SUBCOMMAND:
链管理:
-N:new, 自定义一条新的规则链
-X:delete,删除自定义的空的规则链
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT和DROP
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除查看:
-L:list, 列出指定鏈上的所有规则,本选项须置后
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息 -vv 更详细 -vvv 更更详细 … 以此类推
-x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
–line-numbers:显示规则的序号规则管理
-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
-D:delete,删除,可以根据规则序号,也可以根据规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空指定的规则链
-Z:zero,置零chain:
就是指的PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING 这五张表。
匹配条件 [-m matchname [per-match-options]]
基本匹配条件:[]表示里面的内容可以省略
[!] -s, –source address[/mask][,…]:源IP地址或范围
[!] -d, –destination address[/mask][,…]:目标IP地址或范围
[!] -p, –protocol protocol:指定协议,可使用数字如0(all)protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp等
[!] -i, –in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
[!] -o, –out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链。扩展匹配条件
扩展匹配条件需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效,可以使用man iptables-extensions
的方式去查看扩展条件,部分参考选项如下所示。
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为范围
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
[!] --syn:用于匹配第一次握手,相当于:--tcp-flags SYN,ACK,FIN,RST SYN
1、multiport扩展
指定多个源端口
[!] --source-ports,--sports port[,port|,port:port]...
指定多个目标端口
[!] --destination-ports,--dports port[,port|,port:port]...
多个源或目标端口
[!] --ports port[,port|,port:port]...
2、irange扩展
指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
3、mac扩展
指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
4、string扩展
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
[!] --string pattern:要检测的字符串模式
[!] --hex-string pattern:要检测字符串模式,16进制格式
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...] 星期几
6、connlimit扩展
根据每客户端IP做并发连接数数量匹配
--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配
7、limit扩展
基于收发报文的速率做匹配
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
8、state扩展
[!] --state state
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
处理动作 -j targetname [per-target-options]
简单的动作如:ACCEPT(接受)、DROP(丢弃)
扩展的动作:
- REJECT:–reject-with:icmp-port-unreachable默认
- RETURN:返回调用链
- REDIRECT:端口重定向
- LOG:记录日志,dmesg
- MARK:做防火墙标记
- DNAT:目标地址转换
- SNAT:源地址转换
- MASQUERADE:地址伪装
防火墙的规则在定义之后,会立即生效,但是主机重启之后,就会将防火墙的规则进行重置了。所以如果想要保存住自己制定的防火墙的规则的话,可以将防火墙规则保存在本地。重启之后,再将规则重置就好。
CentOS 7 中保存和重置防火墙规则的命令如下:
# 保存防火墙规则
iptables -S > /PATH/TO/SOME_RULES_FILE
iptables-save > /PATH/TO/SOME_RULES_FILE
# 恢复防火墙规则
iptables-restore < /PATH/FROM/SOME_RULES_FILE
综上,我们就对防火墙的进行了一个基本的介绍,但是实际生产中,防火墙的使用则是纷繁复杂的,我们应该根据自己的实际情况制定相应的规则。