从外包到开发(第1部分)

大家好,我的名字是谢尔盖·埃梅利扬奇克。 我是 Audit-Telecom 公司的负责人,Veliam 系统的主要开发者和作者。 我决定写一篇文章,讲述我和朋友如何创建一家外包公司,为自己编写软件,然后开始通过 SaaS 系统将其分发给每个人。 关于我如何断然不相信这是可能的。 这篇文章不仅包含一个故事,还包含有关 Veliam 产品如何创建的技术细节。 包括一些源代码。 我会告诉你我们犯了哪些错误以及后来我们如何纠正这些错误。 有人质疑是否发表这样的文章。 但我认为这样做,获得反馈并改进,比不发表文章并思考如果......会发生什么更好。

史前

我曾在一家公司担任 IT 员工。 该公司规模相当大,网络结构广泛。 我不会详述我的工作职责,我只会说它们绝对不包括任何开发。

我们有监控,但纯粹出于学术兴趣,我想尝试编写自己最简单的一个。 我的想法是这样的:我希望它能在网络上,这样我就可以轻松地进入而无需安装任何客户端,并从任何设备(包括通过 Wi-Fi 的移动设备)查看网络发生了什么情况,而且我也真的想要快速了解房间里的设备变得“闷闷不乐”,因为...... 对此类问题的响应时间有非常严格的要求。 于是,我的脑海中诞生了一个计划,写一个简单的网页,上面有一张jpeg背景和一张网络图,把图中的设备本身及其IP地址剪下来,并在上面显示动态内容。以绿色或闪烁红色 IP 地址形式显示所需坐标中的图片。 任务已定,让我们开始吧。

此前,我使用 Delphi、PHP、JS 和非常肤浅的 C++ 进行编程。 我非常了解网络是如何运作的。 VLAN、路由(OSPF、EIGRP、BGP)、NAT。 这足以让我自己编写一个原始的监控原型。

我用 PHP 写了我的计划。 Apache 和 PHP 服务器位于 Windows 上,因为...... 当时 Linux 对我来说是一个难以理解且非常复杂的东西,后来证明,我错了,在很多地方 Linux 比 Windows 简单得多,但这是一个单独的话题,我们都知道上面有多少个 holivars。这个话题。 Windows 任务调度程序以很小的间隔(我记不太清了,但大约每三秒一次)拉取一个 PHP 脚本,该脚本使用平庸的 ping 轮询所有对象并将状态保存到文件中。

system(“ping -n 3 -w 100 {$ip_address}“); 

是的,是的,当时我还没有掌握如何使用数据库。 我不知道可以并行处理进程,并且遍历所有网络节点花了很长时间,因为...... 这发生在一个线程中。 当多个节点不可用时,问题尤其会出现,因为他们每个人都将脚本延迟了 300 毫秒。 在客户端,有一个简单的循环函数,每隔几秒钟,通过 Ajax 请求从服务器下载更新的信息并更新界面。 好吧,那么,连续3次ping不成功后,如果电脑上打开一个带有监控的网页,就会播放出欢快的乐曲。

当一切顺利时,我对结果感到非常鼓舞,并认为我可以添加更多内容(由于我的知识和能力)。 但我一直不喜欢拥有一百万张图表的系统,我当时认为,直到今天仍然认为,在大多数情况下这是不必要的。 我只想把真正对我的工作有帮助的东西放在那里。 时至今日,这一原则仍然是 Veliam 发展的基础。 此外,我意识到,如果我不必保持监控打开并了解问题,并且当问题发生时,然后打开页面并查看这个有问题的网络节点位于何处以及接下来如何处理它,那将是非常酷的。 不知何故,我当时没有阅读电子邮件,我只是没有使用它。 我在互联网上发现有一些 SMS 网关,您可以向其发送 GET 或 POST 请求,它们会将我编写的文本发送到我的手机。 我立刻意识到我真的想要这个。 我开始研究文档。 一段时间后我成功了,现在我的手机上收到了一条关于网络问题的短信,名为“坠落物体”。 虽然这个系统很原始,但它是我自己写的,促使我开发它的最重要的一点是它是一个对我的工作确实有帮助的应用程序。

