하나의 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 jumpboxSOCKS를 지원하는 앱을 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.1과 0.0.0.0은 포트 번호가 같아도 공격 면이 달라. 시작 뒤에는 lsof나 ss로 실제 리스너 주소를 확인하고, 범위를 넓히기 전에 SSH 서버 정책과 방화벽도 함께 검사해.
백그라운드 터널에도 주인이 필요해
SSH를 백그라운드로 보냈다고 모니터링, 재시작 정책, 로그, 종료 방법이 생기지는 않아. 오래된 터널이 포트를 계속 잡으면 새 연결이 실패하고 트래픽 경로도 잊기 쉬워. 이름 있는 설정과 하나의 서비스 소유자를 정하고, 시작 후 바인드 주소와 전달 성공을 검증해.