- Published on
ssh 터널링 프로그램 총정리: 비교와 설정 방법
- Authors

- Name
- Indo Yoon
ssh 터널링 프로그램은 이미 성립한 SSH 연결을 암호화된 통로로 재사용해서, 방화벽이나 사설망 뒤에 있는 서비스에 안전하게 접근하게 해주는 도구예요. 대부분은 SSH 클라이언트에 내장된 포트 포워딩 기능을 그대로 쓰고, 여기에 자동 재연결이나 GUI, 다중 세션 관리 같은 편의 기능을 얹은 형태입니다. 결론부터 말하면 서버에서 자동화해야 하면 OpenSSH와 autossh, 데스크톱에서 손으로 붙는다면 PuTTY나 MobaXterm, 여러 목적지를 한 번에 넘겨야 한다면 동적 포워딩이나 sshuttle 쪽이 잘 맞아요.
한눈에 보기
ssh 터널링은 방향에 따라 세 갈래로 나뉘고, 프로그램은 이 세 가지를 얼마나 편하게 다룰 수 있느냐로 갈립니다.
- 로컬 포워딩(
-L): 내 PC의 특정 포트로 들어온 연결을 SSH 서버 너머의 목적지로 넘겨줘요. 사내 데이터베이스나 관리 콘솔에 접근할 때 가장 흔하게 씁니다. - 원격 포워딩(
-R): 방향이 반대예요. SSH 서버 쪽 포트를 열어서 내 쪽 서비스로 연결합니다. NAT 뒤에 있는 장비를 잠깐 노출시켜야 할 때 씁니다. - 동적 포워딩(
-D): SSH 연결 자체를 SOCKS 프록시처럼 쓰는 방식이에요. 브라우저나 CLI 도구의 프록시 설정만 바꿔서 여러 목적지로 연결을 흘려보낼 수 있습니다.
여기에 프로그램별 성격이 더해집니다. OpenSSH는 옵션만으로 모든 방향을 처리하는 기본기이고, autossh는 OpenSSH를 감싸서 연결이 끊겼을 때 다시 붙여주는 얇은 껍데기예요. PuTTY와 MobaXterm은 윈도우 데스크톱에서 터널을 클릭 몇 번으로 만들게 해주고, Termius는 여러 서버를 팀 단위로 관리하는 쪽에 무게를 둡니다. sshuttle은 포워딩 포트를 하나하나 지정하는 대신 라우팅 규칙으로 트래픽을 넘기는 별도 계열의 도구입니다.
ssh 터널링 프로그램 비교 표
| 프로그램 | 실행 환경 | 지원하는 터널 | 재연결 처리 | 배포 형태 | 잘 맞는 상황 |
|---|---|---|---|---|---|
| OpenSSH 클라이언트 | 리눅스·macOS·윈도우 | 로컬·원격·동적 | 서비스 관리자나 감시 스크립트로 직접 처리 | 대부분 운영체제에 기본 포함 | 서버 자동화, 스크립트, 유닛 파일 |
| PuTTY | 윈도우 중심 | 로컬·원격·동적 | 세션을 다시 열어야 함 | 무료 공개 | 윈도우에서 단발성 접속과 터널 |
| autossh | 유닉스 계열 | OpenSSH 옵션을 그대로 위임 | 감시 프로세스가 끊김을 감지해 재실행 | 무료 공개 | 불안정한 회선, 상시 유지 터널 |
| MobaXterm | 윈도우 | 로컬·원격·동적 | 세션 재접속과 터널 관리 기능 제공 | 무료판과 상용판 | 윈도우에서 여러 서버를 오가며 작업 |
| Termius | 크로스 플랫폼 | 로컬·원격·동적 | 앱 설정에 따름 | 구독형 상용 | 팀 공용 호스트 목록과 동기화 |
| sshuttle | 유닉스 계열·macOS | 투명 프록시 방식 | 프로세스를 다시 띄워야 함 | 무료 공개 | 목적지가 많아 포트 지정이 번거로울 때 |
표에서 눈여겨볼 점은 재연결 처리입니다. OpenSSH와 sshuttle은 끊김 복구를 사용자가 감싸야 하고, autossh와 GUI 도구들은 그 부분을 어느 정도 대신 해줍니다. 다만 어느 쪽이든 서버 쪽 설정이 막혀 있으면 터널 자체가 열리지 않으니, 프로그램보다 서버 정책을 먼저 확인하는 편이 순서상 맞아요.
OpenSSH로 터널 여는 절차
가장 재현성이 높은 방법은 OpenSSH로 한 번 손에 익혀두는 것입니다. 다른 프로그램들도 결국 같은 옵션을 GUI로 옮겨놓은 경우가 많아요.
- 접속을 먼저 확인합니다. 터널은 SSH 세션이 성립해야만 동작하므로, 키 인증과 호스트 키 확인이 정상인지 먼저 봐요.
ssh -v user@bastion.example.com처럼 확인하면 어디서 막히는지 로그로 드러납니다. - 포워딩 방향을 정합니다. 내 쪽 포트를 열려면
-L, 서버 쪽 포트를 열려면-R, 프록시처럼 쓰려면-D를 고릅니다. - 옵션을 조합해 실행합니다. 셸을 띄우지 않고 터널만 유지하려면
-N, 백그라운드로 돌리려면-f, 포워딩이 실패하면 조용히 죽지 말고 종료하려면-o ExitOnForwardFailure=yes를 붙여요.
로컬 포워딩은 아래처럼 씁니다. 내 PC의 15432 포트가 사내 데이터베이스로 이어지는 형태예요.
ssh -N -f -o ExitOnForwardFailure=yes \
-L 15432:db.internal:5432 user@bastion.example.com
원격 포워딩은 방향만 바꾸면 됩니다. 서버 쪽 18080 포트를 내 쪽 서비스로 연결하는 예시예요.
ssh -N -R 18080:localhost:8080 user@bastion.example.com
동적 포워딩은 목적지를 지정하지 않습니다. SOCKS 프록시로 쓸 로컬 포트만 정해요.
ssh -N -D 1080 user@bastion.example.com
매번 옵션을 입력하기 번거로우면 ~/.ssh/config에 Host 항목으로 남겨두는 편이 안전합니다. LocalForward, RemoteForward, DynamicForward를 Host 블록 안에 적고, ServerAliveInterval과 ServerAliveCountMax로 끊김 감지를, ExitOnForwardFailure로 실패 시 종료를 함께 지정해요. 이렇게 해두면 실행 명령은 ssh 터널이름 수준으로 줄어들고, 옵션 누락 사고도 줄어듭니다.
GUI 프로그램에서 설정하는 방법
PuTTY는 세션 설정 안의 연결 항목에 터널 메뉴가 있습니다. 원본 포트와 목적지 주소를 넣고 로컬·원격·동적 중 하나를 고른 뒤 추가를 누르면 목록에 쌓여요. 세션으로 돌아가 저장해두면 다음부터는 그대로 불러올 수 있습니다.
MobaXterm은 세션 편집 화면의 고급 SSH 설정 쪽에 네트워크 터널 항목이 있어서, 로컬 포워딩 규칙을 여러 개 등록해두고 세션과 함께 저장할 수 있어요. 세션을 열면 등록한 터널이 같이 올라오는 방식이라, 서버를 오가며 작업하는 사람에게 편합니다.
Termius는 호스트 편집 화면에서 포워딩 규칙을 추가하는 구조예요. 호스트 목록을 계정에 동기화해두고 여러 기기에서 같은 설정을 쓰는 흐름에 어울립니다. GUI 도구는 대체로 같은 옵션을 폼으로 옮긴 것이므로, OpenSSH 옵션과 대응 관계만 알아두면 화면이 달라도 헷갈리지 않습니다.
상황별 선택 기준
- 운영 서버에서 상시로 유지해야 한다면 OpenSSH에 유닛 파일을 붙이는 쪽이 관리하기 쉽습니다. 로그와 재시작 정책을 서비스 관리자에 맡길 수 있어요.
- 회선이 불안정하거나 노트북이 절전에서 자주 깨어난다면 autossh를 앞에 두는 편이 낫습니다. OpenSSH 옵션은 그대로 쓰면서 재연결만 위임할 수 있어요.
- 윈도우 데스크톱에서 가끔 붙는 정도라면 PuTTY로 충분하고, 서버를 여러 대 오가며 파일 작업까지 같이 한다면 MobaXterm이 편합니다.
- 목적지가 계속 바뀌어 포트를 미리 정하기 어렵다면 동적 포워딩이나 sshuttle을 검토합니다. 대신 프록시 설정을 쓰는 도구만 터널을 타게 된다는 점을 기억해두세요.
- 팀 단위로 호스트 목록과 키를 공유해야 한다면 Termius 같은 구독형 도구가 관리 부담을 줄여줍니다. 반대로 개인 장비에서만 쓴다면 기본 클라이언트로도 충분해요.
주의할 점
서버 쪽 설정을 확인하지 않으면 프로그램을 바꿔도 해결되지 않습니다. sshd_config의 AllowTcpForwarding이 꺼져 있으면 로컬이든 원격이든 포워딩이 거부되고, PermitOpen이 특정 목적지만 허용하고 있을 수도 있어요. 원격 포워딩은 GatewayPorts 값에 따라 바인딩 범위가 달라지므로, 외부에 노출되는 범위를 반드시 확인해야 합니다.
터널 프로세스가 남는 문제도 흔합니다. -f -N 조합으로 띄운 프로세스는 셸이 끝나도 살아 있기 때문에, 어떤 프로세스가 어떤 포트를 잡고 있는지 주기적으로 확인하는 습관이 필요해요. 자동 재연결을 붙일 때는 재시도 간격을 두지 않으면 실패 루프가 계속 돌 수 있으니 백오프를 두는 편이 안전합니다.
보안 측면에서는 터널을 우회로로 쓰지 않는 것이 중요합니다. 동적 포워딩은 편한 만큼 접근 통제를 흐리기 쉬워서, 업무에 필요한 목적지만 허용하는 정책과 함께 써야 해요. 키와 에이전트 권한을 최소화하고, 누가 어느 포트를 열었는지 서버 로그와 클라이언트 로그로 남겨두면 문제가 생겼을 때 원인을 빨리 찾을 수 있습니다.
자주 묻는 질문
ssh 터널링과 VPN은 무엇이 다른가요?
VPN은 네트워크 전체를 통로에 태우지만, ssh 터널링은 지정한 포트나 프록시 설정을 쓰는 트래픽만 통과시켜요. 그래서 특정 서비스만 잠깐 열고 싶을 때는 터널이 가볍고, 여러 서비스와 대역을 통째로 다뤄야 할 때는 VPN이 관리하기 쉽습니다.
터널이 끊기면 자동으로 다시 연결할 수 있나요?
OpenSSH 자체에는 재연결 기능이 없어서 autossh 같은 감시 도구를 앞에 두거나 서비스 관리자의 재시작 정책을 쓰는 방식으로 처리합니다. ServerAliveInterval과 ServerAliveCountMax를 함께 지정해두면 끊긴 세션을 비교적 빨리 감지할 수 있어요.
운영 서버에서 원격 포워딩을 열어도 되나요?
가능하지만 서버 쪽 포트가 열린다는 점을 먼저 따져야 합니다. GatewayPorts 기본 동작과 PermitOpen 설정을 확인하고, 필요한 동안만 열었다가 닫는 절차를 정해두는 편이 안전해요.
동적 포워딩은 언제 쓰면 좋나요?
목적지가 자주 바뀌거나 여러 주소를 오가야 할 때 유용합니다. 다만 프록시 설정을 지원하는 도구만 터널을 타므로, 모든 트래픽을 넘기고 싶다면 sshuttle처럼 다른 방식이 맞는지 함께 검토해야 해요.
출처
- OpenSSH ssh(1) 매뉴얼: https://man.openbsd.org/ssh.1
- OpenSSH ssh_config(5) 매뉴얼: https://man.openbsd.org/ssh_config.5
- PuTTY 공식 문서: https://www.chiark.greenend.org.uk/~sgtatham/putty/docs.html
- autossh 공식 페이지: https://www.harding.motd.ca/autossh/
- MobaXterm 공식 문서: https://mobaxterm.mobatek.net/documentation.html
- sshuttle 공식 저장소: https://github.com/sshuttle/sshuttle
터널을 서비스로 굴리는 방법은 ssh config 설정 정리와 systemd 유닛으로 프로세스 관리하기에서 이어서 다루고 있으니, 상시 유지가 필요한 구성이라면 함께 읽어보시면 좋아요.