本文描述了怎么通过ssh反向代理实现远程协助,并提供了相关代码。

可满足web开启远程协助功能后,维护人员能够通过ssh和http登录客户机器(包括在nat环境下)

  • web开启该功能后,ssh才能登录;
  • 通过标识能够区分不同的机器;
  • 能够穿nat;

操作系统: CentOS 6.5_x64

开发语言: Python

源码地址: https://github.com/mike-zhang/remoteHelper

整体结构如下:

主要成员如下:

  • 客户A

    购买公司产品的客户服务器

  • 服务器B

    公司公网服务器

  • 技术支持人员C

    公司员工电脑

端口代理

通过ssh反向代理实现端口转发,这里描述下思路。

SSH端口代理

HTTP端口代理

密钥管理

RSA密钥管理

密钥用途:客户机器使用RSA key执行ssh反向代理本地端口

  • 私钥管理

    私钥产生位置:客户机器
    私钥存储位置:客户机器

    私钥在客户机保存,新生成密钥对时执行覆盖操作。

  • 公钥管理
    公钥产生位置:客户机器
    公钥存储位置:公网服务器

公钥添加过程如下:
1、 公网服务器收到客户机发来的含RSA公钥的消息;
2、 从消息中取出客户序列号;
3、 验证客户序列号是否合法;
4、 如果序列号合法,将RSA公钥加入authorized_keys文件,并在公钥字符串后面加入超时信息;

公钥删除过程如下:
1、从authorized_keys文件取出公钥;
2、判断公钥是否超时;
3、删除超时的公钥;

DSA密钥管理

密钥用途:
使用此密钥通过跳板机连接到NAT后面的客户机。

  • 私钥管理
    私钥产生位置:support机器
    私钥存储位置:support机器

  • 公钥管理
    公钥产生位置:客户机器
    公钥存储位置:客户机器

私钥产生过程:
1、获取客户机页面显示的动态密码; 2、以动态密码为seed产生DSA私钥(存储后用于ssh登录客户机);

公钥添加过程如下:
1、随机产生动态密码;
2、以动态密码为seed产生DSA公钥;
3、将产生的DSA公钥加入authorized_keys文件(不能在key字符串前面加入command命令,否则无法执行command),并设置超时时间;

公钥删除过程:
1、从authorized_keys文件取出公钥;
2、判断公钥是否超时;
3、删除超时的公钥;

连接管理

IP地址限制

适用范围:在公网服务器上配置,用于控制support机器ip地址来源。

提供配置项,用于记录允许的IP地址;
新的请求到来时,验证下原地址是否合法,如果不是合法地址,直接断开连接;

SSH连接管理

  • 客户侧ssh连接管理
    ssh命令允许在末尾执行command,当command执行完成时,ssh断开。
    可借助这个特性在ssh命令的末尾调用python脚本,调用一个python程序,执行sleep操作,python程序退出时ssh连接断开。

  • Support侧ssh连接管理
    如果客户侧的ssh断开,support侧的ssh连接也会断开,support侧的ssh连接可以不用过多管理,仅需在客户机的authorized_keys进行连接时长的限制。

其它

1、通过命令执行SSH反向代理时,服务端只能通过127.0.0.1

该问题可以通过服务端配置实现ssh监听0.0.0.0,具体配置如下:

GatewayPorts yes

2、公网服务器remote账号相关命令

useradd remote
chgrp remote /root
su remote
ssh-keygen -t rsa
cd .ssh/
touch authorized_keys
chmod authorized_keys

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170205_基于ssh反向代理实现的远程协助.md

欢迎补充