然后有一天,一个互联网频道在工作时出现故障,而我的监控并没有让我知道这一点。 由于 Google DNS 仍然可以完美地执行 ping 操作。 是时候考虑如何监控通信通道是否处于活动状态。 对于如何做到这一点,存在不同的想法。 我无法使用所有设备。 我们必须弄清楚如何了解哪些频道是直播的,但无法以某种方式在网络设备本身上查看它。 然后一位同事想到了一个想法,即根据当前用于访问互联网的通信通道的不同,到公共服务器的路由跟踪可能会有所不同。 我查了一下,结果是这样的。 追踪的时候有不同的路线。

system(“tracert -d -w 500 8.8.8.8”);

因此出现了另一个脚本,或者更确切地说,由于某种原因,跟踪被添加到同一脚本的末尾,该脚本对网络上的所有设备进行 ping 操作。 毕竟,这又是一个在同一个线程中执行的长进程,减慢了整个脚本的工作速度。 但后来就没那么明显了。 但无论如何,他完成了他的工作,代码严格定义了每个通道应该进行什么样的跟踪。 这就是系统开始工作的方式,它已经监控了(大声说,因为没有收集任何指标,只是 ping)网络设备(路由器、交换机、wi-fi 等)以及与外界的通信通道。 短信定期到达,图表总是清楚地显示问题所在。

而且,在日常工作中,我还要进行交叉。 我厌倦了每次都去思科交换机看看要使用哪个接口。 如果单击监控中的对象并查看其接口列表和描述,那该多酷啊。 这会节省我的时间。 此外,在此方案中,无需运行 Putty 或 SecureCRT 来输入帐户和命令。 我只是点击监控,看到需要什么,然后去做我的工作。 我开始寻找与开关交互的方法。 我立即想到了 2 个选项:SNMP 或通过 SSH 登录交换机,输入我需要的命令并解析结果。 我之所以放弃 SNMP,是因为它实现的复杂性;我迫不及待地想要得到结果。 使用 SNMP,您必须深入研究 MIB 很长时间,并根据这些数据生成有关接口的数据。 CISCO有一支优秀的团队

show interface status

它准确地显示了我对交叉路口的需求。 我想,当我只想查看该命令的输出时,为什么要费心使用 SNMP。 一段时间后,我意识到了这个机会。 单击网页上的对象。 触发了一个事件,AJAX 客户端联系服务器,然后服务器通过 SSH 连接到我需要的交换机(凭据被硬编码到代码中,没有必要对其进行改进,以制作一些单独的菜单,其中可以从界面更改帐户,我需要结果并且很快)我在那里输入了上述命令并将其发送回浏览器。 于是我开始一键查看界面信息。 这非常方便,特别是当您必须同时在不同的交换机上查看此信息时。

基于跟踪的通道监控最终并不是最好的主意,因为...... 有时工作是在网络上进行的,追踪可能会发生变化,监控开始向我尖叫,说通道有问题。 但花了很多时间分析后,我意识到所有渠道都在工作,我的监控在欺骗我。 因此,我要求管理通道形成交换机的同事在邻居可见性状态发生变化时向我发送系统日志。 因此,它比追踪更简单、更快、更准确。 像邻居丢失这样的事件已经到来,我立即发出有关频道关闭的通知。

此外,点击某个对象时会出现更多命令,并添加 SNMP 来收集一些指标,基本上就是这样。 该系统从未进一步发展。 它满足了我需要的一切,是一个很好的工具。 很多读者可能会告诉我,网上已经有很多软件可以解决这些问题。 但事实上,我当时并没有在谷歌上搜索过这样的免费产品,我真的很想发展我的编程技能,还有什么比真正的应用程序问题更好的方法来推动这一点。 至此,第一版监控完成,不再修改。

成立审计电信公司

随着时间的推移,我开始在其他公司兼职,幸运的是我的工作时间允许我这样做。 当你在不同的公司工作时,你各方面的技能成长得很快,你的视野也拓展得很好。 正如他们所说,在有些公司里,你是一个瑞典人、一个收割者和一个小号手。 一方面,这很困难,另一方面,如果你不懒惰,你就会成为一名多面手,这可以让你更快、更有效地解决问题,因为你知道相关领域是如何运作的。

