本文描述了怎么通過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 600 authorized_keys
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170205_基於ssh反向代理實現的遠程協助.md
歡迎補充