基于ssh反向代理实现的远程协助的更多相关文章

  1. 记一次 用 ssh 反向代理解决的远程操作效率问题

    公司在异地有一个项目,项目在内网有一个linux 集群开发人员通过 xshell 进行操作,但是开发过程中还需要公司开发人员进行远程操作,原来采用的方案是向日葵,需求能实现但是限于网络环境向日葵实在是 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. ssh反向代理

    文章链接:https://www.cnblogs.com/kwongtai/p/6903420.html 前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后 ...

  4. 基于Nginx反向代理及负载均衡

    基于Nginx反向代理及负载均衡 参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 只要没有被启用,默认就是 ...

  5. ssh 反向代理和正向代理的文章

    搜索原因是,我希望访问家里内网的机器 技术要点: ssh 反向代理,正向代理 隧道 文章摘自: https://my.oschina.net/leejun2005/blog/94401 https:/ ...

  6. SSH 反向代理

    SSH反向代理 被控制端没有NAT或者没有静态公网IP,把本端一台服务器映射到外网给远端SSH进来,建立SSH反向隧道. 先映射本端机器到外网  nat server 2222to22 protoco ...

  7. .net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡

    1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

  8. frp ssh反向代理配置使用

    本质是一个内网反向代理工具,需要一个vps配合,因为要外网ip. 主页: https://github.com/fatedier/frp 1.服务端(VPS) 可以用下面的一键安装脚本,也可以用主页上 ...

  9. 使用 FRP 反向代理实现 Windows 远程连接

    互联网普及率的日渐攀升与 IPv4 资源的持续减少,现在大部分家庭宽带都不会分配公网 IP ,这使一些网络应用的实现多了些困难,像个人的 NAS 和一些智能家居设备.对于分配公网 IP ,各地运营商的 ...

随机推荐

  1. CentOS 7 安装配置 NFS

    CentOS 7  安装配置 NFS 环境 nps 192.168.1.97 client 192.168.1.98 一.yum 安装 yum -y install nfs-utils rpcbind ...

  2. 原生js的各种方法

    原生js操作dom元素 var link = document.createElement( "link" );link.type = "image/x-icon&quo ...

  3. Ubuntu安装PHP时候出错--xml2-config not found

    在Ubuntu下接着安装php时候,在configure后,又出现错误提示:error: xml2-config not found. Please check your libxml2 instal ...

  4. LWIP_STM32_ENC28J60_NETCONN_UDP(3)

    前面移植了lwip之后只是简单地做了一个dhcp的程序,但是实际工作中经常要用来通讯,那今天就来讲一讲怎么用lwip来进行UDP通讯 要使用数据通信首先第一步得知道lwip是怎么样保存数据的,在使用n ...

  5. cron 编辑器修改

    更改 cron 默认编辑工具 Debian 的 crontab 默认的编辑器是 nano,用起来很不习惯,怎么才能转回 VI 呢? 用如下命令即可: #update-alternatives --co ...

  6. Mapreduce TopK

      思想比较简单,就是每个通过map来获取当前的数据块中的的topk个数据,然后将他们以相同的key值放到reduce中,最后通过reduce来对这n*k个数据排序并获得topk个数据.具体的就是建立 ...

  7. CentOS编译安装LNMP环境

    这里是教大家如何在centos下利用源码编译安装LNMP环境. 工具/原料 centos服务器一台 自用电脑一台 准备篇 配置好IP.DNS .网关,确保使用远程连接工具能够连接服务器 配置防火墙,开 ...

  8. MongoDB和Java-PHP

    一.java操作mongoDB 配置环境: 1.下mongodb JDBC驱动mongo-java-driver-3.2.2.jar,并包含在classpath中 步骤: 1.连接数据库 // 连接到 ...

  9. _foreach

    从JDK1.5之后增加的foreach循环取消索引 for(类型 变量 : 数组 | 集合){ 每一次循环会自动将数组内容设置给变量 } 范例: ,,,} ; for(int x : i){ Syst ...

  10. linux 中环境变量配置错误导致部分命令不能使用包括vi

    1,使用 /bin/vi  /etc/profile 可以打开环境变量 2,修改正确后,重启