我的朋友 Pavel(也是一名 IT 专家)不断尝试鼓励我开创自己的事业。 他们有无数的想法,但他们所做的事情却有不同的变化。 这已经讨论了很多年。 最终,它不应该有任何结果,因为我是一个怀疑论者,而帕维尔是一个梦想家。 每次他提出一个想法,我总是不相信,拒绝参与。 但我们真的很想开办自己的生意。

最后,我们找到了一个适合我们双方的选择,并做了我们知道该怎么做的事情。 2016年,我们决定创建一家IT公司,帮助企业解决IT问题。 这是 IT 系统(1C、终端服务器、邮件服务器等)的部署、维护、用户和网络管理的经典帮助台。

坦白说,在创建公司的时候,我99,9%都不相信。 但不知怎的,帕维尔让我去尝试,展望未来,事实证明他是对的。 帕维尔和我每人捐了 300 万卢布,注册了一家新的有限责任公司“审计电信”,租了一间小办公室,制作了很酷的名片,嗯,总的来说,就像大多数没有经验的新手商人一样,然后开始寻找客户。 寻找客户是一个完全不同的故事。 如果有人感兴趣的话,也许我们会写一篇单独的文章作为公司博客的一部分。 推销电话、传单等这没有给出任何结果。 正如我现在读到的许多有关商业的故事一样,无论怎样,很大程度上取决于运气。 我们很幸运。 公司成立几周后,我的兄弟弗拉基米尔找到了我们,他为我们带来了第一个客户。 我不会让您厌倦与客户合作的细节,这不是本文的内容,我只是说我们进行了审核,确定了关键领域,并且在决定是否做出决定时,这些领域出现了问题。作为外包商与我们持续合作。 此后,立即做出了积极的决定。

然后,主要是通过朋友的口耳相传,其他服务公司开始出现。 帮助台位于一个系统中。 与网络设备和服务器的连接是不同的,或者说是不同的。 有些人保存了快捷方式,其他人则使用 RDP 地址簿。 监控是另一个独立的系统。 一个团队在不同的系统中工作是非常不方便的。 重要信息被忽视。 嗯,例如,客户端的终端服务器变得不可用。 立即收到该客户端用户的申请。 支持专家提出请求(通过电话收到)。 如果事件和请求在一个系统中注册,那么支持专家将立即了解用户的问题是什么并告诉他,同时连接到所需的对象以解决问题。 每个人都了解战术情况并协调工作。 我们还没有找到一个将所有这些结合起来的系统。 很明显,是时候生产我们自己的产品了。

继续致力于您的监控系统

很明显,之前编写的系统完全不适合现在的任务。 无论是在功能方面还是在质量方面。 于是决定从头开始编写这个系统。 从图形上看,它应该看起来完全不同。 它必须是一个分层系统,以便能够快速方便地为正确的客户打开正确的对象。 第一个版本中的方案在当前情况下绝对不合理,因为客户不同,设备位于哪个场所根本不重要。 这已经转移到文档中。

所以任务是:

  1. 层次结构;
  2. 某种服务器部分可以以虚拟机的形式放置在客户端的场所,以收集我们需要的指标并将其发送到中央服务器,中央服务器将汇总所有这些并向我们显示;
  3. 警报。 那些不能错过的,因为... 那时不可能有人坐着看显示器;
  4. 应用系统。 客户开始出现,我们不仅为他们提供服务器和网络设备服务,还为他们提供工作站服务;
  5. 能够快速连接系统中的服务器和设备;

任务已经确定,我们开始写。 一路上,处理客户的请求。 那时我们已经有4个人了。 我们开始同时编写两个部分:中央服务器和用于安装到客户端的服务器。 至此,Linux 对我们来说不再陌生,我们决定客户拥有的虚拟机将在 Debian 上。 不会有安装程序,我们只需在一台特定的虚拟机上创建一个服务器部分项目,然后将其克隆到所需的客户端。 这是另一个错误。 后来我们发现,在这样的方案中,更新机制完全没有开发出来。 那些。 我们添加了一些新功能,然后就出现了将其分发到所有客户端服务器的整个问题,但我们稍后会回到这个问题,一切都按顺序进行。

