SSH 터널링이란?

SSH 터널링(SSH tunneling)은 Secure Shell(SSH) 프로토콜을 사용하여 네트워크 트래픽을 안전하게 전송하는 방법

우리 프로젝트에 필요한 것

Untitled

저희 프로젝트의 구조 설계는 다음과 같이 예상했습니다. Nest 서버와 MySQL서버 간 SSH 터널링을 필요로 했습니다. 서버가 실행되면 MySQL 서버에 SSH 연결이 되어야 하고, MySQL이 사용하는 포트 번호로의 포워딩이 필요했습니다. 클라우드 설정을 이것저것 만지면서 설정할 수 있겠지만, 보안 및 안전한 원격 접근을 위해 tunnel-ssh 라는 라이브러리를 이용했습니다.

tunnel-ssh: https://www.npmjs.com/package/tunnel-ssh

간편한 설정


...

const sshOptions: SSHOptions = {
  host: process.env.SSH_HOST!,
  port: process.env.SSH_PORT!,
  username: process.env.SSH_USER!,
  password: process.env.SSH_PASSWORD!,
};

export function mySimpleTunnel(
  sshOptions: SSHOptions,
  port: number,
  autoClose = true,
) {
  const forwardOptions: ForwardOptions = {
    srcAddr: '127.0.0.1',
    srcPort: port,
    dstAddr: '127.0.0.1',
    dstPort: port,
  };

  const tunnelOptions: TunnelOptions = {
    autoClose: autoClose,
  };

  const serverOptions: ServerOptions = {
    port: port,
  };

  return createTunnel(tunnelOptions, serverOptions, sshOptions, forwardOptions);
}

export async function establishSSHconnection() {
  await mySimpleTunnel(sshOptions, 3306);
}

이런 식으로 서버가 실행되면 SSH 연결을 수행할 수 있게 구성하였습니다.

sshOptions 을 통해 host, port, username, password를 설정해주어 연결을 수행할 때 필요한 정보를 넘겨주고, forwardOPtions를 통해 SSH 연결후 포워딩될 주소와 포트 번호를 설정해주어 터널링을 설정해주었습니다!