본문 바로가기
C.W.K.
Stream
Lesson 02 of 08 · published

SSH 터널: -L, -R, -D

~13 min · ssh, tunnel, port-forward

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

하나의 TCP 연결로 여는 세 통로

SSH는 TCP 연결을 암호화된 세션 안으로 전달할 수 있어. 세 방식은 리스너가 생기는 위치와 마지막 연결을 만드는 호스트가 달라. 명령을 외우기보다 ‘어디에서 듣고, 어느 호스트가 최종 목적지에 붙는가’를 말로 풀어 확인해.

  • -L localport:remoteHost:remotePort: 로컬 포트에서 듣는 전달이야.
  • -R remoteport:localHost:localPort: 원격 SSH 서버 쪽에서 들어오는 연결을 로컬 서비스로 돌려.
  • -D socksport: 로컬 SOCKS 프록시를 열어.

-L: 노트북에서 원격 서비스에 접근하기

ssh -L 5432:localhost:5432 dbserver

이 명령은 노트북의 5432 포트를 열고, 그 포트로 들어온 연결을 SSH 세션을 거쳐 dbserver로 보내. dbserver는 다시 자기 localhost:5432에 연결해. 이제 psql -h localhost를 실행하면 원격 Postgres를 인터넷에 공개하지 않고도 노트북에서 직접 사용할 수 있어.

-R: 노트북의 서비스를 서버 쪽에 내놓기

ssh -R 8080:localhost:3000 publicbox

원격 SSH 서버가 8080 포트에서 듣고, 받은 연결을 노트북의 3000 포트로 전달해. 기본 원격 바인드는 흔히 loopback으로 제한돼서 원격 호스트 자신만 접근할 수 있어. 다른 머신에도 열려면 서버의 GatewayPorts, 방화벽, 계정 권한이 모두 허용해야 해. 넓은 바인드는 편의 옵션이 아니라 서비스 공개로 취급해.

-D: 서버를 거치는 SOCKS 프록시

ssh -D 1080 jumpbox

SOCKS를 지원하는 앱을 127.0.0.1:1080에 연결하면 그 앱의 TCP 트래픽을 jumpbox를 통해 보낼 수 있어. 기기 전체의 트래픽을 자동으로 처리하는 VPN은 아니고 DNS 동작도 클라이언트 설정에 달려 있어. 필요한 앱과 조회 경로를 따로 시험해.

설정 파일로 반복 명령 줄이기

Host dbserver
  HostName db.internal
  LocalForward 5432 localhost:5432
  LocalForward 6379 localhost:6379
  ExitOnForwardFailure yes

이 별칭으로 접속할 때마다 두 로컬 리스너가 생겨. -N은 원격 명령을 실행하지 않고 전달만 유지하고, -f는 인증이 끝난 뒤 클라이언트를 백그라운드로 보내. 자동화에서는 ExitOnForwardFailure yes처럼 리스너 생성 실패를 즉시 드러내고, 시작한 프로세스를 누가 멈추고 재시작할지도 정해야 해.

autossh로 끊긴 연결 다시 붙이기

brew install autossh로 설치한 autossh는 불안정한 네트워크에서 SSH가 끊기면 다시 연결해. 다만 재접속은 상태 확인, 로그, 종료 절차를 대신하지 않아. 오래 유지할 터널이라면 재시도 간격과 실패 가시성까지 운영 계약에 넣어.

리스너 주소가 노출 범위를 정해

이 머신에서만 쓸 때는 ssh -L 127.0.0.1:5432:localhost:5432 dbserver처럼 loopback 주소를 명시해. 127.0.0.10.0.0.0은 포트 번호가 같아도 공격 면이 달라. 시작 뒤에는 lsofss로 실제 리스너 주소를 확인하고, 범위를 넓히기 전에 SSH 서버 정책과 방화벽도 함께 검사해.

백그라운드 터널에도 주인이 필요해

SSH를 백그라운드로 보냈다고 모니터링, 재시작 정책, 로그, 종료 방법이 생기지는 않아. 오래된 터널이 포트를 계속 잡으면 새 연결이 실패하고 트래픽 경로도 잊기 쉬워. 이름 있는 설정과 하나의 서비스 소유자를 정하고, 시작 후 바인드 주소와 전달 성공을 검증해.

Code

내부망 Postgres 접근·bash
ssh -fNL 5432:localhost:5432 dbserver
psql -h localhost -p 5432 -U me production
# 나중에 터널 프로세스 종료
pgrep -f 'ssh -fNL 5432' | xargs kill

External links

Exercise

접근 권한이 있는 원격 시험 서비스에 ssh -fNL <localport>:localhost:<remoteport> host로 로컬 포워딩을 열어. 로컬 포트로 접속이 되는지 확인한 뒤 같은 규칙을 ~/.ssh/configLocalForward로 옮기고, 전달 실패와 종료 방법도 함께 시험해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.