聊一聊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

相关文章
相关标签/搜索