我们制作了第一个原型。 他能够 ping 通我们需要的客户端网络设备和服务器,并将这些数据发送到我们的中央服务器。 反过来,他在中央服务器上批量更新了这些数据。 在这里,我不仅会写一个关于如何成功以及什么成功的故事,还会写出哪些业余错​​误以及后来我如何不得不随着时间的推移而付出代价。 因此,整个对象树以序列化对象的形式存储在一个文件中。 当我们将多个客户端连接到系统时,一切都或多或少正常,尽管有时会出现一些完全无法理解的工件。 但当我们将十几台服务器连接到系统时,奇迹开始发生。 有时,由于某种未知的原因,系统中的所有对象都消失了。 这里需要注意的是,客户端每隔几秒就通过 POST 请求向中央服务器发送数据。 细心的读者和经验丰富的程序员已经猜到存在对同时从不同线程存储序列化对象的文件进行多次访问的问题。 就在这一切发生的时候,奇迹发生了,物体消失了。 该文件只是变空了。 但这一切并没有立即被发现,而是在多台服务器运行期间才发现的。 在此期间,添加了端口扫描功能(服务器不仅向中央发送有关设备可用性的信息,还发送有关设备上打开的端口的信息)。 这是通过调用命令来完成的:

$connection = @fsockopen($ip, $port, $errno, $errstr, 0.5);

结果常常不正确,并且扫描需要很长时间才能完成。 我完全忘记了 ping,它是通过 fping 完成的:

system("fping -r 3 -t 100 {$this->ip}");

这也不是并行的,因此过程非常长。 后来,验证所需的整个 IP 地址列表立即发送到 fping,然后我们收到了现成的响应者列表。 与我们不同的是,fping 能够并行化进程。

另一项常见的日常工作是通过WEB 设置一些服务。 例如,来自 MS Exchange 的 ECP。 基本上这只是一个链接。 我们决定需要能够将此类链接直接添加到系统中,以便不必在文档或书签中的其他位置查找如何访问特定客户端的 ECP。 这就是系统资源链接概念的出现方式,它们的功能至今仍然可用,并且几乎没有改变。

资源链接在 Veliam 中的工作原理
从外包到开发(第1部分)

远程连接

这就是当前版本的 Veliam 中的实际效果
从外包到开发(第1部分)

其中一项任务是快速方便地连接到服务器,服务器已经有很多(超过一百个),并且对数百万个预先保存的 RDP 快捷方式进行排序非常不方便。 需要一个工具。 互联网上有类似地址簿的软件,用于此类 RDP 连接,但它们没有与监控系统集成,并且无法保存帐户。 当您每天连接数十次到不同的服务器时,每次为不同的客户端输入帐户简直就是地狱。 使用 SSH,情况会好一点;有很多优秀的软件可以让您将此类连接组织到文件夹中并记住其中的帐户。 但有两个问题。 首先,我们没有找到用于 RDP 和 SSH 连接的单个程序。 第二个是,如果在某个时候我不在我的计算机旁并且需要快速连接,或者我刚刚重新安装了系统,我将不得不进入文档来查看该客户端的帐户。 既不方便又浪费时间。

我们的内部产品中已经提供了客户端服务器所需的层次结构。 我只需要弄清楚如何快速连接到那里的必要设备。 对于初学者来说,至少在您的网络内。

考虑到我们系统中的客户端是浏览器,无法访问计算机的本地资源,为了简单地通过一些命令启动我们需要的应用程序,就发明了通过“Windows自定义 url 方案”。 这就是我们系统中某个“插件”的出现方式,它只包括 Putty 和 Remote Desktop Plus,并且在安装过程中,只需在 Windows 中注册 URI 方案。 现在,当我们想要通过 RDP 或 SSH 连接到对象时,我们在系统上单击此操作,自定义 URI 就可以工作了。 启动了 Windows 或 putty 中内置的标准 mstsc.exe,它是“插件”的一部分。 我将插件一词放在引号中,因为这不是传统意义上的浏览器插件。

