一般来说安装完docker之后,它就会在iptables里创建几个chain,它需要通过iptables来实现自身的网络功能。
比如你启动容器时候使用指定 -p 8080:8080参数,就会发现它往IPTABLES里写了一些东西
iptables -L DOCKER
iptables --list
命令可以查看,
不过这个规则透过firewalld是看不到的,较新版本的redhat中加入FIREWALLD主要是为了引入区域概念、简化操作和易于理解,说白了就是用于解放iptables冗长的命令。
可他却是透过IPTABLES来完成自身功能的,本质上FIREWALLD是建立在IPTABLES之上的一个应用。
结论:docker并不是绕过了防火墙,只是应为它往iptables里写了规则,你在firewalld里看不到而已。
docker这个“接管”iptables的问题引起了很多用户的反对
————————————————
版权声明:本文为CSDN博主「aganliang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aganliang/article/details/105129808
原来我已用docker安装了jumpserver,并映射出端口,外网能正常访问jumpserver。后来某一天发现外网访问不了jumpserver,也无法用telnet连接jumpserver的相应IP及端口。但在docker的宿主机内,可以用telnet正常连接jumpserver的端口。所以觉得可能是防火墙的原因,firewall-cmd --list-all-zone查看防火墙,没发现开放jumpserver的相应端口,于是我添加放行相应端口。但还是无法访问jumpserver。于是我关闭防火墙,终于可以正常访问jumpserver,断定确实是防火墙原因。但是我明明添加放行相应端口了还是无法访问呢?几经折腾,找到诸如以上文章,但以上文章说的是docker中的运行的容器在映射相应端口后,不用另外在宿主机的防火墙添加放行相应端口。于是我重启宿主机,在firewalld运行的情况下,发现又可以正常访问jumpserver了。所以结论是:docker启动jumpserver容器,并映射所需端口的时候,会自动给firewalld的底层iptables添加规则,放行所有对docker容器的访问,但某个时候(我也不知道原因)失效了,即使重启firewalld还是无效,只有重启宿主机才有效,如果技术到家,应该可以不用重启宿主机。下次在遇到的话,就得深入iptables,比如先用上文中的命令:
iptables -L DOCKER
iptables --list
然后……再然后……还是先深入firewalld和iptables吧