「GoCN酷Go推荐」后现代时代远程办公网络问题的golang开源解决方案 —— PairMesh

Posted GoCN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「GoCN酷Go推荐」后现代时代远程办公网络问题的golang开源解决方案 —— PairMesh相关的知识,希望对你有一定的参考价值。

PairMesh是什么?

Pairmesh是一款先进的虚拟局域网(VPN)工具,用来搭建与访问安全,易用,高性能的点对点的软件定义虚拟局域网,为远程办公的网络连接问题提供了开箱即用的解决方案。

拥抱开源,拥抱开放

PairMesh是主要使用go语言开发实现的开源项目,您可以查看并获取PairMesh源代码:https://github.com/pairmesh/pairmesh

这个repo包含了PairMesh的全部三个核心组件。具体的PairMesh服务组件架构如图:

  • Peer Node

    使用者在终端计算设备安装并启动PairMesh应用之后,PairMesh将会创建一个虚拟网络设备,用来进行虚拟局域网内的收发与路由,成为一个终端节点。

  • Portal Service

    Portal Service是集中化的节点元数据管理中心。所有的终端节点需要与其连接来进行验证登录,获取网络接入权限,并定期进行网络拓扑信息更新,从而获得网络内其他节点的信息。除此之外,节点间的实际网络信息传输并不需要经过Portal。同时Portal也负责用户的注册,登录。其前端作为可视化显示面板呈现用户,节点与网络的详细统计信息。Portal的后端元数据管理和前端可视化共同构成PairMesh的Control Plane(控制平面)。

  • Relay Service

    在大多数情况下,终端节点A与B之间可以建立稳定高速的点对点直连网络连接。但是在少数情况下,点对点的连接无法稳定创建,例如节点处于动态SNAT内网环境中。这时我们还拥有relay server作为中转服务器,用来提供可靠的网络转发传输服务。终端节点在此时将会自动切换至relay模式进行网络传输。并且在建立连接时,还会通过内置算法自动寻找最优的relay server,来使得两点间的传输延迟最低。

  • 后现代时代的远程办公

    在被Covid-19深刻影响与改变后的世界,我们都看到了远程办公的意义与价值。远程办工/远程协同的能力已成为企业IT基础架构的重要组成部分,并也许将成为衡量企业竞争力与吸引力的标准之一。

    在远程办公的场景下,无论在舒适的家里,旅途的火车或飞机上,还是出差会议的酒店,您都想要使用手中的笔记本电脑或者移动设备去快速稳定地访问位于公司内网的资源,例如您在公司内部的专有开发用机,或是公司内部的共享文档系统。

    在远程协同的场景下,您的同事也在家里远程办公,并在本地搭建了一个产品原型(例如游戏服务,3D建模,或是商业计划)。而您在自己的家中想要直接访问,试用,评估并推动这个原型的迭代。这甚至不需要同事将产品原型部署到公司的内网中去 - 毕竟,在产品的快速迭代中,提升的效率意味着降低的成本和巨大的价值。

    而所有这些,PairMesh都可以为您做到。

    点对点的轻巧架构

    传统的虚拟局域网(VPN)工具采用中心化架构 - 所有终端都通过加密tunnel(隧道)连接到一个远程服务器gateway server,并由这个服务器统一进行信息解密,转译与分发。这样的架构带来了如下问题:

  • 单点故障问题

    一旦gateway server出现故障,所有连接在其上的VPN用户都将面临连接断开的风险。

  • 扩展性问题

    gateway server的单机性能也是有限的。当连接的终端过多,网络流量和计算的负载过大时,gateway server将会成为性能瓶颈。

  • 网络路径问题

    设想在海淀区的您想要和朝阳区的同事发起视频通话,但是VPN gateway server架设在位于上海的公司总部,那么所有您和同事之间的网络传输将不得不在北京和上海之间辗转折返,从而带来巨大的网络延迟。

  • 随着企业的规模扩大,并随着企业对于远程办公/协作的网络稳定性与性能要求的日益提高,传统的VPN架构面临着来自企业需求的众多挑战。

    PairMesh采用最新的点对点分布式架构。只要终端A和终端B都登录进入同一个虚拟网络,并从portal获知对方的存在与相应网络信息,一个加密tunnel便将会在A和B之间直接建立,后续的网络传输将不再需要经过任何中转的gateway server。在这样的由众多点对点直连所构成的mesh(网格)网络下,我们有效解决了传统VPN架构所面临的挑战:

  • 不再有gateway server的单点性能瓶颈

  • 网络性能不再依赖gateway server的地理与网络环境,点对点网络延迟大幅降低

  • 任何一个单点的故障都不会造成整个网络的可用性风险。

  • *如上文所介绍过,在某些特定环境下,点对点tunnel无法稳定建立,所以我们还有辅助的中转服务器relay service作为备用方案。

    您的信息安全,我们最在乎

    PairMesh使用最新的 Noise Protocol 协议框架进行加密传输,并且在框架下采用多种安全保障措施,确保您的网络传输安全无虞:

  • 对等公钥和隧道源 IP 地址之间的关联。

  • 使用基于 NoiseIK 的单次往返密钥交换.

  • 使用新的计时器状态机机制对用户透明地处理所有会话创建。

  • 短的预共享静态密钥(Curve25519点)用于 OpenSSH 风格的相互认证。

  • 提供高度的身份隐藏之外,还提供了强大的完美前向保密性。

  • 使用 ChaCha20Poly1305 身份验证加密将数据包封装在 UDP 中可以实现传输速度。

  • 通过 PairMesh 管控面使用非对称加密的方式对 IP 地址签名并包含过期时间,避免 Credential 泄露。

  • 所有从终端节点发起的登录请求,在portal端不仅要进行密保验证,同时也要验证相应的机器信息,才能够被允许接入网络。这样即使密码或Token泄露,非法的节点也无法接入网络。

  • 在切换至中转服务器relay模式时,在终端节点和中转服务器之间的所有TCP连接都需要在握手阶段通过对节点的信息进行验证才能够建立。只要那些已经被portal注册过的节点才能够被允许接入中转服务器,进行后续的网络传输。

  • 连入同一虚拟局域网络的所有终端节点都使用不同的密保密码,并且任意一组点对点连接都使用独一无二的唯一密码进行保护,有效防止密码泄露对于整个网络的安全冲击。

  • 开箱即用的SaaS体验

    想要立即开始PairMesh为您带来的高效便利的远程协作体验,您只需要:

    1. 登陆 https://www.pairmesh.com/

    2. 使用GitHub或微信进行注册与登录

    3. 登录之后进入 https://my.pairmesh.com/console/keys 创建属于您的设备密码。

    4. 记得把它保存到一个安全的地方。密码生成之后只会为您显示一次。这也是密码安全保障的措施之一。

    5. 下载与您的终端设备平台与操作系统相匹配的pairmesh应用,并安装运行。

    6. All Set!在 https://my.pairmesh.com/console/devices 中找到在同一个虚拟局域网络中您想要连接的远程地址,用您想要的方式连接它们,即刻开启PairMesh为您带来的可靠快捷的远程办公协同体验!

    搭建属于您自己的PairMesh

    如果您希望搭建属于自己的一整套PairMesh服务,您可以:

    1. 确保您有完整的golang与nodejs的编译与运行环境。

    2. 获取我们的开源代码:

    3. git clone https://github.com/pairmesh/pairmesh

    4. 执行 make 编译之后,您将获得pairmeshpairrelaypairportal的二进制可执行文件。

    5. pairportal部署在可访问的机器上。使用yaml文件进行相关设置。具体的yaml设置方式与pairportal的启动方式详见repo的README。

    6. 代码库的webui文件夹内是portal的vue前端。部署前端使其与后端pairportal连接,然后通过前端进行用户的注册与登录等初始化管理。

    7. pairrelay部署在可访问的机器上,并通过设置yaml文件使其连接至您的pairportal。具体的yaml设置方式与pairrelay的启动方式请详见repo的README。

    8. pairmesh是您的终端节点应用。将其在需要接入虚拟局域网的终端设备内启动:

    export PAIRMESH_GATEWAY_API=<您的portal后端服务部署地址>
    export PAIRMESH_GATEWAY_MY=<您的portal vue网站地址>
    pairmesh -k <您的密码或token>

    即可开始使用您搭建的PairMesh系统。

    来和我们一起让PairMesh变得更好

    我们相信社区的力量。我们期待您可以帮助PairMesh使它变得更好。您有很多方式可以为PairMesh做出贡献:

  • 参与PairMesh的开发,提交PR至我们的代码repo。在README中您可以看到所有您可以改进优化PairMesh的地方和方式。repo地址:https://github.com/pairmesh/pairmesh

  • 在Github上提交bug report或者feature request让我们看见,我们会第一时间为您做出修补,解答或功能实现。提交地址: https://github.com/pairmesh/pairmesh/issues

  • 参与到我们的社区讨论。欢迎您的发言。社区地址:https://github.com/pairmesh/pairmesh/discussions

  • 发布PairMesh的使用教程和blog,让更多的人可以体验PairMesh服务。

  • 如果喜欢PairMesh的话,记得在repo上给出您的小星星

  • 在使用中,也欢迎您将问题,建议或反馈发邮件给我们。联系方式:contact@pairmesh.com

    酷Go推荐》招募:

    各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

    新的库,并且知道怎么用。

    大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名

    想要了解更多 Golang 相关的内容,欢迎扫描下方

    GoCN酷Go推荐Go 系统监控利器-gopsutil

    简介

    什么是 gopsutil?要说gopsutil就不得不先了解 psutil,顾名思义,psutil = process and system utilities, 它是 Python 的跨平台库,能够轻松实现获取系统运行的进程和系统利用率,包括 CPU、内存、磁盘、网络等信息。而gopsutil就是psutil的 Golang 移植版。

    为什么用 gopsutil?和直接使用 syscall 调用对应的系统方法相比,gopsutil 为我们屏蔽了各个系统间的差异,可移植性非常强。

    快速上手

    安装:

    go get github.com/shirou/gopsutil

    使用:

    package main

    import (
        "fmt"
        "github.com/shirou/gopsutil/cpu"
        "time"
    )

    func main() {
        info, _ := cpu.Info()

        per, _ := cpu.Percent(1 * time.Second, true)

        fmt.Printf("CPU Percent: %f\n", per)

        fmt.Println(info)
    }

    输出:

    CPU Percent: [4.040404 4.000000 5.050505 6.930693]
    [{"cpu":0,"vendorId":"AuthenticAMD","family":"23","model":"49","stepping":0,"physicalId":"0","coreId":"0","cores":1,"modelName":"AMD EPYC 7K62 48-Core Processor","mhz":2595.124,"cacheSize":512,"flags":["fpu","vme","de","pse","tsc","msr","pae","mce","cx8","apic","sep","mtrr","pge","mca","cmov","pat","pse36","clflush","mmx","fxsr","sse","sse2","ht","syscall","nx","mmxext","fxsr_opt","pdpe1gb","rdtscp","lm","rep_good","nopl","cpuid","extd_apicid","tsc_known_freq","pni","pclmulqdq","ssse3","fma","cx16","sse4_1","sse4_2","x2apic","movbe","popcnt","aes","xsave","avx","f16c","rdrand","hypervisor","lahf_lm","cmp_legacy","cr8_legacy","abm","sse4a","misalignsse","3dnowprefetch","osvw","topoext","ibpb","vmmcall","fsgsbase","bmi1","avx2","smep","bmi2","rdseed","adx","smap","clflushopt","sha_ni","xsaveopt","xsavec","xgetbv1","arat"],"microcode":"0x1000065"} {"cpu":1,"vendorId":"AuthenticAMD","family":"23","model":"49","stepping":0,"physicalId":"0","coreId":"1","cores":1,"modelName":"AMD EPYC 7K62 48-Core Processor","mhz":2595.124,"cacheSize":512,"flags":["fpu","vme","de","pse","tsc","msr","pae","mce","cx8","apic","sep","mtrr","pge","mca","cmov","pat","pse36","clflush","mmx","fxsr","sse","sse2","ht","syscall","nx","mmxext","fxsr_opt","pdpe1gb","rdtscp","lm","rep_good","nopl","cpuid","extd_apicid","tsc_known_freq","pni","pclmulqdq","ssse3","fma","cx16","sse4_1","sse4_2","x2apic","movbe","popcnt","aes","xsave","avx","f16c","rdrand","hypervisor","lahf_lm","cmp_legacy","cr8_legacy","abm","sse4a","misalignsse","3dnowprefetch","osvw","topoext","ibpb","vmmcall","fsgsbase","bmi1","avx2","smep","bmi2","rdseed","adx","smap","clflushopt","sha_ni","xsaveopt","xsavec","xgetbv1","arat"],"microcode":"0x1000065"} {"cpu":2,"vendorId":"AuthenticAMD","family":"23","model":"49","stepping":0,"physicalId":"0","coreId":"2","cores":1,"modelName":"AMD EPYC 7K62 48-Core Processor","mhz":2595.124,"cacheSize":512,"flags":["fpu","vme","de","pse","tsc","msr","pae","mce","cx8","apic","sep","mtrr","pge","mca","cmov","pat","pse36","clflush","mmx","fxsr","sse","sse2","ht","syscall","nx","mmxext","fxsr_opt","pdpe1gb","rdtscp","lm","rep_good","nopl","cpuid","extd_apicid","tsc_known_freq","pni","pclmulqdq","ssse3","fma","cx16","sse4_1","sse4_2","x2apic","movbe","popcnt","aes","xsave","avx","f16c","rdrand","hypervisor","lahf_lm","cmp_legacy","cr8_legacy","abm","sse4a","misalignsse","3dnowprefetch","osvw","topoext","ibpb","vmmcall","fsgsbase","bmi1","avx2","smep","bmi2","rdseed","adx","smap","clflushopt","sha_ni","xsaveopt","xsavec","xgetbv1","arat"],"microcode":"0x1000065"} {"cpu":3,"vendorId":"AuthenticAMD","family":"23","model":"49","stepping":0,"physicalId":"0","coreId":"3","cores":1,"modelName":"AMD EPYC 7K62 48-Core Processor","mhz":2595.124,"cacheSize":512,"flags":["fpu","vme","de","pse","tsc","msr","pae","mce","cx8","apic","sep","mtrr","pge","mca","cmov","pat","pse36","clflush","mmx","fxsr","sse","sse2","ht","syscall","nx","mmxext","fxsr_opt","pdpe1gb","rdtscp","lm","rep_good","nopl","cpuid","extd_apicid","tsc_known_freq","pni","pclmulqdq","ssse3","fma","cx16","sse4_1","sse4_2","x2apic","movbe","popcnt","aes","xsave","avx","f16c","rdrand","hypervisor","lahf_lm","cmp_legacy","cr8_legacy","abm","sse4a","misalignsse","3dnowprefetch","osvw","topoext","ibpb","vmmcall","fsgsbase","bmi1","avx2","smep","bmi2","rdseed","adx","smap","clflushopt","sha_ni","xsaveopt","xsavec","xgetbv1","arat"],"microcode":"0x1000065"}]

    分工明确

    gopsutil 将不同的功能划分到不同的子包中:主要为 cpu,disk,docker,host,mem,net,process,winservices 这几个。想要使用对应的功能,要导入对应的子包。例如,上面代码中,我们要获取 CPU 信息,导入的是 cpu 子包。上述样例中,我们获取到了每个 cpu 的占用率和所有 cpu 的详细信息。

    闲言

    最近正在写一个 Golang 实现性能监控的 demo,之后还会写这方面的介绍或者对比。

    参考文档

    https://github.com/shirou/gopsutil 


    还想了解更多吗?

    更多请查看:https://github.com/shirou/gopsutil 


    《酷Go推荐》招募:


    各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

    新的库,并且知道怎么用。



    扫码也可以加入 GoCN 的大家族哟~


     Gopher China2021大会日程详情来了!


    点击下方「阅读原文」即可报名参加大会


    以上是关于「GoCN酷Go推荐」后现代时代远程办公网络问题的golang开源解决方案 —— PairMesh的主要内容,如果未能解决你的问题,请参考以下文章

    「GoCN酷Go推荐」Go高性能多语言NLP和分词库——gse

    「GoCN酷Go推荐」基于泛型的 Golang lodash 库 — samber/lo

    推荐一款国产远程控制软件ToDesk,轻量级,不限速,开启云办公新模式

    GoCN每日新闻(2019-11-10)

    GoCN每日新闻(2019-10-02)

    疫情之下远程办公,开启企业办公的全新时代!