원격 서버의 localhost를 내 컴퓨터에서 사용하기 (SSH 포트 포워딩)
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: 원격 명령 실행 안 함 (포트 포워딩만 수행)
장점
- 보안: 모든 트래픽이 SSH로 암호화됨
- 방화벽 우회: SSH 포트만 열려있으면 사용 가능
- 간단함: 서버 측 설정 변경 불필요
- 투명함: 로컬 서버처럼 사용 가능
- 포트 충돌 회피: 로컬과 원격의 포트를 다르게 매핑 가능
주의사항
- 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 포트 포워딩이 더 권장됩니다.