至少那是一些东西。 方便的地址簿。 此外,就 Putty 而言,一切通常都很好;可以将 IP 连接、登录名和密码作为输入参数。 那些。 我们已经一键连接到网络上的 Linux 服务器,无需输入密码。 但对于 RDP,事情就没那么简单了。 标准 mstsc 无法提供凭据作为参数。 远程桌面增强版来了。 他允许这件事发生。 现在我们可以不用它了,但很长一段时间它都是我们系统中忠实的助手。 对于 HTTP(S) 站点,一切都很简单,只需在浏览器中打开此类对象即可。 方便实用。 但这只是在内网的幸福。

由于我们从办公室远程解决了绝大多数问题,因此最简单的事情就是向客户提供 VPN。 然后就可以从我们的系统连接到它们。 但还是有些不方便。 对于每个客户端,需要在每台计算机上保留一堆记住的VPN连接,并且在连接到任何VPN之前,需要启用相应的VPN。 我们使用这个解决方案很长一段时间。 但客户端的数量在增加,VPN 的数量也在增加,所有这些都开始变得紧张,必须采取一些措施。 重新安装系统后,当我不得不在新的 Windows 配置文件中重新输入数十个 VPN 连接时,我的眼泪尤其夺眶而出。 我说,别再忍受了,并开始思考我能做些什么。

碰巧所有客户端都使用了知名公司 Mikrotik 的设备作为路由器。 它们非常实用且方便,几乎可以执行任何任务。 缺点是它们被“劫持”了。 我们简单地通过关闭所有来自外部的访问来解决这个问题。 但有必要以某种方式在不去客户那里的情况下接触到它们,因为…… 它的长。 我们只是为每个这样的 Mikrotik 制作隧道,并将它们分成一个单独的池。 没有任何路由,因此您的网络与客户端的网络以及它们的网络彼此之间没有连接。

这个想法的诞生是为了确保当我点击系统中我需要的对象时,中央监控服务器知道所有客户端 Mikrotik 的 SSH 帐户,连接到所需的对象,并使用以下命令创建到所需主机的转发规则:所需端口。 这里有几点。 该解决方案并不通用 - 它仅适用于 Mikrotik,因为所有路由器的命令语法都不同。 此外,此类转发必须以某种方式删除,并且我们系统的服务器部分基本上无法以任何方式跟踪我是否已完成 RDP 会话。 嗯,这样的转发对于客户端来说是一个漏洞。 但我们并不追求普遍性,因为…… 该产品仅在我们公司内部使用,并没有向公众发布的想法。

每个问题都以自己的方式得到解决。 创建规则后,此转发仅适用于一个特定的外部 IP 地址(从该地址初始化连接)。 因此避免了安全漏洞。 但对于每个这样的连接,Mikrotik 规则都会添加到 NAT 页面并且不会被清除。 大家都知道,规则越多,路由器处理器的负载就越多。 总的来说,我无法接受有一天我去某个 Mikrotik,那里会出现数百条死的、无用的规则。

由于我们的服务器无法跟踪连接状态,因此让 Mikrotik 自行跟踪它们。 我编写了一个脚本,不断监控所有带有具体描述的转发规则,并检查 TCP 连接是否有合适的规则。 如果一段时间没有,那么连接可能已经完成,可以删除此转发。 一切都很顺利,剧本也很顺利。

顺便说一下,这是:

global atmonrulecounter {"dontDelete"="dontDelete"}
:foreach i in=[/ip firewall nat find comment~"atmon_script_main"] do={ 
	local dstport [/ip firewall nat get value-name="dst-port" $i]
	local dstaddress [/ip firewall nat get value-name="dst-address" $i]
	local dstaddrport "$dstaddress:$dstport"
	#log warning message=$dstaddrport
	local thereIsCon [/ip firewall connection find dst-address~"$dstaddrport"]
	if ($thereIsCon = "") do={
		set ($atmonrulecounter->$dstport) ($atmonrulecounter->$dstport + 1)
		#:log warning message=($atmonrulecounter->$dstport)
		if (($atmonrulecounter->$dstport) > 5) do={
			#log warning message="Removing nat rules added automaticaly by atmon_script"
			/ip firewall nat remove [/ip firewall nat find comment~"atmon_script_main_$dstport"]
			/ip firewall nat remove [/ip firewall nat find comment~"atmon_script_sub_$dstport"]
			set ($atmonrulecounter->$dstport) 0
		}
	} else {
		set ($atmonrulecounter->$dstport) 0
	}
}

