月下博客

CentOS 8的firewalld已经与iptables解绑

今天有人找上我,说之前用的一键安装脚本不好使了,希望我能帮忙看看怎么回事。

根据他的描述,初步断定是系统多次安装某个依赖导致。仔细询问,他每次有问题都直接重建vps,不应该存在这个问题。接着猜测应该是脚本与当前系统不匹配,脚本太久没更新所以安装报错。他说的脚本既不是我写的也没用过,让他联系作者反馈估计很难也不能解决当下问题,于是帮忙找了另外一个一键安装脚本让其尝试。

新的脚本很快就将所需软件安装成功,但是出现无法连接的问题。考虑到服务器有可能被屏蔽掉,于是用境外服务器连接,同样不能连上。接着指导他排除服务未启动、iptables端口和服务商防火墙未放行等因素,问题依旧。

很久没碰到这么奇怪的状况,于是向他要了root密码,亲自登录服务器查看问题。首先用ps aux | grep xxx查看进程,确认软件正常运行;接着netstat -nltp查看端口监听,确认端口一直且正在被监听;iptables -nL查看系统内置防火墙,输出为空,说明iptables没有屏蔽进程监听的端口。然而在这样的配置下,依然无法telnet远程连接到这台服务器。问题到底出现在哪里?

会不会是因为进程的问题?于是测试用ssh进程监听端口,无法连接;换一个端口,还是连不上;改成常用的80和443端口,也telnet不过去。测试了多个进程和端口,除了ssh的22端口,不管哪个进程监听的其他端口都不行。

走到这个地步,不是系统有问题便是我的水平有问题。于是用uname -a查看系统版本,输出如下:Linux xxx 4.18.0-80.7.1.el8_0.x86_64 #1 SMP Sat Aug 3 10:14:00 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux。信息略显杂乱,但还是能让人一眼就看出问题所在:el8,系统竟然是CentOS 8

到此一切都明朗了:之前的一键安装脚本报错不好用了,因为脚本只适用于6和7,CentOS 8刚出来没多久没有测试过;我找的一键安装脚本能安装和运行,无法连接是因为CentOS 8中firewalld已经与iptables解绑,后端改用nftables,这便是iptables -nL输出为空还是无法连接的真正原因;要想连接上,只需要用nft或者firewall-cmd放行相应的端口即可:

firewall-cmd --permanent --add-port=xxxx/tcp
firewall-cmd --reload

向他解释这些有点难度,于是让他重建vps时选CentOS 7,一键安装脚本好用了,也能远程连接过去了。

CentOS 8打开了一个新世界。

参考

  1. https://www.zdnet.com/article/red-hats-centos-8-arrives-heres-what-you-get-with-it/
  2. https://developers.redhat.com/blog/2016/10/28/what-comes-after-iptables-its-successor-of-course-nftables/