(一)防火墙概述
防火墙的概念:防火墙是一种非常重要的网络安全工具,它是网络安全的重要组成部分,用于保护计算机网络免受未经授权的访问、恶意攻击和数据泄漏等威胁等。
防火墙的特点
防火墙通常具备以下几个特点。
位置权威性:网络规划中,防火墙必须位于网络的主干线路。只有当防火墙是内外部网络之间通信的唯一通道时,才可以全面、有效地保护企业内部的网络安全。
检测合法性:防火墙最基本的功能是确保网络流量的合法性,只有满足防火墙策略的数据包才能够进行相应转发。
性能稳定性:防火墙处于网络边缘,它是连接网络的唯一通道,时刻都会经受网络的考验,所以其稳定性对于网络安全而言,至关重要。
防火墙的分类方法多种多样,不过从传统意义上讲,防火墙大致可以分为三大类,分别是“包过滤”、“应用代理”和“状态检测”。无论防火墙的功能多么强大,性能多么完善,归根结在这三种技术的基础之上进行功能扩展的。
iptables 与 firewall
对于Linux服务器而言,采用netfilter/iptables数据包过滤系统,能够节约软件成本,并可以提供强大的数据包过滤控制功能,iptables是理想的防火墙解决方案。
在RHEL8系统中,firewalld防火墙取代了iptables防火墙。就现实而言,iptables与firewalld 都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。iptables 服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。换句话来说,当前在Linux系统中其实存在多个防火墙管理工具,旨在方便运维人员管理Linux系统中的防火墙策略,只需要配置妥当其中的一个就足够了。虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的。
NAT 基础知识
NAT(Network Address Translation,网络地址转换)位于使用专用地址的Intranet和使用公用地址的Internet之间,主要有以下几种功能:
(1)从Intranet 传出的数据包由NAT将它们的专用地址转换为公用地址。
(2)从Internet传入的数据包由NAT将它们的公用地址转换为专用地址。
(3)支持多重服务器和负载均衡。
(4)实现透明代理。
在内网中计算机使用未注册的专用IP地址,而在与外部网络通信时,使用注册的用IP地址,大幅降低了连接成本。同时,NAT也起到将内部网络隐藏起来,保护内部网络作用,因为对外部用户来说,只有使用公用IP地址的NAT是可见的,类似于防火墙的安全措施。
1.NAT的工作过程
(1)客户机将数据包发给运行NAT的计算机。
(2)NAT将数据包中的端口号和专用的IP地址换成它自己的端口号和公用的IP地,然后将数据包发给外部网络的目的主机,同时在映像表中记录一个跟踪信息,以便向客机发送回答信息。
(3)外部网络发送回答信息给NAT。
(4)NAT将收到的数据包的端口号和公用IP地址转换为客户机的端口号和内部网络
用的专用IP地址并转发给客户机。
以上步骤对于网络内部的主机和网络外部的主机都是透明的,对它们来讲就如同直接信通一样。
NAT的分类:
(1)SNAT:指修改第一个包的源IP地址。SNAT会在包送出之前的最后一刻做好Post-Routing的动作。Linux中的IP伪装(MASQUERADE)就是SNAT的一种特殊形式。
(2)DNAT:指修改第一个包的目的IP地址。DNAT总是在包进入后立即进行Pre-Routing动作。端口转发、负载均衡和透明代理均属于DNAT。
(二)SELinux
SELinux(Security-Enhanced Linux,安全增强型 Linux)是美国国家安全局(National Security Agency,NSA)对于强制访问控制的实现,是Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在它的任务中所需要的文件。2.6及以上版本的Linux内核都已经集成 SELinux 模块。简言之,SELinux 是一个强制访问控制机制,与传统的自主访问控制相比,它提供了更多的安全性和精细的权限管理,有助于防止潜在的安全漏洞和攻击。
DAC
Linux上传统的访问控制标准是DAC(Discretionary Access Control,自主访问控制)。在这种形式下,一个软件或守护进程以UID(User ID)或 SUID(Set owner User ID)的身份运行,并且拥有该用户的目标(文件、套接字以及其他进程)权限。这使恶意代码很容易运行在特定权限之下,从而取得访问关键的子系统的权限。而最致命问题是,root用户不受任何管制,系统上任何资源都可以无限制地被访问。在传统的 DAC 模型中,访问资源的权限受到用户或进程的用户标识(UID)和文件的权限位的控制。这意味着进程以其拥有者的权限运行,恶意代码可能以特权用户的身份运行,并访问敏感资源。根用户(UID 0)拥有无限制的访问权限,这是一个潜在的安全风险。
MAC
在 SELinux 中,除了 DAC 模型中的 UID 和文件权限之外,还引入了更严格的安全策略,以确定哪些进程可以访问哪些资源。这意味着即使进程以 root 用户身份运行,也需要遵守 SELinux 策略来确定其是否可以访问资源。进程的类型和资源的类型都被考虑在内,从而限制了恶意代码的权限和活动范围
在使用了SELinux的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。
这样即使进程是以root身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。即使是以root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只在其允许访问的资源范围内,安全性大幅增加。这种权限管理机制的主体是进程,也称为MAC(Mandatory Access Control,强制访问控制)。
SELinux 实际上就是MAC理论最重要的实现之一,并且SELinux从架构上允许DAC和MAC两种机制都可以起作用,所以,在RHEL8系统中,实际上DAC和MAC机制是共同使用的,两种机制共同过滤作用能达到更好的安全效果。
SELinux工作机制
SELinux 基于一组策略规则(Policy)来控制系统资源的访问。以下是相关概念:
- 主体(Subject):主体通常是进程或程序,它们试图访问资源。
- 目标(Object):目标是系统中的资源,例如文件、套接字或进程。
- 策略(Policy):策略数据库中包含了 SELinux 规则,决定哪些主体可以访问哪些目标。
- 模式(Mode):SELinux 支持多种工作模式,如强制模式(Enforcing)和宽松模式(Permissive) ,用于控制策略的执行严格程度。
当主体(例如程序)尝试访问目标(例如文件)时,SELinux 安全服务器会在策略数据库中检查是否允许这种访问。如果 SELinux 安全服务器授予权限,主体就可以访问目标。这种方式确保了更细粒度的权限控制和更高级别的系统安全性。如果SELinux安全服务器拒绝了权限,就会在/var/log/message中记录一条拒绝信息。
(三)使用firewalld服务
RHEL 8系统集成了多款防火墙管理工具,其中 firewalld提供了支持网络/防火墙区域定义网络链接以及接口安全等级的动态防火墙管理工具——Linux系统的动态防火墙管理器(Dynamic Firewall Manager of Linux Systems)。 Linux 系统的动态防火墙管理器拥有基于CLI命令行界面)和基于GUI(图形用户界面)的两种管理方式。 相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生场景的不同选择合适的策略集合,从而实现防火墙策略之间的快速切换。
例如,有一台笔记本电脑,每天都要在办公室、咖啡厅和家里使用。按常理来讲,这三者的安全性按照由高到低的顺序排列,应该是家庭、公司办公室、咖啡厅。所以,希望为这台笔记本电脑指定如下防火墙策略规则:在家中允许访问所有服务;在办公室内仅允许访问文件共享服务;在咖啡厅仅允许上网浏览。搁以前,需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合,然后轻点鼠标就可以自动切换了,从而极大地提升了防火墙策略的应用效率。firewalld中常见的区域名称(默认为public)以及相应的策略规则如下表所示。
区城 | 默认策略规则 |
trusted | 允许所有的数据包 |
home | 拒绝流入的流量,除非与流出的流量相关;而如果流量与SSH、mdns、ipp-client、amba-client与 dhcpv6-client服务相关,则允许流量 |
internal | 等同于home区域 |
work | 拒绝流入的流量,除非与流出的流量数相关;而如果流量与SSH、ipp-client与dhcpv6-client服 务相关,则允许流量 |
public | 拒绝流入的流量,除非与流出的流量相关;而如果流量与 SSH、dhepv6-client 服务相关,则允许流量 |
external | 拒绝流人的流量,除非与流出的流量相关,而如果流量与SSH服务相关,则允许流量 |
dmz | 拒绝流入的流量,除非与流出的流量相关,而如果流量与SSH服务相关,则允许流量 |
block | 拒绝流入的流量,除非与流出的流量相关 |
drop | 拒绝流入的流量,除非与流出的流量相关 |
使用终端管理工具
命令行终端是一种高效率的工作方式,fiewall-cmd 是firewalld 防火墙配置管理工具的CLI(命令行界面)版本。它的参数一般都是以“长格式”来提供的,但幸运的是,RHEl 8系统支持部分命令的参数补齐。现在除了能用 Tab键自动补齐命令或文件名等内容之外,还可以用 Tab键来补齐下表中的长格式参数。
参数 | 作用 |
--get-defaultzone | 查询默认的区域名称 |
--set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
--get-zones | 显示可用的区域 |
--get-services | 显示预先定义的服务 |
--get-active zones | 显示当前正在使用的区域与网卡名称 |
--add-source= | 将源自此IP或子网的流量导向指定的区域 |
--remove source= | 不再将源自此IP或子网的流量导向 |
--add-interface=<网卡名称> | 某个指定区域将源自该网卡的所有流量都导向某个指定区域 |
--change interface=<网卡名称> | 将某个网卡与区域关联 |
--list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
--list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
--add-service=<服务名> | 设置默认区域允许该服务的流量 |
--add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
--remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
--remove port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
--reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
--panic on | 开启应急状况模式 |
--panic off | 关闭应急状况模式 |
与Linux系统中其他的防火墙策略配置工具一样,使用firewalld配置的防火墙策略默认为运行时模式,又称为当前生效模式,而且系统重启后会失效。如果想让配置策略一直存在,就需要使用永久模式,方法就是在用 firewall-cmd 命令正常设置防火墙策略时添加permanent叁数,这样配置的防火墙策略就可以永久生效了。但是永久生效模式有一个的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行 firewall-cmd-reload命令。
用命令设置防火墙策略
1)systemctl命令速查
systemctl start nfs-server.service . # 启动nfs服务 systemctl start firewalld.service #启动防火墙 systemctl stop firewalld.service #停止防火墙 systemctl reloadt firewalld.service #重载配置 systemctl restart firewalld.service # 重启服务 systemctl enable nfs-server.service #设置开机自启动 systemctl disable nfs-server.service # 停止开机自启动 systemctl status nfs-server.service #查看服务当前状态 systemctl restart nfs-server.service #重新启动某服务 systemctl list-units --type=service #查看所有已启动的服务 systemctl list-units-files|grep enavle # 查看所有已启动的服务列表 systemctl --failed #查看启动失败的服务列表
2)firewall-cmd命令速查
firewall-cmd --state #查看防火墙状态
firewall-cmd --reload #更新防火墙规则
firewall-cmd --state #查看防火墙状态
firewall-cmd --reload #重载防火墙规则
firewall-cmd--list-ports #查看所有打开的端口
firewall-cmd--list-services #查看所有允许的服务
firewall-cmd--get-services #获取所有支持的服务
3)区域相关命令速查
firewall-cmd --list-all-zones #查看所有区域的信息
firewall-cmd --get-active-zones #查看活动区域信息
firewall-cnd --get-default-zone #设置public为默认区域信息
firewall-cmd --set-default-zone-public #查看默认区域信息
firewall-cmd --zone-public --add-interface-eth0 #接口eth0加入区域public
4)接口相关命令速查
tirewall-cmd --zone-public --remove-interface-ens160 #从区域pubiic中副除接口 ens160
firewall-cmd --zone-default --change-interface-ens160 #修改接口ens160所属区域为default
firewall- cmd --get- zone-of-interface-ens160 #查看接口ens160所属区域
5)端口控制命令速查
firewall-cmd --add-port=80/tcp --permanent #永久添加80端口例外(全局)
firewall-cmd --remove-port=80/tcp --permanent #永久删除 80端口例外(全局)
firewall-cmd --add-port=65001-65010/tcp --permanent #永久增加65001-65010例外(全局)
firewall-cmd --zone=public --add-port=80/tcp --permanent #永久添加80端口例外(区域 public)
firewall-cmd --zone=public --remove-port=80/tcp --permanent#永久删除80端口例外(区域 public)
firewall-cmd --zone=public --add-port=65001-65010/tcp --permanent
#永久增加65001-65010例外(区域public)
firewall-cmd--query-port=8080/tcp #查询端口是否开放
firewall-cmd --permanent --add-port=80/tcp #开放80端口
firewall-cmd --permanent --remove-port=8080/tcp #移除端口
firewall-cmd --reload #重启防火墙(修改配置后要重启防火墙)
6)项目实战
(1)查看firewalld服务当前状态和使用的区域。
# firewall-cmd --state
# systemctl restart firewalld
#firewall-cmd --get-default-zone
(2)查询防火墙生效ens160网卡在 firewalld服务中的区域。
# firewall-cnd --get-active-zones#查看当前防火墙中生效的域
# firewall-cmd --set-default-zone=trusted _#设定默认域
(3)把firewalld 服务中ens160网卡的默认区域修改为external,并在系统重启后生效,分别查看当前与永久模式下的区域名称。
firewall-cnd --11st-all --zone-work //查看指定与的防火墙策略
firewall-cnd --permanent --zone-external --change-interface=ens160
firewall-cmd --get-zone-of-interface =ens160
firewall-cnd --permanent --get-zone-of-interface=ens160
(4)把firewalld服务的当前默认区域设置为 public
#firewall-cmd --set-default-zone-public
#firewall-cmd --get-default-zone
(5)启动/关闭firewalld 防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用)
# firewall-cmd?--panic-on
#firewall-cmd?--panic-off
(6)查询public 区域是否允许请求SSH和HTTPS协议的流量。
# firewall-cmd --zone-public --query-service-ssh
#firewall-cmd --zone-public --query-service-https
(7)把firewalld服务中请求HTTPS协议的流量设置为永久允许,并立即生效。
#firewall-cmd --get-services #查看所有可以设定的服务
#firewall-cmd --zone=public --add-service-https
#firewall-cmd --permanent --zone-public --add-service=https
#firewall-cmd --reload
#firewall-cmd --list-all #查看生效的防火墙策略
#firewall-cmd--list-all #查看生效的防火墙策略
(8)把firewalld服务中请求HTTPS协议的流量设置为永久拒绝,并立即生效
# firewall- cmd --permanent -- zone-public - - remove-service-https
#firewall-cmd --reload
]#firewall-cmd --list-all #查看生效的防火墙策略
(9)把在firewalld服务中访问8088和8089端口的流量策略设置为允许,但仅限当前生效