当然它可以做得更漂亮、更快等等,但它有效,没有加载 Mikrotik 并且做得非常出色。 我们终于能够一键连接到客户的服务器和网络设备了。 无需打开 VPN 或输入​​密码。 该系统的使用变得非常方便。 服务时间减少了,我们都花时间工作而不是连接到必要的对象。

米克罗蒂克备份

我们将所有 Mikrotik 的备份配置为 FTP。 总的来说一切都很好。 但是当您需要获取备份时,您必须打开此 FTP 并在那里查找。 我们有一个所有路由器都连接的系统;我们可以通过 SSH 与设备通信。 我想,为什么我们不让系统本身每天从所有 Mikrotik 中进行备份呢? 他开始实施它。 我们连接、进行备份并将其保存到存储中。

用于从 Mikrotik 进行备份的 PHP 脚本代码:

<?php

	$IP = '0.0.0.0';
	$LOGIN = 'admin';
	$PASSWORD = '';
	$BACKUP_NAME = 'test';

    $connection = ssh2_connect($IP, 22);

    if (!ssh2_auth_password($connection, $LOGIN, $PASSWORD)) exit;

    ssh2_exec($connection, '/system backup save name="atmon" password="atmon"');
    stream_get_contents($connection);
    ssh2_exec($connection, '/export file="atmon.rsc"');
    stream_get_contents($connection);
    sleep(40); // Waiting bakup makes

    $sftp = ssh2_sftp($connection);

    // Download backup file
    $size = filesize("ssh2.sftp://$sftp/atmon.backup");
    $stream = fopen("ssh2.sftp://$sftp/atmon.backup", 'r');
    $contents = '';
    $read = 0;
    $len = $size;
    while ($read < $len && ($buf = fread($stream, $len - $read))) {
        $read += strlen($buf);
        $contents .= $buf;
    }
    file_put_contents ($BACKUP_NAME . ‘.backup’,$contents);
    @fclose($stream);

    sleep(3);
    // Download RSC file
    $size = filesize("ssh2.sftp://$sftp/atmon.rsc");
    $stream = fopen("ssh2.sftp://$sftp/atmon.rsc", 'r');
    $contents = '';
    $read = 0;
    $len = $size;
    while ($read < $len && ($buf = fread($stream, $len - $read))) {
        $read += strlen($buf);
        $contents .= $buf;
    }
    file_put_contents ($BACKUP_NAME . ‘.rsc’,$contents);
    @fclose($stream);

    ssh2_exec($connection, '/file remove atmon.backup');
    ssh2_exec($connection, '/file remove atmon.rsc');

?>

备份以两种形式进行 - 二进制和文本配置。 二进制文件有助于快速恢复所需的配置,文本文件可以让您了解如果强制更换设备并且二进制文件无法上传到设备,需要做什么。 结果,我们在系统中获得了另一个方便的功能。 此外,在添加新的 Mikrotik 时,无需配置任何内容;我只需将对象添加到系统中并通过 SSH 为其设置一个帐户即可。 然后系统本身负责备份。 当前版本的 SaaS Veliam 尚不具备此功能,但我们很快就会移植它。

内部系统的截图
从外包到开发(第1部分)

过渡到普通数据库存储

我在上面已经写到出现了文物。 有时系统中的整个对象列表消失了,有时在编辑对象时,信息未保存并且对象必须重命名三次。 这让所有人都非常恼火。 对象消失的情况很少发生,并且通过恢复该文件很容易恢复,但编辑对象时失败的情况却经常发生。 也许,我最初没有通过数据库来做到这一点,因为它不符合我的想法,如何在一个平面表中保留一棵包含所有连接的树。 它是扁平的,但树是分层的。 但对于多重访问以及随后(随着系统变得更加复杂)事务而言,DBMS 是一个很好的解决方案。 我可能不是第一个遇到这个问题的人。 我开始谷歌搜索。 事实证明,一切都在我之前被发明了,并且有几种算法可以从平面表构建一棵树。 在查看了每一项之后,我实施了其中一项。 但这已经是新版本的系统了,因为…… 事实上,正因为如此,我不得不重写很多东西。 结果很自然,系统随机行为的问题消失了。 有人可能会说,在软件开发领域,这些错误非常业余(单线程脚本、在文件中存储从不同线程同时访问多次的信息等)。 也许这是真的,但我的主要工作是管理,编程是我灵魂的副业,而且我根本没有在程序员团队中工作的经验,在这种情况下,我的前辈会立即向我建议这些基本的事情同志们。 因此,我自己填补了所有这些坎坷,但我把材料学得很好。 而且,我的工作还包括与客户会面、旨在推广公司的行动、公司内部的一系列行政问题等等。 但无论怎样,已有的东西仍然存在需求。 我和我自己在日常工作中使用了该产品。 坦率地说,有一些不成功的想法和解决方案,浪费了时间,但最终很明显,这不是一个可行的工具,没有人使用它,它也没有最终出现在 Veliam 中。

