본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Node.js

Nodejs tunnel-ssh(Nodejs 터널링, 노드js 터널링) unhandledpromiserejectionwarning connect ECONNREFUSED

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 10. 17.

 

 

node.js를 통해서 리눅스 서버에 ssh를 접속 한 다음 데이터베이스에 접속하는 경우, 구글링 하면 대부분의 소스코드들이 직관적이고 어렵지 않게 잘 나와 있다.

nodejs를 활용해서 tunnel-ssh을 활용하면 마찬가지로 쉽게 가능한데.. 막상 실제로 잘 나와있는 예제를 그대로 따라서 사용 해 보면 오류가 나거나 잘 안됬었다.

먼저 터널링을 위해서 tunnel-ssh을 설치한다.

 

npm install tunnel-ssh

 

터널링을 통해서 데이터베이스에 접속하는 방법은 아래 단계로 이루어진다.

1. ssh 접속

2. ssh 접속한 곳 에서 포트 포워딩

3. 데이터 베이스 접속

 

몽고db를 기준으로 작성 한 코드이다.

먼저 config에 내용에서 localport가 포트포워딩 한 이후 사용 할 가상 포트번호이다.

var tunnel = require('tunnel-ssh');
var mongoose = require("mongoose");

var config = {
    username: '리눅스아이디',
    password: '리눅스비번',
    host: '접속할 리눅스주소',
    port: 7616,  //접속할 리눅스ssh포트

    dstHost: '127.0.0.1',  //최종목적지(내가 접속 할 데이터베이스)
    dstPort: 26016,        //최종목적지에서 사용할 포트(내가 접속 할 데이터베이스 포트)
    localPort: 22000       //ssh가 접속후 사용할 가상포트번호
};

 

다음으로 서버에 접속해서, 데이터베이스에 접속하는 프로세스이다.

var server = tunnel(config, function (error, server) {
    if (error) {
        console.log('Error!! ', error);
    } else {
        if (server != null) {

            var Schema = mongoose.Schema;
            const url = 'mongodb://데이터베이스아이디:비밀번호@127.0.0.1:22000/데이터베이스명칭';
            var conn = mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }).connection;

            console.log(conn);
            if(mongoose){
                mongoose.disconnect();
            }
            if(server){
                server.close();
            }
        }
    }
});

 

포트포워딩 된 이후에 가상포트번호인 22000번으로 접속하게 하였다.

포트포워딩에서 같은 포트를 쓰면 오류가난다. 그러므로 쓸떼없는포트 아무거나 적어주자.

그런데...ssh까지는 접속이 잘 되는데 계속 아래 사진과 같은 오류가 났다.

?????

실제로 동작했을 때 만난 오류이다.

구글링 해서 된다는 코드, 방법 다 붙여서 해 보았지만 저 오류를 피할 수는 없었다.

 

그러다가 config 옵션중에 ssh접속에서 키를 활용한 내용이 있어서 혹시나 하고 config설정을 바꾸어 보았다.

물론 key는 리눅스 서버에서 생성 후 putty를 통해서 해당 키를 통해서 접속이 되는지 테스트 한 이후에 진행하였다.

var tunnel = require('tunnel-ssh');
var mongoose = require("mongoose");

var config = {
    username: '리눅스아이디',
    password: '리눅스비번',
    host: '접속할 리눅스주소',
    port: 7616,  //접속할 리눅스ssh포트
    privateKey:require(fs).readFileSync('/path/to/key'),  //리눅스에서 ssh접속시 사용할 키!!
    dstHost: '127.0.0.1',  //최종목적지(내가 접속 할 데이터베이스)
    dstPort: 26016,        //최종목적지에서 사용할 포트(내가 접속 할 데이터베이스 포트)
    localPort: 22000       //ssh가 접속후 사용할 가상포트번호
};

 

위 내용까지 하고나서 접속을 시도하니 매우 잘되었다;

포트포워딩 이후 접속해서 데이터베이스를 읽은모습

 

nodejs에서 제공되는 터널링과 관련된 모듈사용시 일반적인 방법이 안되면, 위 내용처럼 서버에서 키를 생성 한 이후에 키를 통한 접속방법을 적용하면 되는 것 같다.

 

다른 데이터베이스 접속도 마찬가지로 터널링 한 이후에 데이터베이스 접속과 관련된 코드를 작성하여주면 된다.

오라클, maria 등등 전부 말이다.

var tunnel = require('tunnel-ssh');
var mongoose = require("mongoose");

var config = {
    username: '리눅스아이디',
    password: '리눅스비번',
    host: '접속할 리눅스주소',
    port: 7616,  //접속할 리눅스ssh포트
    privateKey:require(fs).readFileSync('/path/to/key'),  //리눅스에서 ssh접속시 사용할 키!!
    dstHost: '127.0.0.1',  //최종목적지(내가 접속 할 데이터베이스)
    dstPort: 26016,        //최종목적지에서 사용할 포트(내가 접속 할 데이터베이스 포트)
    localPort: 22000       //ssh가 접속후 사용할 가상포트번호
};

var server = tunnel(config, function (error, server) {
    if (error) {
        console.log('Error!! ', error);
    } else {
        if (server != null) {

            //원하는 데이터베이스 접속과 관련된 코드작성~
            //오라클, 마리아, 포트스그레 등등..뭐든 상관 없다.
        }
    }
});

 

이런내용이 없어서 계속 만났던 커넥션 refuse가 참 얄밉다.

자바는 그런거없이도 잘 되던데..

 

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글