Linux 防火墙管理
防火墙介绍
防火墙( FireWall ),工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略,将希望外网访问的主机放在 DMZ(demilitarized zone)网络中。
防火墙类型
按保护范围划分:
- 主机防火墙:服务范围为当前一台主机。
- 网络防火墙:服务范围为防火墙一侧的局域网。
按实现方式划分:
- 硬件防火墙:在专用硬件级别实现防火墙功能,例如华为、华三、天融信等产品。
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,例如iptables,firewalld。
按网络协议划分:
- 网络层防火墙 :工作在OSI 模型下四层,又称为包过滤防火墙。
- 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过。
- 优点:对用户来说透明,处理速度快且易于维护。
- 缺点:无法检查应用层数据,如病毒等。
应用层防火墙/代理服务器:工作在OSI 模型七层或者承担proxy 代理网关。
- 异常检测协议:Web应用防火墙会对HTTP的请求进行异常检测,拒绝不符合HTTP标准的请求。它也可以只允许HTTP协议的部分选项通过,从而减少攻击的影响范围。
- 增强的输入验证:可以有效防止网页篡改、信息泄露、木冯植入等恶意网络入侵行为。从而减小Web服务器被攻击的可能性。
- 及时补丁:修补Web安全漏洞,是Web应用开发者最头痛的问题,没人会知道下一秒有什么样的漏洞出现,会为Web应用带来什么样的危害。现在WAF(Web Application Firewall)可以为我们做这项工作了:只要有全面的漏洞信息WAF能在不到一个小时的时间内屏蔽掉这个漏洞。当然,这种屏蔽掉漏洞的方式不是非常完美的,没有安装对应的补丁本身就是一 种安全威胁,但我们在没有选择的情况下,任何保护措施都比没有保护措施更好。
- 基于规则的保护和基于异常的保护:基于规则的保护可以提供各种Web应用的安全规则,WAF(Web Application Firewall) 生产商会维护这个规则库,并时时为其更新。用户可以按照这些规测对应用进行全方面检测。
- **状态管理。**WAF能够判断用户是否是第一次访问并且将请求重定向到默认登录页面并且记录事件。通过检测用户的整个操作行为我们可以更容易识别攻击。状态管理模式还能检测出异常事件(比如登陆失败),并組在达到极限值时进行处理。这对暴力攻击的识别和响应是十分有利的。
- **其他防护技术。**WAF还有一安全增强的功能,可以用来解决WEB程序员过分信任输入数据带来的问题。比如:隐藏表单域保护、抗入侵规避技术、 响应监视和信息泄露保护。
- 优点:提供应用层保护。
- 缺点:处理速度慢等
Netfilter 子系统
Netfilter子系统是Linux内核中一个强大的网络过滤子系统,对进入系统的每个数据包,在到达用户空间组件或应用之前进行检查,通过编程方式来修改、丟弃或路由数据包。
Netfilter子系统工作在内核态,用户使用以下命令配置防火墙规则,告诉Netfilter子系统如何处理数据包:
-
iptables,用于过滤 IPv4 协议的数据包。
如果 Linux 系统连接到LAN或因特网, 则iptables可用于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
-
ip6tables,用于过滤 IPv6 协议的数据包,效果等同iptables工具。
-
arptables,用于过滤 arp 协议的数据包。
arptables既能防止别的机器对自己进行arp欺骗,又能防止本机病毒或错误程序向其他机器发起arp攻击。如果善于运用的话,不失为一个优秀的arp防火墙。
-
ebtables,用于过滤数据链路层数据包。
ebtables 过滤数据包比 iptables 更靠前,获得的数据更"原始",ebtables 多用于桥模式,比如控制 VLAN ID 等。
Nftables 子系统
Nftables子系统是netfilter的增强版,其仍保留了netfilter的架构。
nftables优点:
- 更快的数据包处理
- 更快的规则集更新
- 使用单个 nft 用户空间实用程序,通过一个接口来管理所有协议,消除了以往不同前端和多个netfilter接口引起的争用问题。
静态防火墙和动态防火墙
静态防火墙
用户管理防火墙规则时,为了让规则永久保存,防火墙服务会重新加载所有防火墙规则,哪怕只修改一条规则也要重新读取所有规则,这种载入模式称为静态模式。静态模式加载规则时,会导致网络连接丢失。
我们称使用静态模式载入规则的防火墙为静态防火墙。例如iptables,用户执行 service iptables reload 命令将变更的规则保存到配置文件里,并重新加载所有防火墙规则。
动态防火墙
用户管理防火墙规则时,为了让规则永久保存,防火墙只需要将变更部分保存并更新到运行中的 iptables 即可,而不需要对整个防火墙规则列表进行重新加载,这种载入模式称为动态模式。
我们称使用动态模式载入规则的防火墙为动态防火墙,例如 firewalld。
Firewalld 防火墙
Firewalld 介绍
Firewalld 是 Red Hat 公司开发的防火墙软件,默认后端为 nftables。
- 在 CentOS 7 之前的发行版中,默认使用 iptables 命令来管理防火墙。
- 在 CentOS 7 之后的发行版中, firewalld 取代 iptables 成为了默认防火墙软件。
- 用户可以同时使用 iptables 和 firewalld 两个防火墙软件,但容易搞混规则。建议将一个防火墙关闭或默认允许所有流量,只使用另一个防火墙。
- Firewalld 防火墙的另外一个特点就是动态加载防火墙规则。
Firewalld 和 iptables 之间的关系
- firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口。
- firewalld 和 iptables 一样,他们的作用都是用于维护规则,自身并不具备防火墙的功能,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。
Firewalld 区域
firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone),每个 zone 就是一套过滤规则集。
Firewalld 提供的区域
firewalld 防火墙提供了如下zone:
- trusted(信任区域):允许所有的传入流量。
- public(公共区域):允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
- external(外部区域):允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
- home(家庭区域):允许与ssh、mdn3、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- internal(内部区域):默认值时与homel区域相同。
- work(工作区域):允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- dmz(隔离区域也称为非军事区域):允许与ssh 预定义服务匹配的传入流量,其余均拒绝。
- block(限制区域):拒绝所有传入流量。
- drop(丢弃区域):丢弃所有传入流量,并且不产生包含ICMP的错误响应。
数据包与区域匹配规则
数据包与zone匹配规则如下:
-
该源地址被分配给特定区域, 则应用该区域的规则。
-
如果数据包未匹配源地址,则分配给与传入网络接口关联的区域,并应用该区域的规则。
-
如果以上都未匹配,firewalld将数据包分配给默认区域。
注意事项:
- firewalld默认指定public区域为默认区域,并将lo 回环接口映射至 trusted 区域。
- 如果流量不与允许的端口或协议或服务匹配,则通常会被拒绝。
Firewalld 规则
对于所有区域,区域内规则的优先级是相同的。
区域内规则匹配优先级如下:
- 首先匹配为该区域设置的任何端口转发 和伪装原则。
- 其次匹配该区域设置的任何允许规则。
- 最后匹配该区域设置的任何拒绝规则。
- 还可以同时为以上3个规则设置记录和审计规则,可以同时生效。
- 富规则中的规则优先级高于区域中其他规则。
- 如果区域中所有规则都不匹配,那么通常会拒绝该包,trusted 例外。
Firewalld 配置
Firewalld 配置方法
- 直接编辑 /etc/firewalld/ 中的配置文件
- firewall-cmd 命令行工具
- firewall-config 图形工具
Firewalld 配置文件
Firewalld 配置配置文件存放在:
- /usr/lib/firewalld/目录,Firewalld软件包自带配置位置。
- /etc/firewalld/目录,目录结构与/usr/lib/firewalld/一致,管理员自定义配置保存在该位置。
**提示:**我们不建议大家通过修改/etc/firewalld/目录配置防火墙。
查看zone配置
bash
[root@server ~ 19:51:10]# cd /usr/lib/firewalld/
[root@server firewalld 19:51:29]# ls
helpers icmptypes ipsets services zones
#查看zone配置
[root@server firewalld 19:51:30]# ls zones/
block.xml drop.xml home.xml public.xml work.xml
dmz.xml external.xml internal.xml trusted.xml
查看服务配置
bash
ls -1 services
irewall-cmd 命令行工具
两个基本概念
配置防火墙必须知道两个基本概念:
-
防火墙的配置有两个状态:
- runtime(运行时),命令行执行是的默认状态,该状态下的配置立刻生效。
- permanent(永久) ,通过选项
--permanent指定,该状态下的配置不会立刻生效,而是写入配置文件,需要通过选项--reload重新reload才会生效,重新reload将导致运行时状态下未保存的配置丢失,但会保留当前连接状态。如果使用选项--complete-reload重新reload永久配置,将导致当前连接状态也丢失。
建议配置防火墙一次性写两条规则:
第一条使用选项
--permanent永久生效;第二条不使用选项
--permanent立刻生效。 -
配置防火墙的规则必须一个区域内(直接规则除外),如果不使用选项
--zone明确指明区域,则使用默认区域。默认区域是public。
zone 管理
bash
#查看zone清单
[root@server ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 查看激活的zone清单,也就是分配了interface和source的zone
[root@server ~]# firewall-cmd --get-active-zones
public
interfaces: ens32
# 查看默认zone
[root@server ~]# firewall-cmd --get-default-zone
public
# 设置默认zone,例如设置为trusted,该操作同时设置永久态默认zone
[root@server ~]# firewall-cmd --set-default-zone=trusted
[root@server ~]# firewall-cmd --get-default-zone
trusted
# 再次设置回来
[root@server ~]# firewall-cmd --set-default-zone=public
*source管理
bash
# 来源于特定source的数据包交给特定zone处理
[root@dhcp ~ 19:22:38]# firewall-cmd --add-source=192.168.1.0/24 --zone=home
[root@dhcp ~ 19:23:07]# firewall-cmd --list-sources --zone=home
192.168.1.0/24
# 查看source清单
[root@dhcp ~ 19:23:55]# firewall-cmd --get-zone-of-source=192.168.1.0/24
home
# 查看source是否添加
[root@dhcp ~ 19:24:15]# firewall-cmd --query-source=192.168.1.0/24 --zone=home
yes
[root@dhcp ~ 19:24:41]# firewall-cmd --get-active-zones
home
sources: 192.168.1.0/24
public
interfaces: ens32
# 变更source到其他zone
[root@dhcp ~ 19:25:23]# firewall-cmd --change-source=192.168.1.0/24 --zone=public
success
[root@dhcp ~ 19:25:53]# firewall-cmd --get-active-zones
public
interfaces: ens32
sources: 192.168.1.0/24
# 删除zone中source
[root@dhcp ~ 19:25:57]# firewall-cmd --remove-source=192.168.1.0/24 --zone=public
success
[root@dhcp ~ 19:26:30]# firewall-cmd --get-active-zones
public
interfaces: ens32
*interface
bash
#查看zone中interface
[root@dhcp ~ 19:26:32]# firewall-cmd --list-interfaces
ens32
# 查看interface属于哪个zone
[root@dhcp ~ 19:30:16]# firewall-cmd --get-zone-of-interface=ens32
public
# 查看interface是否添加
[root@dhcp ~ 19:31:23]# firewall-cmd --query-interface=ens32
yes
# 将interface变更到其他zone
[root@dhcp ~ 19:31:37]# firewall-cmd --change-interface=ens32 --zone=home
success
[root@dhcp ~ 19:31:57]# firewall-cmd --get-active-zones
home
interfaces: ens32
# 删除zone中interface
[root@dhcp ~ 19:32:12]# firewall-cmd --remove-interface=ens32 --zone=home
success
[root@dhcp ~ 19:32:35]# firewall-cmd --get-active-zones
[root@dhcp ~ 19:32:35]#
# 如果interface不属于任何zone,使用以下命令将interface绑定到特定zone
[root@dhcp ~ 19:32:37]# firewall-cmd --add-interface=ens32 --zone=public
success
[root@dhcp ~ 19:32:56]# firewall-cmd --get-active-zones
public
interfaces: ens32
*service
准备httpd服务
bash
yum install -y httpd
systemctl start httpd
bash
#查看系统中预定义了哪些服务
[root@dhcp ~ 19:37:19]# firewall-cmd --get-services
# 添加放行服务
[root@dhcp ~ 19:37:27]# firewall-cmd --add-service=http
success
# 查看放行服务列表
[root@dhcp ~ 19:37:40]# firewall-cmd --list-services
dhcpv6-client http ssh
# 查看服务是否放行
[root@dhcp ~ 19:37:49]# firewall-cmd --query-service=hhttp
Error: INVALID_SERVICE: hhttp
[root@dhcp ~ 19:38:01]# firewall-cmd --query-service=http
yes
# 删除服务
[root@dhcp ~ 19:38:06]# firewall-cmd --remove-service=http
success
[root@dhcp ~ 19:38:18]# firewall-cmd --get-active-zones
public
interfaces: ens32
*port
bash
# 添加放行端口
[root@dhcp ~ 19:38:30]# firewall-cmd --add-port=5900/tcp
success
# 查看端口放行列表
[root@dhcp ~ 19:40:37]# firewall-cmd --list-ports
5900/tcp
# 查看端口是否放行
[root@dhcp ~ 19:41:02]# firewall-cmd --query-port=5900/tcp
yes
# 删除端口
[root@dhcp ~ 19:41:38]# firewall-cmd --remove-port=5900/tcp
success
*masquerade
bash
#查看masquerade是否启动
[root@dhcp ~ 19:41:56]# firewall-cmd --query-masquerade
no
# 启动 masquerade
[root@dhcp ~ 19:43:06]# firewall-cmd --add-masquerade
success
[root@dhcp ~ 19:43:17]# firewall-cmd --query-masquerade
yes
# 禁用masquerade
[root@dhcp ~ 19:43:20]# firewall-cmd --remove-masquerade
success
#再次查看masquerade是否启动
[root@dhcp ~ 19:43:30]# firewall-cmd --query-masquerade
no
*rich rule
富规则可灵活自定义各种规则,例如:
- 允许单个IP地址或者网段连接到某个服务
- 配置记录和审计
- 限制速率
富规则参考 firewalld.richlanguage(5)。
富规则语法:
bash
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]
**示例1:**禁止所有主机ping本机。
bash
# 添加富规则
[root@dhcp ~ 19:45:54]# firewall-cmd --add-rich-rule='rule protocol value=icmp drop'
success
# 明确拒绝类型
[root@dhcp ~ 19:47:07]# firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp reject type=net-prohib'
success
# 查看富规则清单
[root@dhcp ~ 19:47:28]# firewall-cmd --list-rich-rules
rule protocol value="icmp" drop
rule family="ipv4" protocol value="icmp" reject type="net-prohib"
# 查看富规则是否添加
[root@dhcp ~ 19:47:43]# firewall-cmd --query-rich-rule='rule protocol value=icmp drop'
yes
# 删除富规则
[root@dhcp ~ 19:48:12]# firewall-cmd --remove-rich-rule='rule protocol value=icmp drop'
success
示例2:
- 针对IPv4
- 来源主机10.1.8.10
- 允许ping本机
bash
[root@server ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="10.1.8.10" icmp-type name="echo-request" accept'
示例3:
示例3:
- 针对IPv4
- 来源10.1.8.0/24网段中主机
- 访问非172.16.0.0/24网段中主机的http服务
- 1秒中只允许访问3次
- 做好日志记录,前缀为" http-error ",日志级别为"error",每秒记录2次
- 做好审计,每秒记录1次
bash
[root@server ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="10.1.8.0/24" destination not address="172.16.0.0/24" service name="http" log prefix=" http-error " level="error" limit value="2/s" audit limit value="1/s" accept limit value="3/s"'