【虚拟化无代理】【中控】控制中心无法访问且显示报错:“An error occurred”

戴红昌发表于:2020年09月17日 12:26:57更新于:2020年11月03日 17:43:04

问题现象:

打开虚拟化安全管理系统时web页面提示“An error occurred”,无法登陆控制中心。

image.png

问题分析:

查看日志/opt/nubosh/vmsec-ctrl/nginx/log/access.log,nginx访问tomcat返回8088端口“failed(111:Connection refused)

image.png


查看8088端口被8088端口访问, 8088端口被占用故Tomcat8088端口无法正常监听,该故障概率出现在Tomcat重启的过程中(#/etc/init.d/vmsec-ctrl restart)

Tomcat监听8088端口主要功能

  • 提供用户操作界面

  • 接收来自主机安全模块的状态,日志等

$netstat -ano |grep 8088

image.png

同一个机器上的两个模块A和B通信,A模块会向B模块的监听套接字发起连接请求,B模块重启的时候就很容易出现这样的问题

相关解析参考链接(https://blog.csdn.net/justlinux2010/article/details/20947609


这种类型的连接产生的过程类似于同时打开的情况。同时打开的情况是两个机器同时向另一个机器的已知端口发送SYN段,一个机器上发送的SYN段的目的IP和端口是另一个机器上发送SYN段的套接字的本地IP和端口(注意这两个机器上没有对应端口的监听套接字),状态迁移过程如下图所示:

image.png


这里看到的连接的建立过程只发生在一个机器、一个套接字上,但是过程几乎是一样的。我们假设套接字名称是sk,调用bind将sk套接字的本地IP绑定为192.168.56.101,本地端口绑定为9090。首先,sk向目的IP是192.168.56.101,目的端口是9090的服务器发送SYN段,在发送SYN段之前,协议栈会将sk这个套接字的目的地址设置为192.168.56.101,目的端口设置为9090。当然,这个SYN段肯定是会在本机上进行接收处理。接收到这个SYN段后,会调用__inet_lookup()来查找对应的套接字。由于这个SYN段的源目的IP和端口信息和sk套接字的信息完全匹配,所以会由sk套接字来处理。sk套接字的状态会迁移到SYN_RCVD,然后发送SYN+ACK段。这个SYN+ACK段还是会由本机上的sk套接字处理。在SYN_RCVD状态下接收到SYN+ACK段,套接字的状态会迁移到ESTABLISHED。因为此时sk套接字期望接收的序列号,要比SYN+ACK段的序列号大1,相当于接收到了重复的段,所以还要发送一个D-ACK段,表示接收到了重复的段,但是不会影响sk套接字的状态。状态迁移过程如下所示:


image.png

解决方案:

先停止Nginx

#/etc/init.d/vmsec-Nginx stop

再重启Tomcat

#/etc/init.d/vmsec-ctrl restart