SSH 포트 포워딩 가이드

배경

이 블로그 프로젝트는 Mini PC에서 개발하고 있으며, 맥북에서 SSH로 접속해서 작업합니다.

문제 상황:

  • Mini PC에서 개발 서버 실행 (localhost:8080)
  • 맥북 브라우저에서 실시간으로 블로그 프리뷰를 보고 싶음
  • 맥북에서 localhost:8080로 접속해도 Mini PC 개발 서버를 실행하는 것이 아님.
  • 개발 서버를 외부 네트워크에 직접 노출하는 것은 보안상 위험
  • 하지만 맥북에서 블로그 개발 서버를 실행하고 싶음.

해결 방법:

SSH 포트 포워딩을 사용하면 Mini PC의 localhost:8080을 맥북의 localhost:8080으로 안전하게 연결할 수 있습니다. 모든 트래픽이 SSH 터널을 통해 암호화되어 전송되므로 보안 걱정 없이 편리하게 개발할 수 있습니다.

개요

SSH 포트 포워딩을 사용하면 원격 서버에서 실행 중인 개발 서버에 로컬에서 접속할 수 있습니다. 모든 트래픽이 SSH 터널을 통해 암호화되어 안전하게 전송됩니다.

기본 명령어

ssh -L 8080:localhost:8080 user@mini-pc-ip

명령어 구조

-L [로컬 포트]:[원격 호스트]:[원격 포트]
  • 로컬 포트: 맥북(클라이언트)에서 열 포트
  • 원격 호스트: Mini PC(서버) 관점에서의 호스트명
  • 원격 포트: Mini PC에서 실제 서비스가 실행되는 포트

동작 원리

아키텍처 다이어그램

sequenceDiagram
participant Browser as 맥북 브라우저
participant SSHClient as SSH 클라이언트<br/>(맥북 localhost:8080)
participant Tunnel as SSH 터널<br/>(암호화)
participant SSHServer as SSH 서버<br/>(Mini PC)
participant Eleventy as Eleventy 서버<br/>(Mini PC localhost:8080)

Browser->>SSHClient: HTTP 요청 (localhost:8080)
SSHClient->>Tunnel: 요청 캡처 & 암호화
Tunnel->>SSHServer: 암호화된 데이터 전송
SSHServer->>SSHServer: 데이터 복호화
SSHServer->>Eleventy: localhost:8080로 전달
Eleventy->>SSHServer: HTML 응답
SSHServer->>Tunnel: 응답 암호화
Tunnel->>SSHClient: 암호화된 데이터 전송
SSHClient->>Browser: 응답 복호화 & 표시

단계별 흐름

1. SSH 터널 생성

ssh -L 8080:localhost:8080 user@mini-pc-ip
  • 맥북의 8080 포트를 "리스닝" 상태로 엽니다
  • Mini PC와 SSH 연결을 맺습니다

2. 맥북에서 접속

http://localhost:8080
  • 맥북 브라우저가 맥북의 localhost:8080에 요청을 보냄
  • 실제로는 Mini PC에 있는 서버가 아니라, 맥북 로컬에 요청하는 것처럼 보임

3. SSH 클라이언트가 요청 캡처

  • 맥북의 SSH 클라이언트가 8080 포트로 들어오는 모든 트래픽을 가로챕니다
  • 이 트래픽을 SSH 연결을 통해 Mini PC로 전달합니다
  • 모든 데이터는 SSH 암호화로 보호됨

4. Mini PC의 SSH 서버가 요청 처리

  • Mini PC의 SSH 서버가 암호화된 데이터를 받습니다
  • 데이터를 복호화합니다
  • Mini PC의 localhost:8080 (Eleventy 서버)로 요청을 전달합니다

5. 응답 반환

  • Eleventy 서버가 HTML 응답을 생성
  • Mini PC의 SSH 서버로 전달
  • SSH 터널을 통해 암호화되어 맥북으로 전송
  • 맥북의 SSH 클라이언트가 복호화
  • 맥북 브라우저에 표시

실제 사용 예시

기본 사용법

# 터미널 1 (맥북): SSH 포트 포워딩으로 접속
ssh -L 8080:localhost:8080 user@remote-server

# 터미널 2 (mini PC SSH 세션 내에서): Eleventy 서버 실행
cd ~/blog-project
npm start

# 맥북 브라우저: localhost로 접속
http://localhost:8080

여러 포트 동시 포워딩

ssh -L 8080:localhost:8080 -L 3000:localhost:3000 user@mini-pc-ip

백그라운드 실행

ssh -fN -L 8080:localhost:8080 user@mini-pc-ip
  • -f: 백그라운드 실행
  • -N: 원격 명령 실행 안 함 (포트 포워딩만 수행)

장점

  1. 보안: 모든 트래픽이 SSH로 암호화됨
  2. 방화벽 우회: SSH 포트만 열려있으면 사용 가능
  3. 간단함: 서버 측 설정 변경 불필요
  4. 투명함: 로컬 서버처럼 사용 가능
  5. 포트 충돌 회피: 로컬과 원격의 포트를 다르게 매핑 가능

주의사항

  • SSH 연결이 끊어지면 포트 포워딩도 종료됩니다
  • 터널이 유지되는 동안 SSH 세션을 닫지 마세요
  • 백그라운드로 실행한 경우 ps aux | grep ssh로 프로세스를 찾아 종료할 수 있습니다

관련 개념

로컬 포트 포워딩 vs 리모트 포트 포워딩

  • 로컬 포트 포워딩 (-L): 로컬에서 원격으로 (이 문서에서 다룬 방식)
  • 리모트 포트 포워딩 (-R): 원격에서 로컬로
  • 다이나믹 포트 포워딩 (-D): SOCKS 프록시

대안: 직접 바인딩

서버를 모든 네트워크 인터페이스에 바인딩하는 방법도 있습니다:

npm run start:remote # eleventy --serve --host=0.0.0.0

그러면 http://mini-pc-ip:8080으로 직접 접속 가능하지만, 보안상 SSH 포트 포워딩이 더 권장됩니다.