CentOS-8的firewalld已经与iptables解绑

文章转载自: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/tcpfirewall-cmd --reload向他解释这些有点难度,于是让他重建vps时选CentOS 7,一键安装脚本好用了,也能远程连接过去了。 CentOS 8打开了一个新世界。 参考https://www.zdnet.com/article...https://developers.redhat.com...

October 7, 2019 · 1 min · jiezi

解决 docker 容器无法通过 IP 访问宿主机问题

问题起源在使用 docker 的过程中我不幸需要在 docker 容器中访问宿主机的 80 端口, 而这个 80 端口是另外一个容器 8080 端口映射出去的. 当我在容器里通过 docker 的网桥 172.17.0.1 访问宿主机时, 居然发现:curl: (7) Failed to connect to 172.17.0.1 port 80: No route to host查找问题原因可以确定的是容器与宿主机是有网络连接的, 因为可以在容器内部通过 172.17.0.1 Ping 通宿主机:root@930d07576eef:/# ping 172.17.0.1PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.130 ms也可以在容器内部访问其它内网和外网.iptables 显示也允许 docker 容器访问:# iptables –list | grep DOCKERDOCKER-ISOLATION all – anywhere anywhere DOCKER all – anywhere anywhere Chain DOCKER (1 references)Chain DOCKER-ISOLATION (1 references)之后在查找一些资料后发现这个问题: NO ROUTE TO HOST network request from container to host-ip:port published from other container.解释正如 Docker Community Forms 所言, 这是一个已知的 Bug, 宿主机的 80 端口允许其它计算机访问, 但是不允许来自本机的 Docker 容器访问. 必须通过设置 firewalld 规则允许本机的 Docker 容器访问.gypark 指出可以通过在 /etc/firewalld/zones/public.xml 中添加防火墙规则避免这个问题:<rule family=“ipv4”> <source address=“172.17.0.0/16” /> <accept /></rule>注意这里的 172.17.0.0/16 可以匹配 172.17.xx.xx IP 段的所有 IP.之后重启下防火墙:systemctl restart firewalld之后就可以在 docker 容器内部访问宿主机 80 端口.其它问题实际上当我又用 vmware 新开了一台虚拟机希望能重现这个问题的时候, 发现在新的虚拟机上居然没有类似的问题. 也就是说容器可以直接通过172.17.0.1访问宿主机 80 端口, 查看防火墙配置也没看到有172.17.xx.xx的白名单.猜测是由于在新的虚拟机安装的 docker 是 Docker version 1.12.5, build 047e51b/1.12.5, 也就是 Red Hat 从 docker 开源版本迁出开发的版本, 而之前的是 Docker version 17.06.2-ce, build cec0b72 属于 Docker-CE, 可能是 docker 版本有差异, Red Hat 顺便把那个 Known Bug 修复了. ...

January 9, 2019 · 1 min · jiezi