SSH 터널링(SSH tunneling)은 Secure Shell(SSH) 프로토콜을 사용하여 네트워크 트래픽을 안전하게 전송하는 방법
로컬 포트 포워딩
ssh -L [로컬포트]:[원격호스트]:[원격포트] [SSH서버주소]
원격 포트 포워딩은 SSH 서버에서 클라이언트의 특정 포트를 터널을 통해 로컬 시스템의 포트로 전달하는 방법
ssh -R [원격포트]:[로컬호스트]:[로컬포트] [SSH서버주소]
저희 프로젝트의 구조 설계는 다음과 같이 예상했습니다. 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 연결후 포워딩될 주소와 포트 번호를 설정해주어 터널링을 설정해주었습니다!