聊一聊SSH

若是你對NodeJs系列感興趣,歡迎關注微信公衆號:前端神盾局 或 github NodeJs系列文章php

身爲一枚合格的搬磚工程師,筆者常常須要登陸服務器去查看日誌或者部署應用,ssh也隨之成爲最經常使用的linux命令之一。本文主要是對SSH的概念和用法作一些簡單的梳理,大神請繞道。html

什麼是SSH

image

SSH是一種加密的網絡傳輸協議,可在不安全的網絡中爲網絡服務提供相對安全的傳輸環境。任何網絡服務均可以經過SSH實現安全傳輸,但平常使用最多的仍是遠程登陸服務器。前端

// 登陸一臺端口爲22,用戶名爲username,ip地址爲xx.xx.xx.xx的遠程主機
ssh -p 22 username@xx.xx.xx.xx

早先,互聯網通訊基本是裸奔的(明文傳輸),這使得內容很容易被竊取或監聽。1995年,芬蘭學者Tatu Ylonen設計了SSH協議,將登陸信息所有加密,成爲互聯網安全的一個基本解決方案,迅速在全世界得到推廣,目前已經成爲Linux系統的標準配置。node

那SSH是如何實現加密的呢?整個過程以下:linux

  1. 遠程主機收到用戶的登陸請求,把本身的公鑰發給用戶;
  2. 用戶使用這個公鑰,將登陸密碼加密後,發送回來。
  3. 遠程主機用本身的私鑰,解密登陸密碼,若是密碼正確,就贊成用戶登陸。

固然這個過程並非萬無一失的,依舊存在「中間人攻擊」的風險,具體可參考阮一峯老師的文章:SSH原理與運用(一):遠程登陸git

本地端口轉發

在實際項目中,筆者常常遇到這樣的一種狀況:因爲測試環境中數據庫和開發數據庫的沒有同步,致使筆者沒法很好的復現bug。github

那有同窗問,爲何不直接連到測試服務器呢?緣由很簡單,連不上。測試環境數據庫服務器並無對外開放。數據庫

因此剛開始的時候,筆者爲此至關苦惱,每次須要驗證數據的時候,都要先把測試環境中數據導出再導入到開發環境中,這樣一趟下來十幾分鍾過去了...瀏覽器

那有什麼方法能夠連到測試數據庫呢?安全

有的,使用ssh本地端口轉發

先來描述一下場景,host1(106.xx.xxx.xx)是遠程主機,是能夠對外訪問的;host2是內網主機(10.xx.xxx.x 安裝了mongo數據庫),只能經過host1訪問,沒法鏈接外網。

咱們須要兩個步驟實現本地端口轉發

  1. 建立本地服務器
const http = require('http');
const server = http.createServer(function(req,res){});
server.listen(5000);

這裏咱們建立了一個端口爲5000的本地服務

  1. ssh轉發
ssh -L 5000:10.xx.xxx.x:27017 username@106.xx.xxx.xx

命令中的L參數一共接受三個值,分別是"本地端口:目標主機:目標主機端口",它們之間用冒號分隔。這條命令的意思,就是指定SSH綁定本地端口5000,而後指定host1將全部的數據,轉發到目標主機host2的27017端口。

運行命令,隨後咱們在瀏覽器中打開http://localhost:5000,能夠看到頁面顯示以下:

It looks like you are trying to access MongoDB over HTTP on the native driver port.

這表示咱們鏈接成功~

ssh命令挺長的,還有各類ip地址...有沒有簡化版呢?

好吧~咱們可使用tunnel-ssh改造一下

const tunnel = require('tunnel-ssh');
const server = tunnel({
    keepAlive: true,
    // host1
    host: '106.xx.xxx.xx',
    username: 'superTerrorist',
    password: 'xxxx',
    port: 22,
    // 內網主機 host2
    dstHost: '10.xx.xxx.x',
    dstPort: 27017,
    // 本地端口
    localPort: 5000,
},async function(error,server){
    if(error){
        console.log(error);
        return;
    }
    console.log('ssh tunnel connected');
});

這裏咱們使用了第三方包tunnel-ssh實現了本地轉發的功能,每次咱們只要使用node script.js便可,這比使用ssh清爽多了。若是各位同窗還有更好的方法,歡迎在此留言討論

參考

image

相關文章
相關標籤/搜索