服务台 - 服务台

提及 HelpDesk 是如何形成的也无可厚非。 这是一个完全不同的故事,因为…… 在 Veliam,这已经是第三个全新版本,与之前的所有版本不同。 现在它是一个简单的系统,直观,没有不必要的花哨,能够与域集成,以及使用电子邮件中的链接从任何地方访问相同的用户配置文件的能力。 最重要的是,可以从任何地方(家里或办公室)直接从应用程序通过 VNC 连接到申请人,无需 VPN 或端口转发。 我会告诉你我们是如何走到这一步的,之前发生了什么,以及做出了哪些可怕的决定。

我们通过著名的 TeamViewer 与用户建立联系。 我们服务的用户的所有计算机都安装了电视。 我们做错的第一件事是将每个高清客户端连接到硬件,随后将其删除。 用户如何登录HD系统以留下请求? 除了电视之外,每个人的计算机上都安装了一个用 Lazarus 编写的特殊实用程序(这里很多人会翻白眼,甚至可能去 Google 一下它是什么,但我所知道的最好的编译语言是 Delphi,Lazarus 几乎是)同样的事情,只是免费)。 一般来说,用户启动一个特殊的批处理文件来启动该实用程序,该实用程序依次读取系统的 HWID,然后启动浏览器并进行授权。 为什么要这样做? 有些公司是单独统计服务用户数量,每个月的服务价格是按照人数来计算的。 你说这是可以理解的,但为什么它与硬件挂钩呢? 很简单,有些人回到家,用家里的笔记本电脑提出了“让这里的一切都为我而美丽”的请求。 除了读取系统 HWID 之外,该实用程序还从注册表中提取当前的 Teamviewer ID 并将其传输给我们。 Teamviewer 有一个用于集成的 API。 我们进行了这种整合。 但有一个问题。 通过这些API,如果用户没有明确发起此会话,则无法连接到用户的计算机,并且在尝试连接到该计算机后,还必须单击“确认”。 当时,对我们来说,在没有用户请求的情况下任何人都不应进行连接似乎是合乎逻辑的,并且由于该人位于计算机旁,因此他将发起会话并对远程连接请求做出肯定响应。 结果一切都错了。 申请人忘记按启动会话,必须在电话交谈中告诉他们这一点。 这不仅浪费了时间,而且让整个过程双方都感到沮丧。 此外,这样的情况并不罕见:一个人提出请求,但只有在他去吃午饭时才允许连接。 因为问题并不严重,他不希望自己的工作进程被打断。 因此,他不会按下任何按钮来允许连接。 这就是登录 HelpDesk 时出现附加功能的方式 - 读取 Teamviwer 的 ID。 我们知道安装 Teamviwer 时使用的永久密码。 更准确地说,只有系统知道它,因为它内置于安装程序和我们的系统中。 因此,应用程序中有一个连接按钮,单击该按钮无需等待任何事情,但 Teamviewer 立即打开并发生连接。 因此,存在两种可能的连接。 通过官方的 Teamviewer API 和我们自制的 API。 令我惊讶的是,他们几乎立即停止使用第一个,尽管有指示仅在特殊情况下以及用户本人同意时才使用它。 不过,现在就给我安全感吧。 但事实证明,申请人并不需要这个。 它们完全可以在没有确认按钮的情况下连接到它们。

在 Linux 中切换到多线程

