首页 > 代码库 > SRE/DevOps:内网集群管理套件【2、说明文档】

SRE/DevOps:内网集群管理套件【2、说明文档】

【客户端】

一、初始化模块

  • 检查客户端本地的 sshd 守护进程是否已启动
  • 检查客户端本地的 SSH 公钥认证相关文件的名称及权限
    • id_rsa.pub
    • authorized_keys
  • 检测云端是否在线
    • 建立 TCP 连接,发送一个 ‘?‘ 至云端,若收到云端回应的 ‘!‘,则表示云端正常在线,若云端无响应,睡眠 5s 后重复此过程
  • 从云端获取连接账号及用于 SSH 远程转发的端口
      • 若 ~/.ssh/ssh_tun_passwd 文件(内含云端账号名称)不存在,发送一个 ‘0‘ 至云端,请求新建账号,收到账号名称后写入 ssh_tun_passwd 文件(初始密码与账号名称相同)
      • 若文件在且格式正确,且在云端匹配成功,则以此账号连接(云端回复 ‘1‘ 代表匹配,‘0‘ 代表不匹配)
      • 若文件不符合格式要求(文件长度 >= 4B)或云端无匹配项,提示用户“ssh_tun_passwd 内容有误,若需新建账号,请重命名或删除此文件“)
      • 用云端回复的端口(从云端收到的 1xxxxx 字符数组中提取后五位)号建立 SSH 反向连接隧道
  • 更新云端公钥库
    • 若该客户端为主节点(以 -p 选项启动),连接成功后,以本地 ~/.ssh/ 目录下所有名称以 “id_rsa.pub” 开头的文件(每个文件可含多个公钥)上传至云端替换原 authorized_keys 文件内容

二、监控模块

  • 等待 SSH 反向连接子进程的退出,若退出说明连接已断开,则重新执行初始化模块

【云端】

一、初始化模块

  • 设置权限与流量控制策略
    • 检查并设置系统全局目录权限
      • /root 与 /ssh_tun/USER_HOMEs 权限:0700
      • 其它所有目录取消 other 的读权限
    • 禁止普通用户通过 ps、top 等程序查看其它用户进程的信息
    • 限制每个 SSH 隧道的外出方向网络带宽,如 20Kbps/s
  • 检查 sshd 守护进程状态
  • 向 www.ip3322.net 注册 IP 地址,确保动态域名有效
  • 启动一个本地客户进程,用于服务端自检动态域名有效性

二、监控模块

  • 通过 KQueue 等待客户端连接
    • 远程客户端
    • 本地自检客户端
      • 每 5s 自检一次
      • 若出现异常,重新执行初始化模块

三、行为模块

  • 回应客户端请求
    • 收到 ‘?‘ 状态确认请求,回复 ‘!‘
    • 收到登陆请求
      • 若收到的是数字 ‘0‘,即代表客户端不存在 ssh_tun_passwd 文件,创建新账号并回复账号名称
      • 否则检索云端用户列表
        • 若存在此账户,回复 ‘1‘ + 端口号
        • 若不存在,回复 ‘0‘
      • 检索账户名称
        • 维护一个 /SSH/account_database 文件,以 unsigned short 二进制格式存储已注册的账户名称,账户以纯数字递增顺序命名
      • 检索空闲端口
        • 维护一个 /SSH/idle_port_database 文件,预先写入全部可用端口号,以 unsigned short 二进制存储
        • 取用端口时从文件末尾读取 sizeof(short int) 个字节,然后 truncate 掉末尾 sizeof(short int) 个字节
        • 端口用完归还时,在文件末尾追加写入
        • 调用外部程序 ipfw 开放已分配的端口,关闭已归还的端口
  • 回收失效的套接字与 SSH 转发端口
    • 内存中维护一个单向链表数组(struct z_so_ssh_info *CurInfo[64]),用于存储已分配的套接字、SSH 传发端口等信息,以套接字值除以 64 的余数为数组下标进行 HASH
    • 每小时检查一次所有外部客户端的心跳记录,回收其所占用的系统资源

SRE/DevOps:内网集群管理套件【2、说明文档】