Debian/Ubuntu/CentOS 的防火墙差异

  linux干货

写这篇文章的原因是之前和朋友讨论时,对 Linux 的防火墙问题产生了截然不同的观点,继续交流后才发现原来是各自常用的发行版不同,朋友日常都用 Ubuntu 居多,而我自己则是 CentOS 居多,正好这俩系统的防火墙默认规则完全不一样,导致产生了完全不同的认知。

这里就开一篇文章,试着梳理一下 Debian/Ubuntu/CentOS 这最常用的三大发行版的防火墙规则异同。

【Debian】

Debian 默认自带了 iptables,而 iptables 规则默认是开放所有端口,看起来效果等同于没有防火墙一样。

分别运行:

whereis iptables

iptables -L

可以查看 iptables 安装位置和规则情况,默认情况下命令反馈如下图

iptables 默认规则是需要拒绝的才去手动禁止,不然就是开放。当然也可以手动改成默认全关,手动指定放行的端口。

默认端口全开的好处自然是使用方便了,软件都是装完就能直接使用,但缺点就是存在安全隐患,比如运行数据库之类的,需要根据自己使用情况修改规则。

iptables 的优点是功能强大,不仅仅是简单作为防火墙,还可以实现其他很多功能,缺点是配置比较复杂。

要注意的是从 Debian10 开始,默认防火墙管理则开始逐渐从 iptables 过渡到 nftables,虽然 iptables 还能继续使用,但后续肯定是会往更新的发展。


【Ubuntu】

Ubuntu 虽然是基于 Debian,不过防火墙这块有相同的,也有不同的,相同的是 Ubuntu 里同样自带了 iptables,不一样的地方是还内置了 Ubuntu 专属的 UFW 管理工具。

UFW 是 Uncomplicated Firewall 的简称,名字足够直白,意思就是不复杂的防火墙,。UFW 默认并不开启,输入 ufw status 可以看到默认状态为 inactive。

默认情况下,UFW 禁止了所有进入连接,允许所有出去的连接。

查看 iptables 规则的话,可以看到 UFW 往里写了很多自己的 “私货”:

如果要启动 UFW,直接运行 ufw enable 即可。

UFW 的使用命令非常的简单明了,要放行指定服务的端口的话,可以直接使用服务名称,比如要放行 SSH 的 22 端口,可以直接运行:

ufw allow ssh

然后输入 ufw status 即可看到自动添加好了对应的 22 端口规则,实际命令效果等同于:

ufw allow 22/tcp

UFW 的本质其实是一个 iptables 的前端控制工具,目的是简化 iptables 的配置,用户只要用很简单的命令就能操作 UFW,其底层还是基于 iptables。

通俗来说,UFW 相当于一个 iptables 的代理人,你可以用很简单的语言和这个代理人传达你的需求,然后 UFW 作为代理人再去和复杂的 iptables 打交道,总体上节省用户的精力。

整个命令传达流程为 ufw->iptables->netfilter,iptables 最终把命令提交给内核的 netfilter 处理。

可见 Ubuntu 里的防火墙配置并没有谁替代谁的关系,对于老手,依旧可以用自己熟悉的 iptables;对于新手,则可以选择 UFW 快速上手。


【CentOS】

CentOS 在 6 及之前的版本里只使用 iptables,从 7 开始其实和 Ubuntu 类似,提供了 firewalld 作为便捷配置防火墙的工具。

与其他系统不同的是 firewalld 默认就是跟随系统启动的,并且规则默认是禁止所有端口进入(22 这种 SSH 必要端口除外),因此在 CentOS 里,配置各种涉及端口的服务时都要记得先去放行对应端口。

firewalld 底层实际还是调用 iptables 来处理的,本身也是作为一个简化配置 iptables 的工具存在。

firewalld 的优点是规则即时生效,不用去手动刷新,这个很方便。

要注意的是从 CentOS8 开始,nftables 作为新的防火墙后端开始替代 iptables,firewalld 也就变成了 nftables 的前端。


总体来说 Linux 发行版的防火墙方面确实有点乱,本文也是简单做个梳理,不少资料都来自网上查找,具体还是需要实践中配合整理才能更好明白这方面的知识。