Firewalld出现的目的是为了简化iptables繁琐的配置命令与过程,使用python2开发。
首先声明一点,不管是Firewalld还是iptables本身都不具备网络控制相关的功能,所有的功能都是Linux系统的netfilter模块实现的。
iptables给用户提供了一个可以直接控制netfilter的接口。而Firewalld使用更人性化的命令把用户的输入转换为iptables的命令。
Firewalld
# 关闭并禁用防火墙
systemctl disable --now firewalld
# 启动并开机自启动防火墙
systemctl enable --now firewalld
# 重载防火墙配置 每次修改完都需要执行这个命令才能生效
firewall-cmd --reload
区域
Fireawalld有明确的区域概念,根据不同的区域可以设置不同的规则。
# 查看防火墙区域
[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 查看所有区域的所有规则
firewall-cmd --list-all-zones
Firewalld会将所有未配置的流量导向到当前激活的区域。
# 将远端地址加入到public区域中
firewall-cmd --zone=public --add-source=192.168.0.0/16 --permanent
public是常见的默认的区域,通过以下命令可以查看 当前使用的区域配置和内容。
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens192
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
public除了会回应icmp通信之外,还会允许已经添加的服务与端口进行通信。
如果将默认区域切换成drop,那么除了添加到其他区域的远端地址之外,会拒绝其他所有地址的连接。而且数据包会直接丢弃,相当于静默模式。
drop区域是个人电脑常用的模式之一,也是安全等级比较高的服务器常用配置。
# 切换当前区域
firewall-cmd --set-default-zone=drop
# 重载防火墙配置
firewall-cmd --reload
所有的区域都是同时生效的,可以按照实际需求将不同的来源重定向到不同的区域,再进行有针对性的配置。
添加放行端口
# 添加常见服务
firewall-cmd --zone=public --add-service=http --permanent
# 添加自定义端口 9000允许TCP连接
firewall-cmd --zone=public --add-prot=9000/tcp --permanent
# 重载防火墙配置
firewall-cmd --reload
端口转发
# 需要先开启IP伪装,否则转发不生效
firewall-cmd --permanent --zone=public --add-masquerade
# 添加转发端口
firewall-cmd --permanent --zone=public --add-forward-port=port=源端口:proto=tcp:toport=目的端口:toaddr=目的ip
# 刷新防火墙配置
firewall-cmd --reload
rich-rule
针对更复杂的需求,Firewalld可以使用 rich-rule 来实现更高级的配置效果。
但是rich-rule的语法在我看来是为了兼容习惯使用iptables的人,而非没有基础的新人,所以在这里不介绍rich-rule的写法。
至少我认为有能力可以使用rich-rule,至少对系统和网络有一定了解,不如直接使用iptables。