CentOS7防火墙firewalld

防火墙守护 firewalld 服务引入了一个信任级别的概念来管理与之相关联的连接与接口。它支持 ipv4 与 ipv6,并支持网桥,采用 firewall-cmd (command) 或 firewall-config (gui) 来动态的管理 kernel netfilter 的临时或永久的接口规则,并实时生效而无需重启服务。

firewalld和iptables的关系

firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和iptables一样,他们的作用都是用于维护规则, 而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了

firewalld的配置模式

firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里

/usr/lib/firewalld 中的默认/备用配置
该目录包含了由 firewalld 提供的默认以及备用的 ICMP 类型、服务、区域配置。由 firewalld 软件包提供的这些文件不能被修改,即使修改也会随着 firewalld 软件包的更新被重置。 其他的 ICMP 类型、服务、区域配置可以通过软件包或者创建文件的方式提供。

/etc/firewalld 中的系统配置设置
存储在此的系统或者用户配置文件可以是系统管理员通过配置接口定制的,也可以是手动定制的。这些文件将重载默认配置文件。
为了手动修改预定义的 icmp 类型,区域或者服务,从默认配置目录将配置拷贝到相应的系统配置目录,然后根据需求进行修改。
如果你加载了有默认和备用配置的区域,在 /etc/firewalld 下的对应文件将被重命名为 .old 然后启用备用配置

区域管理

通过将网络划分成不同的区域(通常情况下称为 zones),制定出不同区域之间的访问控制策略来控制不同任程度区域间传送的数据流。例如互联网是不可信任的区域,而内部网络是高度信任的区域。以避免安全策略中禁止的一些通信。它有控制信息基本的任务在不同信任的区域。典型信任的区域包括互联网 ( 一个没有信任的区域 ) 和一个内部网络 ( 一个高信任的区域 )。最终目标是提供受控连通性在不同水平的信任区域通过安全政策的运行和连通性模型之间根据最少特权原则。例如:公共 WIFI 网络连接应该不信任,而家庭有线网络连接就应该完全信任。网络安全模型可以在安装、初次启动和首次建立网络连接时选择初始化。该模型描述了主机所联的整个网络环境的可信级别,并定义了新连接的处理方式。在 /etc/firewalld/ 的区域设定是一系列可以被快速执行到网络接口的预设定。有几种不同的初始化区域:

  • drop(丢弃)
    任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。

  • block(限制)
    任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。

  • public(公共)
    在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。

  • external(外部)
    特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。

  • dmz(非军事区)
    用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。

  • work(工作)
    用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。

  • home(家庭)
    用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。

  • internal(内部)
    用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。

  • trusted(信任)
    可接受所有的网络连接。

说明:firewalld 的缺省区域是 public。
对于区域的修改,可使用网络管理器NetworkManager搞定

firewalld 基本操作

安装firewalld

# yum install firewalld firewall-config

firewalld启动,停止,开机启动与否,查看状态

# systemctl start  firewalld.service       启动
# systemctl enable  firewalld.service      开机自启
# systemctl stop  firewalld.service        停止
# systemctl disable firewalld.service      开机禁止启动
# systemctl status  firewalld.service      查看状态

firewall-cmd命令

基本命令

# firewall-cmd --version    查看版本
# firewall-cmd --help    查看帮助
# firewall-cmd --state    显示状态
# firewall-cmd --panic-on    拒绝所有包
# firewall-cmd --panic-off    取消拒绝状态
# firewall-cmd --query-panic    查看是否拒绝
# firewall-cmd --reload    重新加载防火墙,并不中断用户连接(firewalld特性之一动态添加规则)
# firewall-cmd --complete-reload    重新加载防火墙并中断用户连接(类似于重启服务)

跟zone相关的

# firewall-cmd --get-zones    显示支持的区域列表
# firewall-cmd --get-active-zones    查看当前的区域
# firewall-cmd --get-default-zone    查看默认区域
# firewall-cmd --set-default-zone=home    设置默认区域为 home
# firewall-cmd --zone=public --list-interfaces    显示显示公共区域(public)所有接口
# firewall-cmd --zone=public --list-all    显示公共区域(public)所有设置
# firewall-cmd --get-zone-of-interface=ens33    查看指定接口 ens33 所属区域
# firewall-cmd --zone=internal --change-interface=ens33   临时修改网络接口 ens33 为内部区域(internal),永久修改加上 --permanent 参数
# firewall-cmd --zone=public --add-interface=ens37    为公共区域(public)增加一个接口 ens37  

跟service相关的

# firewall-cmd --get-service    显示服务列表
# firewall-cmd --list-service    显示当前服务
# firewall-cmd --enable service=ssh    允许SSH服务通过
# firewall-cmd --disable service=ssh    禁止SSH服务通过
# firewall-cmd --enable service=samba --timeout=600    临时允许 samba 服务通过 600 秒
# firewall-cmd --permanent --zone=internal --add-service=http    添加 http 服务到内部区域(internal)
# firewall-cmd --zone=work --add-service=smtp    把 smtp 服务加入工作区域(work) 
# firewall-cmd --zone=work --remove-service=smtp    从工作区域(work)移除 smtp 服务

跟port相关的

# firewall-cmd --zone=internal --add-port=443/tcp    在内部区域(internal)打开 443/tcp 端口
# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=52222:toaddr=192.168.1.20  
把外部区域(external)的 22 端口转发到 192.168.1.20 的 52222 端口

跟地址伪装相关的

# firewall-cmd --zone=external --query-masquerade    查询外部区域(external)是否能伪装ip,结果为yes
# firewall-cmd --zone=external --add-masquerade     外部区域(external)启用IP伪装(masquerade)
# firewall-cmd --zone=external --remove-masquerade    外部区域(external)禁用用IP伪装

更多内容请参考官方文档

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls