- Published on
ssh 터널링 명령어: 로컬·원격·동적 포워딩 정리
- Authors

- Name
- Indo Yoon
ssh 터널링 명령어는 목적에 따라 로컬 포워딩 -L, 원격 포워딩 -R, 동적 포워딩 -D로 나누어 쓰면 돼요. 핵심은 어느 쪽이 포트를 열고 연결을 받는지, 목적지 주소를 어느 쪽에서 해석하는지 구분하는 거예요. 이 글에서는 각 명령의 의미와 운영 환경에서 선택하는 기준, 주의할 점을 공식 문서 기준으로 정리해요.
한눈에 보기
ssh 터널링은 SSH 클라이언트와 SSH 서버 사이에 암호화된 연결을 만들어 두고, 그 안에서 특정 포트의 트래픽을 다른 목적지로 전달하는 방식이에요. OpenSSH의 ssh 명령은 이 기능을 -L, -R, -D 옵션으로 제공해요. 먼저 전체 구조를 보면 어떤 옵션을 골라야 하는지 빨리 판단할 수 있어요.
- 로컬 포워딩
-L: 내 컴퓨터의 포트로 들어온 연결을 SSH 서버 너머의 목적지로 보내요. - 원격 포워딩
-R: SSH 서버 쪽 포트로 들어온 연결을 내 컴퓨터 쪽 목적지로 보내요. - 동적 포워딩
-D: 내 컴퓨터에 SOCKS 프록시를 만들고, 애플리케이션이 그 프록시를 통해 원격 네트워크에 접근해요. - 공통 옵션으로
-N은 원격 명령 실행을 생략하고,-f는 인증 후 백그라운드로 전환할 때 사용해요.
운영 환경에서는 “터널을 어디에 만들 것인가”보다 “누가 그 포트에 접근할 수 있는가”가 더 중요해요. 그래서 명령 예시를 볼 때도 바인드 주소와 방화벽 정책을 함께 확인해야 해요.
포워딩 방식 비교
| 방식 | 명령 옵션 | 연결이 시작되는 쪽 | 주로 쓰는 상황 |
|---|---|---|---|
| 로컬 포워딩 | -L | 내 컴퓨터가 수신 | 내 PC에서 원격 서버 뒤의 데이터베이스나 웹 서비스에 접근 |
| 원격 포워딩 | -R | SSH 서버가 수신 | 외부에서 접근하기 어려운 내 쪽 서비스를 SSH 서버를 통해 노출 |
| 동적 포워딩 | -D | 내 컴퓨터가 SOCKS 프록시로 수신 | 여러 목적지에 접근해야 하는 브라우저나 도구의 프록시 설정 |
표에서 중요한 차이는 “어느 쪽이 포트를 열고 연결을 받는가”예요. 로컬 포워딩의 목적지는 SSH 서버에서 바라본 주소이고, 원격 포워딩의 목적지는 SSH 클라이언트에서 바라본 주소예요. 이 방향을 헷갈리면 연결은 되는데 목적지 서비스에 닿지 않는 상황이 생겨요.
단계별로 실행하기
명령을 실행하기 전에 SSH 접속 자체가 정상인지 확인해요. 그다음 목적지 주소를 어느 쪽에서 해석해야 하는지 정하고, 필요한 옵션을 골라요. 터널은 SSH 인증이 끝난 뒤에 만들어지므로 계정 권한과 서버 설정도 함께 확인해야 해요.
로컬 포워딩으로 원격 서비스 접근
형식은 ssh -L [바인드주소:]로컬포트:목적지호스트:목적지포트 user@ssh서버예요. 예를 들어 다음과 같이 실행할 수 있어요.
ssh -N -L 8080:127.0.0.1:80 deploy@bastion.example.com
이 명령은 내 컴퓨터의 8080으로 들어온 연결을 bastion.example.com에 SSH로 접속한 뒤, 그 서버에서 127.0.0.1의 80으로 전달해요. 목적지 주소를 127.0.0.1로 두면 SSH 서버 자신에서만 접근 가능한 서비스를 안전하게 다룰 수 있어요. 데이터베이스나 내부 관리 도구처럼 외부에 직접 열지 않은 서비스에 접근할 때 자주 사용해요.
바인드 주소를 생략하면 보통 로컬 루프백에 바인딩돼요. 다른 호스트에서도 내 터널 포트에 접근하게 하려면 -g 옵션과 방화벽 정책을 검토해야 하지만, 운영 환경에서는 노출 범위를 최소화하는 편이 안전해요.
원격 포워딩으로 내 쪽 서비스 노출
형식은 ssh -R [바인드주소:]원격포트:목적지호스트:목적지포트 user@ssh서버예요. 예시는 다음과 같아요.
ssh -N -R 9000:127.0.0.1:3000 deploy@public.example.com
이 명령은 public.example.com의 9000으로 들어온 연결을 SSH 클라이언트 쪽으로 보내고, 클라이언트에서 127.0.0.1의 3000으로 전달해요. 로컬 개발 서버를 외부 테스트 환경에 잠시 연결하거나, 콜백을 받아야 하는 디버깅에 사용할 수 있어요.
원격 포워딩은 SSH 서버 설정에 영향을 받아요. GatewayPorts가 기본값이면 서버의 루프백 주소에만 바인딩될 수 있고, 외부 인터페이스에 열려면 서버 설정과 방화벽을 함께 확인해야 해요. 또한 SSH 서버 관리자가 AllowTcpForwarding을 제한했다면 원격 포워딩이 거부될 수 있어요.
동적 포워딩으로 SOCKS 프록시 만들기
형식은 ssh -D [바인드주소:]로컬포트 user@ssh서버예요. 예시는 다음과 같아요.
ssh -N -D 1080 deploy@bastion.example.com
이 명령은 내 컴퓨터에 SOCKS 프록시를 만들어요. 브라우저나 CLI 도구가 이 프록시를 사용하도록 설정하면, 요청은 SSH 서버를 거쳐 목적지로 나가요. 목적지마다 -L을 여러 개 만드는 대신 하나의 프록시로 여러 목적지를 다룰 때 편해요.
다만 모든 애플리케이션이 SOCKS 프록시를 지원하는 것은 아니에요. 또한 동적 포워딩은 모든 트래픽을 자동으로 터널에 넣는 VPN과는 달라요. 사용하는 도구의 프록시 설정과 접근 범위를 확인해야 해요.
함께 쓰는 공통 옵션
-N: 원격 명령을 실행하지 않고 포워딩만 유지해요.-f: 인증이 끝난 뒤 백그라운드로 전환해요.-T: 의사 터미널 할당을 비활성화해요.-C: 전송 압축을 요청해요.-v: 연결과 포워딩 과정을 디버깅할 때 사용해요.-o ExitOnForwardFailure=yes: 포워딩 설정에 실패하면 세션을 종료해요.
운영에서는 -N -T를 함께 쓰고 ExitOnForwardFailure를 지정하면 셸 없이 터널만 유지하기 쉬워요. 장기 실행이 필요하면 서비스 관리자로 프로세스를 관리하고, 로그와 재시작 정책을 함께 두는 편이 좋아요.
상황별 선택
- 내 컴퓨터에서 원격 데이터베이스에 접속해야 한다면
-L을 사용해요. 목적지 주소는 SSH 서버에서 접근 가능한 주소로 지정해요. - 외부 서비스가 내 로컬 애플리케이션으로 콜백해야 한다면
-R을 검토해요. SSH 서버의 바인딩 정책과 방화벽을 먼저 확인해요. - 브라우저나 여러 도구에서 여러 목적지에 접근해야 한다면
-D로 SOCKS 프록시를 만들어요. - 연결이 되지 않을 때는
-v로 어느 단계에서 실패하는지 확인해요. 인증, 포워딩 요청, 목적지 연결 중 어디에서 막히는지 구분할 수 있어요. - 임시 디버깅이 끝나면 터널을 종료하고, 필요 없는 포트가 열린 상태로 남지 않게 해요.
상황별 선택에서 가장 흔한 실수는 로컬 포워딩과 원격 포워딩의 목적지 기준을 바꿔 생각하는 거예요. -L은 SSH 서버 쪽에서 목적지를 찾고, -R은 SSH 클라이언트 쪽에서 목적지를 찾는다고 기억하면 덜 헷갈려요.
주의할 점
ssh 터널링은 SSH 연결을 암호화하지만, SSH 서버에서 최종 목적지까지의 구간까지 항상 암호화하는 것은 아니에요. 터널이 인증이나 권한 부여를 대신하지도 않아요. 목적지 서비스의 계정과 접근 제어는 별도로 확인해야 해요.
로컬 포워딩에서 바인드 주소를 넓히면 다른 호스트가 내 터널 포트를 사용할 수 있어요. -g 옵션은 정말 필요한 경우에만 사용하고, 방화벽과 인증 정책을 함께 적용해야 해요. 원격 포워딩도 마찬가지로 SSH 서버의 GatewayPorts 설정과 외부 노출 범위를 확인해야 해요.
운영 환경에서는 목적이 분명한 터널만 짧게 유지하는 편이 좋아요. 광범위한 포트를 오래 열어 두거나, 여러 사용자가 같은 터널을 공유하면 접근 범위를 추적하기 어려워져요. SSH 키 관리, 사용자별 권한, 로그 모니터링을 함께 갖추고, 서버 설정에서 AllowTcpForwarding이나 GatewayPorts를 적절히 제한하는 것도 도움이 돼요.
자주 묻는 질문
ssh 터널링 명령어에서 -L과 -R은 무엇이 다른가요?
-L은 내 컴퓨터가 포트를 열고 SSH 서버 너머의 목적지로 연결을 보내요. -R은 SSH 서버가 포트를 열고 내 컴퓨터 쪽 목적지로 연결을 보내요. 그래서 목적지 주소를 어느 쪽에서 해석하는지가 달라요.
-N과 -f는 언제 함께 쓰나요?
-N은 원격 셸을 열지 않고 포워딩만 유지해요. -f는 인증이 끝난 뒤 백그라운드로 넘어가서 터미널을 붙잡지 않게 해요. 그래서 백그라운드 터널을 만들 때 ssh -N -f -L ... 형태로 함께 쓰는 경우가 많아요.
동적 포워딩은 VPN과 같은 역할을 하나요?
동적 포워딩은 SOCKS 프록시를 제공하는 방식이라 모든 트래픽을 자동으로 터널에 넣는 VPN과는 달라요. 애플리케이션에서 프록시를 지정해야 하고, 프록시를 지원하지 않는 도구는 별도 설정이 필요해요. 운영 환경에서는 접근 범위와 인증 정책을 함께 확인해야 해요.
출처
- OpenSSH
sshmanual: https://man.openbsd.org/ssh - OpenSSH
ssh_configmanual: https://man.openbsd.org/ssh_config - OpenSSH manuals: https://www.openssh.com/manual.html
SSH 접속과 서버 운영을 함께 점검하려면 Linux 서버 운영 명령어 모음을 참고해요.