作者:wutaotao
我们知道,经典版imanager在实际项目部署时面对的是真实的物理机或虚拟的云主机环境,这种情况下出于安全考虑,服务器的防火墙需要是开启的状态。经典版imanager为了能够在这种情况下成功部署,超图研发团队给出了所有需要开放的端口列表,如imanager 1020版本的端口列表可以看1020版在线帮助文档,但具体如何开放端口以及如何验证开放端口的有效性文档中并没有给出,本文就这一点给出了方便执行的脚本和简单的验证步骤。以下为具体实验内容,文末给出了简明步骤,逐步执行即可。
注意,本实验内容为centos 7.9 x86_64系统环境,经典版imanager 1020版本, 并且假定读者已能在关闭防火墙的情况下成功部署imanager。
实验内容
-
首先在部署前开启防火墙,如果没有开启则使用
systemctl start firewalld
开启。开启后检查防火墙状态
有用户是先关闭了防火墙部署成功后想要再开启防火墙,具体步骤如下
先使用shutdown.sh或uninstall.sh脚本停止imanager
用
systemctl start firewalld
开启防火墙执行startup.sh脚本,此时命令行就会报出如下错误 这个报错原因是因为防火墙的开启删除了docker的iptables条目导致,此时重新启动docker即可,重启过程中docker会重新创建这些条目。
systemctl restart docker
-
执行startup.sh脚本启动imanager。通过命令
docker logs -f imanager
实时查看imanager容器日志,等待一段时间后,看到imanager容器日志输出如[main] org.apache.catalina.startup.Catalina.start Server startup in 684532 ms
字样,说明imanager容器启动完成,此时imanagerIP:8390
页面访问失败,按F12看控制台报如下错误(因为我们还没有开放需要的端口) -
centos开启防火墙端口目前有2种方式,iptables和firewalld, 笔者这里使用的是firewalld方式。根据在线帮助文档得到需要开启的全部端口,并使用命令逐一开启,整理得到以下脚本openPorts.sh
#!/bin/bash echo "before operating, opened port are: " firewall-cmd --zone=public --list-ports firewall-cmd --zone=public --add-port=9083/tcp --permanent firewall-cmd --zone=public --add-port=8390/tcp --permanent firewall-cmd --zone=public --add-port=443/tcp --permanent firewall-cmd --zone=public --add-port=88/tcp --permanent firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-port=10051/tcp --permanent firewall-cmd --zone=public --add-port=10052/tcp --permanent firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --zone=public --add-port=5001/tcp --permanent firewall-cmd --zone=public --add-port=32768/tcp --permanent firewall-cmd --zone=public --add-port=5601/tcp --permanent firewall-cmd --zone=public --add-port=9201/tcp --permanent firewall-cmd --zone=public --add-port=9301/tcp --permanent firewall-cmd --zone=public --add-port=9090/tcp --permanent firewall-cmd --zone=public --add-port=3000/tcp --permanent firewall-cmd --zone=public --add-port=3308/tcp --permanent firewall-cmd --zone=public --add-port=89/tcp --permanent firewall-cmd --zone=public --add-port=8500/tcp --permanent firewall-cmd --zone=public --add-port=9183/tcp --permanent firewall-cmd --zone=public --add-port=9283/tcp --permanent firewall-cmd --zone=public --add-port=3316/tcp --permanent firewall-cmd --zone=public --add-port=3336/tcp --permanent firewall-cmd --zone=public --add-port=8122/tcp --permanent firewall-cmd --zone=public --add-port=8123/tcp --permanent firewall-cmd --reload echo "after operating, opened port are: " firewall-cmd --zone=public --list-ports
-
执行该脚本后,发现8390页面仍然无法访问,这是因为即使firewalld reload了端口的设置,但docker容器并没有检测到firewalld端口的变化,具体情况可参考这个issue的讨论
FirewallD doesn't go well with Docker · Issue #461 · firewalld/firewalld · GitHub
我们可以通过重启docker或重启imanager来使防火墙的变化被docker容器感知到。
-
笔者执行了重启docker,命令执行完成后通过
docker logs -f imanager
查看imanager容器日志,同样等待出现server startup in xxxx ms
时说明imanager启动完成,此时再访问8390页面即可访问成功
验证
以上实验内容就完成了开启防火墙情况下imanager的部署过程,但如果我们关闭了相应的端口,imanager还能访问到么?或者某些情况下需要临时关闭某些端口怎么办?笔者同样整理了一个关闭端口的脚本removePorts.sh,读者们可以根据具体需求加以修改使用
#!/bin/bash echo "before operating, opened port are: " firewall-cmd --zone=public --list-ports firewall-cmd --zone=public --remove-port=9083/tcp --permanent firewall-cmd --zone=public --remove-port=8390/tcp --permanent firewall-cmd --zone=public --remove-port=443/tcp --permanent firewall-cmd --zone=public --remove-port=88/tcp --permanent firewall-cmd --zone=public --remove-port=80/tcp --permanent firewall-cmd --zone=public --remove-port=10051/tcp --permanent firewall-cmd --zone=public --remove-port=10052/tcp --permanent firewall-cmd --zone=public --remove-port=3306/tcp --permanent firewall-cmd --zone=public --remove-port=5001/tcp --permanent firewall-cmd --zone=public --remove-port=32768/tcp --permanent firewall-cmd --zone=public --remove-port=5601/tcp --permanent firewall-cmd --zone=public --remove-port=9201/tcp --permanent firewall-cmd --zone=public --remove-port=9301/tcp --permanent firewall-cmd --zone=public --remove-port=9090/tcp --permanent firewall-cmd --zone=public --remove-port=3000/tcp --permanent firewall-cmd --zone=public --remove-port=3308/tcp --permanent firewall-cmd --zone=public --remove-port=89/tcp --permanent firewall-cmd --zone=public --remove-port=8500/tcp --permanent firewall-cmd --zone=public --remove-port=9183/tcp --permanent firewall-cmd --zone=public --remove-port=9283/tcp --permanent firewall-cmd --zone=public --remove-port=3316/tcp --permanent firewall-cmd --zone=public --remove-port=3336/tcp --permanent firewall-cmd --zone=public --remove-port=8122/tcp --permanent firewall-cmd --zone=public --remove-port=8123/tcp --permanent firewall-cmd --reload echo "after operating, opened port are: " firewall-cmd --zone=public --list-ports
注意,同以上开放端口的情况一样,执行该脚本后立即去访问8390页面,发现imanager页面还是可以访问的,这里也是因为docker和firewalld的兼容性问题,所以仍然需要重启docker或imanager后再来验证,可以发现重启后就无法访问了(虽然firewalld和docker没有完全兼容,但firewalld命令比iptables简洁清晰, 还是推荐使用)。
简明步骤
已经关闭防火墙部署成功后的情况
-
systemctl start firewalld
-
./openPorts.sh,脚本内容见上文实验内容第3点
-
systemctl restart docker 如果替换成重启imanager会导致报错如
(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8390 -j DNAT --to-destination 172.18.0.7:8390 ! -i br-a2219f708014: iptables: No chain/target/match by that name. (exit status 1))
-
docker logs -f imanager
查看imanager容器日志,等待启动完成即可。
尚未部署或重新部署的情况
-
systemctl start firewalld (若之前尚未开启)
-
./openPorts.sh,脚本内容见上文实验内容第3点
-
./startup.sh 若有报错见上文实验内容第一点,也是重启docker
-
docker logs -f imanager
查看imanager容器日志,等待启动完成即可。