为预先确定的端口列表的开放性和网络对象的简单 ping 操作而加速网络扫描仪的通过的问题早已开始出现。 当然,首先想到的解决方案是多线程。 由于 ping 的主要时间是等待数据包返回,而只有前一个数据包返回后才能开始下一次 ping,因此即使在拥有 20 多台服务器加上网络设备的公司中,这也已经相当缓慢了。 关键是一个包可能会消失,但不要立即通知系统管理员。 他很快就会停止接受此类垃圾邮件。 这意味着您需要对每个对象多次 ping 操作才能得出不可访问的结论。 在不涉及太多细节的情况下,有必要将其并行化,因为如果不这样做,那么系统管理员很可能会从客户端而不是从监控系统了解问题。

PHP 本身不支持开箱即用的多线程。 能够进行多处理,您可以分叉。 但是,事实上,我已经编写了一个轮询机制,并且我想这样做,以便我可以从数据库中计算出我需要的所有节点,立即对所有节点进行 ping 操作,等待每个节点的响应,并且只有在之后立即写入数据。 这节省了读取请求的数量。 多线程非常适合这个想法。 对于 PHP,有一个 PThreads 模块,允许您进行真正的多线程处理,尽管在 PHP 7.2 上进行了相当多的修改才能设置它,但它已经完成了。 端口扫描和 ping 现在很快。 例如,这个过程开始需要 15 秒,而不是之前每圈 2 秒。 这是一个很好的结果。

新公司快速审核

收集各种指标和硬件特征的功能是如何产生的? 这很简单。 有时我们只是被命令审计当前的 IT 基础设施。 好吧,为了加快新客户的审核速度,同样的事情也是必要的。 我们需要一些东西,让我们能够进入一家中型或大型公司并快速了解他们拥有什么。 在我看来,只有那些想让自己的生活变得复杂的人才会阻止内部网络上的 ping,而根据我们的经验,这样的人很少。 但也有这样的人。 因此,您可以通过简单的 ping 操作快速扫描网络中是否存在设备。 然后我们可以添加它们并扫描我们感兴趣的开放端口。 事实上,这个功能已经存在了;只需要从中央服务器向从属服务器添加一条命令,以便它扫描指定的网络并将其发现的所有内容添加到列表中。 我忘了提及,假设我们已经有了一个带有配置系统(从属监控服务器)的现成映像,我们可以在审核期间简单地从客户端推出并将其连接到我们的云。

但审核的结果通常包含一堆不同的信息,其中之一是网络上的设备类型。 首先,我们对作为域一部分的 Windows 服务器和 Windows 工作站感兴趣。 因为在中型和大型公司中,缺乏域可能是一个例外。 在我看来,要说一种语言,平均有 100 多人。 有必要想出一种方法来收集所有 Windows 计算机和服务器的数据,了解它们的 IP 和域管理员帐户,但无需在每台计算机上安装任何软件。 WMI 接口可以解决这个问题。 Windows Management Instrumentation (WMI) 字面意思是 Windows 管理工具。 WMI是集中管理和监控运行Windows平台的计算机基础设施各部分运行情况的基本技术之一。 摘自维基。 接下来,我必须再次修补才能为 Debian 编译 wmic(这是一个 WMI 客户端)。 一切准备就绪后,剩下的就是通过 wmic 轮询必要的节点以获取必要的信息。 通过WMI你几乎可以从Windows计算机上获取任何信息,此外,你还可以通过它控制计算机,例如发送它重新启动。 这就是我们系统中有关 Windows 站点和服务器的信息集合的出现方式。 除此之外,还有有关当前系统负载指标的最新信息。 我们更频繁地请求它们,而更少地请求有关硬件的信息。 从此以后,审计变得更加愉快了。

软件分发决策

我们自己每天都在使用该系统,并且它始终对每一位技术员工开放。 我们认为我们可以与他人分享我们已经拥有的东西。 该系统尚未准备好分发。 为了将本地版本转变为 SaaS,需要进行大量修改。 其中包括系统各个技术方面的变化(远程连接、支持服务)、许可模块分析、客户数据库分片、每项服务的扩展以及所有部分的自动更新系统的开发。 但这将是本文的第二部分。

更新

第二部分

来源: habr.com

添加评论