管理网络安全
linux内核中包含netfilter,它是网络流量操作(数据包过滤、网络地址转换和端口转换)的框架。它是RHEL防火墙的主要组件。
Linux内核中还包含nftables,这是一个心得过滤器和数据包分裂子系统,它增强了netfilter的部分代码,但保留了netfilter的架构。
firewalld 是RHEL7 和RHEL8推荐使用的防火墙前端。它是一个动态防火墙管理器,是nftables框架的前端(使用NFT命令)。使用nft来管理防火墙规则集。
firewalld会检查进入系统的每个数据包的源地址。
Firewalld区域默认配置
区域名称 | 默认配置 |
---|---|
trusted | 允许所有传入流量 |
home | 除非与传出流量相关,或与ssh、mdns、ipp-client、samba-client或dhcpv6-client预定义服务匹配,否则拒绝传入流量。 |
内部 | 除非与传出流量相关,或与ssh、mdns、ipp-client、samba-client或dhcpv6-client预定义服务匹配,否则拒绝传入流量。 (一开始与/home区域相同)。 |
work | 除非与传出流量相关,或与ssh、ipp-client或dhcpv6-client预定义服务匹配,否则拒绝传入流量。 |
公共 | 除非与传出流量相关,或与ssh或dhcpv6-client预定义服务匹配,否则拒绝传入流量。新添加的网络接口的默认区域。 |
external | 除非与传出流量相关,或与ssh预定义服务匹配。否则拒绝传入流量。通过此区域转发的IPIV传出流量将进行伪装使其看起来像是来自传出网络接口的IPv4地址。 |
dmz | 除非与传出流量相关,或与ssh预定义服务匹配,否则拒绝传入流量。 |
block | 除非与传出流量相关。否则拒绝所有传入流量。 |
drop | 除非与传出流量相关,否则丢弃所有传入流量(甚至不产生包含ICMP错误的响应)。 |
Firewalld上有一些预定义服务。这些服务可以帮助我们识别需要配置的特定网络服务。
预定义Firewalld服务节选
服务名称 | 配置 |
SSH | 本地SSH服务器。到22/tcp的流量 |
dhcpv6-client |
本地DHCPv6客户端。到fe80::/64 IPv6网络中546/udp的流量 |
ipp-client | 本地IPP打印。到631/udp的流量。 |
samba-client | 本地windows文件和打印共享客户端。到137/udp和138/udp的流量。 |
MDNS | 多播DNS(mDNS)本地链路名称解析。到5353/udp指向224.0.0.251(IPv4)或ff02::fb(IPv6)多播地址的流量。 |
firewalld-cmd --get-services 列出这些预定义服务
从命令行配置防火墙
常用firewall-cmd命令及其说明
FIREWALL-CMD命令 | 说明 |
--get-default-zone | 查询当前默认区域 |
--set-default-zone=ZONE | 设置默认区域。此命令会同时更改运行时配置和永久配置。 |
--get-zones | 列出所有可用区域 |
--get-active-zones | 列出当前正在使用的所有区域(具有关联的接口或源)及其接口和源信息。 |
--add-source=CIDR[--zone=ZONE] | 将来自IP地址或网络/子网掩码的所有流量路由到指定区域。如果未提供--zone=选项,则使用默认区域。 |
--remove-source=CIDR[--zone=ZONE] | 从区域中删除用于路由来自IP地址或网络/子网掩码的所有流量的规则。如果未提供--zone=选项,则使用默认的区域。 |
--add-interface=INTERFACE [--zone=ZONE] | 将来自INTERFACE的所有流量路由到指定区域。如果未提供--zone=选项,则使用默认区域。 |
--change-interface=INTERFACE [--zone=ZONE] | 列出ZONE的所有已配置接口、源、服务和端口。如果未提供--zone=选项,则使用默认区域。 |
--list-all [--zone=ZONE] | 列出ZONE的所有已配置接口、源、服务和端口。如果未提供--zone=选项,则使用默认区域。 |
--list-all-zones | 检索所有区域的所有信息(接口、源、端口、服务)。 |
--add-service=SERVICE [--zone=ZONE] | 允许到SERVICE的流量。如果未提供--zone=选项,则使用默认区域。 |
--add-port=PORt/PROTOCOL [--zone=ZONE] | 允许到PORT/PROTOCOL端口的流量。如果未提供--zone=选项,则使用默认区域。 |
--remove-service=SERVICE [--zone=ZONE] | 从区域的运行列表中删除SERVICE。如果未提供--zone=选项,则使用默认区域。 |
--remove-port=PORT/PROTOCOL[--zone=ZONE] | 从区域的允许列表中删除PORT/PROTOCOL端口。如果未提供--zone=选项,则使用默认区域。 |
--reload | 丢弃运行时配置并应用持久配置。 |
示例: 将默认区域设置为dmz,将来自192.168.0.0/24网络的所有流量都分配给internal区域,并在internal区域上打开用于mysql服务的网络端口。
root权限运行一下命令:
- firewall-cmd --set-default-zone=dmz
- firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
- firewall-cmd --permanent --zone=internal --add-service=mysql
- firewall-cmd --reload
控制selinux端口标记
selinux不仅是进行文件和进程标记。selinu策略还严格控制网络流量量。
SElinux用来控制网络流量的其中一种方法是标记网络端口,例如:端口22/TCP具有标签ssh_port_t与其相关联。默认HTTP端口80/TCP和443/TCP具有标签http_port_t与其相关联。
semanage port -l 命令获取所有当前端口标签分配的概述。示例:
优化搜索,请使用grep命令:
一个端口标签可能会出现两次,一次针对TCP,一次针对UDP。
semanage命令可以分配新端口标签、删除端口标签或修改现有端口标签。向现有端口标签中添加端口,使用-a 添加新端口标签,-t表示类型,-p表示协议。
示例: semanage port -a port_label -p tcp|udp PORTNUMBER
运行gopher服务侦听端口71/TCP: semanage port -a -t gopher_port_t -p tcp 71
查看对默认策略的本地更改: semanage port -l -c
删除端口标签,与添加端口标签的语法相同,使用-d选项。示例:
删除端口71/TCP 与gopher_port_t的绑定:
semanage port -d -t gopher_port_t -p tcp 71
修改端口绑定,使用-m选项,示例:
semanage port -m -t http_port_t -p tcp 71
上面的命令将端口71/TCP从gopher_port_t修改为http_port_t,需root权限。