iptables现如今非常流行,使用范围也非常广泛,一般用途的防火墙,以iptables的端口转发和IP伪装为基础开发的LVS负载均衡;以NAT为基础的路由器网关等等。
但是,iptables却不是没有缺点的,大量的iptables规则会拖慢速度,更改一个规则可能需要重载所有的规则,于是便有了nf-HiPAC和ipset,保证效率
另外,iptables 也不能算得上是一款现代意义上的防火墙,设计之初并没有考虑不同的场景下需要加载不同的规则,比如公共场所,家里,和办公室等,
相比之下,类似的概念从 win7 时代的防火墙就有了,(win7的正式发布时间是2009年)
firewalld,考虑到了 iptables 这些问题,整合了iptables、ip6tables、ipset,加入了区域的概念,使其成为了一款现代意义上的防火墙。
但是,firewalld 并不属于新一代防火墙,只能算是 iptables 的衍生品,因为其核心仍旧基于iptables。真正的下一代防火墙是 nftables,关于 nftables 超出了本文的内容,略过不谈。
firewalld有图形化的的 firewall-config 工具,也有命令行工具 firewall-cmd。
firewalld 是动态防火墙,而非静态的。改变防火墙规则后,所有部分并不需要都重新加载。提供临时和永久两种状态,临时状态即刻生效,永久状态需重载防火墙,实际上是重新加载改变的部分,这也是动态防火墙的由来。
firewalld引入了区域和服务的概念,区域是为了应对不同的场景,服务是为了便于直观的理解
区域分为以下几种:
drop
(丢弃)-
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block
(限制)-
任何接收的网络连接都被
IPv4
的 icmp-host-prohibited 信息和IPv6
的 icmp6-adm-prohibited 信息所拒绝。 public
(公共)-
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external
(外部)-
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz
(非军事区)-
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work
(工作)-
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home
(家庭)-
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal
(内部)-
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted
(信任)-
可接受所有的网络连接。
firewalld 初始 默认区域为 public。
由于不同的区域概念,你可以预设每个区域的规则,开放的服务,端口等等,和 wifi 的 SSID 及有线的网络进行绑定。比如,你连上咖啡厅的wifi,或是家中的wifi,防火墙会自动切换为 public 或 home。相当方便。(使用 NetworkManager 可以实现,其它网络管理程序如 networkd 是否支持不太清楚)
#查看 firewalld 状态 firewall-cmd --state #查看当前规则 firewall-cmd --list-all #这一项包含了以下四项 ################################ #查看当前激活的区域 firewall-cmd --get-active-zones #查看开放的端口 firewall-cmd --list-ports #查看开放的服务 firewall-cmd --list-services #查看当前的富规则 firewall-cmd --list-rich-rules ############################### ##########区域########## #查看默认区域 firewall-cmd --get-default-zone firewall-cmd --set-default-zone=public # 设置默认区域为public #查看激活的区域 firewall-cmd --get-active-zones #查看预定义的区域 firewall-cmd --get-zones #查看网卡所在区域 firewall-cmd --get-zone-of-interface=eno33 #查看所有区域当前的状态 firewall-cmd --list-all-zones #获取区域的target(同iptables的target) firewall-cmd --get-target firewall-cmd --set-target=ACCEPT|DROP|REJECT #查看指定区域的状态 firewall-cmd --info-zone=public #为网卡指定区域 firewall-cmd --zone=trusted --add-interface=eno33 firewall-cmd --zone=public --add-interface=eno33 #改变网卡的所属区域 firewall-cmd --zone=home --change-interface=eno33 ##########添加端口########## firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --permanent --zone=public --add-port=100-500/tcp --permanent #查询端口是否被加入到当前规则 firewall-cmd --query-port=100-500/tcp --permanent #删除端口 firewall-cmd --zone=public --remove-port=3306/tcp --permanent firewall-cmd --zone=public --remove-port=100-500/tcp --permanent ##########服务########## #查看当前区域启用的服务 firewall-cmd --list-services #查看预定义的服务 firewall-cmd --get-services #添加服务 firewall-cmd --add-service=http # 查看http是否属于默认区域 firewall-cmd --query-service=http #删除服务 firewall-cmd --query-service=ssh ##########富规则########## #列出富规则 firewall-cmd --list-rich-rules #添加富规则 firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept" #为 114.114.114.0/28 开放全部端口 firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="114.114.114.114" port port="80" protocol="tcp" accept" # 为指定IP开放指定端口,指定协议为TCP #删除富规则 firewall-cmd --zone=public --permanent --remove-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept" #查询富规则 firewall-cmd --zone=public --permanent --query-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept" ##########重启########## firewall-cmd --reload firewall-cmd --complete-reload #彻底重启(丢掉现有连接) ##########其它实用规则########## #防暴力破解 firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp --dport 22 -m state --state NEW -m recent --set firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 30 --hitcount 4 -j REJECT --reject-with tcp-reset firewall-cmd --reload