什么是firewalld?
firewalld是一个防火墙管理工具。
Linux中提供防火墙功能的其实是netfilter,netfilter就是在tcp/ip协议栈中放置HOOK(俗称钩子函数),数据包被协议栈处理时,遇到HOOK函数,就执行HOOK函数中的操作:数据包过滤、NAT、连接跟踪。
firewalld和iptables都只是防火墙管理工具。并且firewalld底层调用的仍然是iptables的命令。
firewalld与iptables的区别
- firewalld实行白名单机制,iptables实行黑名单机制。
- firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
如何使用firewalld?
zones管理
有哪些zones?
- drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连
接。 - block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的icmp6-adm-prohibited 信息所拒绝。 - public(公共)
在公共区域内使用,不能相信网络内的其他计算机,只能接收经过选取的连
接。 - external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算
机,只能接收经过选择的连接。 - dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内
部网络,仅仅接收经过选择的连接。 - work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接
收经过选择的连接。 - home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。
仅仅接收经过选择的连接。 - internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。
仅仅接受经过选择的连接。 - trusted(信任)
可接受所有的网络连接。
除开以上自带的9个zones,我们还可以自己添加自己的zone。# firewall-cmd --new-zone=test --permanent
当然这个zone是什么功能可以自己通过规则定义。
如何使用zones?
其实就是把某一张网卡指定在某一个zone中,这样这张网卡的网络就受到这个zone中规则的保护。
一张网卡只能指定一个zone。
firewalld默认的区域是public。
常用操作:
- 查看所有zone:
# firewall-cmd --get-zones
- 把ens3指定在public:
# firewall-cmd --zone=public --add-interface=ens3
- 把ens3的zone修改为block:
# firewall-cmd --zone=block --change-interface=ens3
- 从block中删除ens3:
# firewall-cmd --zone=block --remove-interface=ens3
服务和端口管理
放行服务和端口
以下这些服务都是firewalld记录了端口号的:
1 | # firewall-cmd --get-services |
他们记录在/usr/lib/firewalld/services/
目录下的xml文件中:
1 | # cat /usr/lib/firewalld/services/ssh.xml |
这样的好处就是就算你不记得服务的端口号也没有关系。
当然如果你需要开放的服务firewalld没有记录,你也可以在/usr/lib/firewalld/services/
添加你的xml文件,或者直接开放端口。
1
2# firewall-cmd --zone=work --add-service=ssh
# firewall-cmd --zone=work --add-port=22/tcp
以上以ssh为例,效果是一样的,都是在work中开放ssh的端口。
端口转发
1 | # firewall-cmd --zone=external --add-masquerade |
打开端口伪装功能,然后把22端口收到的转发至3777端口。
direct interface
前面我们提到firewalld底层调用的是iptables的命令,其实我们可以直接的使用iptables的规则。
firewalld有一个功能叫direct interface。
direct interface如何使用
1 | # iptables -t filter -A INPUT_direct -p tcp --dport 443 -j ACCEPT |
以上两条命令的效果是一致的,firewall-cmd的命令中数字0代表优先级。
富语言
firewalld的富语言(rich language)提供了一种不需要了解iptables语法的通过高级语言配置复杂IPv4和IPv6防火墙规则的机制。
富语言的功能特别丰富举个例子:
1 | firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' |
总结
firewalld的功能十分强大,也十分人性化,爸爸妈妈再也不用担心我搞不懂iptables的四表五链了。
其实iptables的四表五链还是要懂的,我记得我曾经做过一个数据包从网卡A(外网)进网卡B(内网NAT环境)出的项目,还是用direct interface调的iptables的命令。富语言没那么好用。