연결을 받아 줄 수 없는 머신에 SSH로 들어가고 싶습니다. 공유기 뒤의 집 서버, 사무실의 라즈베리 파이, 모바일이나 5G 회선에 물린 상자 같은 것들요. 예전 답 — 공유기에서 22번 포트를 포워딩하기 — 는 점점 쓸 수 없게 됐고, 가능한 경우라도 좋지 않은 생각입니다. 이 글은 실제로 통하는 네 가지 접근, 각각이 치르는 비용, 그리고 각각의 실전 예제를 짚습니다. 넷 모두 접근하려는 머신에 인바운드 포트를 열지 않습니다.
왜 이제 그냥 포트를 포워딩할 수 없나
두 가지가 발목을 잡습니다. 첫째, **캐리어 그레이드 NAT(CGNAT)**입니다. 요즘 대부분의 가정용 광랜·케이블·모바일·Starlink 연결은 하나의 공인 IP를 여러 고객이 공유합니다. 그래서 “내” 주소에는 포워딩할 포트가 없습니다 — 내가 제어하는 공유기가 공인 IP를 쥔 그 공유기가 아니거든요. 둘째, 진짜 공인 IP가 있더라도 포워딩된 SSH 포트는 몇 분 안에 스캐너에게 발견됩니다. 포트가 열린 순간부터 로그가 무차별 대입 시도로 가득 찹니다. 아래 모든 경우의 해법은 같은 모양입니다. 사설 머신이 닿을 수 있는 무언가로 아웃바운드 연결을 걸고, 내가 그 연결을 타고 되돌아 들어갑니다. 아웃바운드는 CGNAT와 꽉 잠긴 방화벽을 통과하는데, 그저 네트워크를 떠나는 또 하나의 연결일 뿐이기 때문입니다.
네 가지 선택지 한눈에 보기
| 방식 | 실행하는 것 | 추가 인프라 | 상자에 장기 키? | 적합한 경우 |
|---|---|---|---|---|
| 리버스 SSH 터널 | 상자에서 ssh -R + autossh | 공인 IP를 가진 VPS | 예 (VPS용) | 이미 VPS를 빌려 쓰는 경우 |
| 메시 VPN (Tailscale / WireGuard) | 양쪽에 VPN 클라이언트 | 조정 서비스 | 평소 쓰는 SSH 키 | 여러 머신에 접근할 때 |
| Cloudflare Tunnel | 상자에서 cloudflared | Cloudflare 계정 + 도메인 | 평소 쓰는 SSH 키 | 이미 Cloudflare를 쓰는 경우 |
| 아웃바운드 Connector | 상자에서 작은 에이전트 | Termalin 계정 | 아니요 — 단기 인증서 | 브라우저 접근, VPS·VPN 불필요 |
앞의 셋은 내 노트북에서 평범한 ssh you@…를 쓰게 해 줍니다. 마지막 하나는 대신 브라우저나 AI 에이전트에서 상자에 닿습니다. 어느 것이 맞는지는 이어서 읽어 보세요.
옵션 1 — VPS를 거치는 리버스 SSH 터널
공인 IP를 가진 저렴한 VPS를 이미 빌려 쓰고 있다면, 사설 상자가 거기로 전화를 걸어 자신의 SSH 포트를 되돌려 포워딩할 수 있습니다. NAT 뒤의 상자에서:
ssh -N -R 2222:localhost:22 tunnel@vps.example.com
이는 VPS에 2222 포트를 열고, 거기로 들어오는 모든 연결을 집 상자의 22 포트로 되돌려 보냅니다. 어디서든 VPS를 거쳐 상자에 뛰어듭니다:
ssh -J tunnel@vps.example.com -p 2222 you@localhost
생 ssh -R은 네트워크가 처음 딸꾹질하는 순간 죽으니, autossh로 감싸 systemd 유닛 아래에 두어 재부팅과 끊김을 넘어 살아 있게 하고, -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes를 더하세요. 전체 메커니즘은 — GatewayPorts 함정과 왜 터널이 기본적으로 VPS의 루프백에 묶이는지까지 — SSH 리버스 터널 완전 정리에 있습니다. 대가: VPS 하나와, 거기에 닿을 수 있는 장기 키를 상자에 두고 유지해야 하며, 이제 그 VPS가 공격 표면의 일부가 됩니다.
옵션 2 — 메시 VPN(Tailscale 또는 WireGuard)
포트 하나를 노출하는 대신, 두 머신을 둘만 볼 수 있는 사설 네트워크에 올려 두세요. Tailscale이 손이 덜 가는 쪽입니다. NAT 뒤의 상자에서:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
노트북에도 Tailscale을 설치하면 둘 다 안정적인 100.x.y.z 주소(그리고 MagicDNS 이름)를 받습니다. 그러면 그냥:
ssh you@home-box
로 같은 LAN에 있는 것처럼 됩니다 — 상자는 공용 인터넷에 전혀 노출되지 않습니다. sudo tailscale up --ssh는 SSH 인증까지 처리해 주어 그 키를 따로 관리하지 않아도 됩니다. WireGuard는 같은 발상을 손으로 짠 것입니다. 조정을 직접 운영하고 피어를 수동으로 설정합니다 — 손은 더 가지만 제3자 조정자가 없습니다. NAS와 파이 몇 대가 있는 홈랩이라면 보통 메시 VPN이 답의 전부이고, 홈 NAS·서버 가이드에서 제가 가장 먼저 꺼내는 기본 선택이기도 합니다. 대가: 접근이 필요한 모든 기기가 네트워크에 합류해야 하므로, 설치할 클라이언트와 운영할 계정이 생깁니다.
옵션 3 — Cloudflare Tunnel
도메인이 이미 Cloudflare에 있다면, cloudflared가 열린 포트 없이 아웃바운드 터널을 만들어 줍니다. 상자에서:
cloudflared tunnel login
cloudflared tunnel create home
터널 설정에서 호스트명을 터널로 라우팅하고 로컬 sshd(ssh://localhost:22)를 가리키게 한 다음, cloudflared를 서비스로 돌리세요. 클라이언트 쪽에서는 ~/.ssh/config(영어)의 ProxyCommand를 통해 SSH가 거기에 닿습니다:
Host ssh.example.com
ProxyCommand cloudflared access ssh --hostname %h
이제 ssh you@ssh.example.com이 Cloudflare 엣지를 거쳐 상자로 흐릅니다. 무료 등급으로도 됩니다. 대가: SSH를 제3자를 거쳐 라우팅하고, Cloudflare 계정과 거기에 호스팅한 도메인에 의존하게 됩니다 — 이미 그렇게 쓰고 있다면 훌륭하고, 아니라면 과합니다.
옵션 4 — 아웃바운드 Connector(VPS도 VPN도 없이)
위의 세 선택지는 각각 상주 인프라를 요구합니다 — VPS, VPN, 또는 Cloudflare 도메인이요. Termalin의 Connector는 그것을 명령 하나로 줄이고, 로컬 ssh 대신 브라우저, Termalin 앱, 또는 AI 에이전트에서 상자에 닿습니다. 사설 서버에서 한 줄이면 작은 정적 에이전트가 설치됩니다(Linux x86_64와 arm64):
curl -fsSL https://termal.in/tunnel-install.sh | sudo TERMALIN_TOKEN=<token> sh
에이전트는 단일 WebSocket으로 Termalin에 바깥쪽으로 전화를 걸어 그것을 열어 둡니다. 포트에서 수신하는 일은 결코 없습니다. 웹 클라이언트에서 터미널을 열면 요청이 그 링크를 타고 내려가고, 에이전트가 localhost에서 상자 자신의 sshd로 연결합니다 — 불투명한 SSH 바이트만 오갈 뿐이라, 자격 증명이나 세션 평문을 결코 보지 못합니다. 등록 과정에서 상자의 sshd가 Termalin의 SSH 인증 기관을 신뢰하게 되므로, 로그인은 서버에 놓인 장기 개인 키가 아니라 단기 인증서를 씁니다. 표에서 상자에 장기 키가 “아니요”인 바로 그 행입니다.
솔직하게 짚자면: 상자에는 Termalin의 호스팅 쪽을 거쳐 닿습니다 — 웹 터미널, Termalin 데스크톱·iOS 앱(같은 게이트웨이로 연결됩니다), 또는 MCP 서버를 통한 AI 에이전트 — 내 머신에서 날리는 생 ssh 명령으로는 아닙니다. 그리고 Connector는 유료 요금제(또는 체험)의 일부입니다. 원하는 게 노트북에서 쓰는 평범한 터미널이라면 옵션 1–3이 더 맞습니다. 원하는 게 어떤 기기에서든 쓰는 브라우저 접근이라면 — 또는 공인 주소도, 훔칠 키도 없는 상자에서 에이전트가 일하게 하는 것이라면 — 이게 바로 그 용도로 만든 옵션입니다. 같은 아웃바운드 Connector는 열린 포트가 없는 상자를 위한 경량 모니터링과 알림도 함께 실어 나릅니다.
어느 것을 골라야 하나
- 이미 VPS를 빌려 쓴다면: 리버스 터널이 그걸 재활용합니다 — autossh 아래
ssh -R하나면 끝입니다. - 닿아야 할 머신이 둘 이상이거나, LAN처럼 느껴지길 원한다면: Tailscale 같은 메시 VPN이 가장 잘 확장되고 아무것도 노출하지 않습니다.
- 도메인이 Cloudflare에 있다면: 그들의 터널이 새 벤더 없이 자연스럽게 맞습니다.
- 상주 인프라 제로, 브라우저 접근, 또는 감독된 에이전트 접근을 원한다면: 서버에 장기 키를 남기지 않는 아웃바운드 Connector입니다.
넷 모두 기억할 만한 한 원칙을 공유합니다: 스캔당해도 괜찮지 않은 머신에는 절대 인바운드 포트를 열지 마세요. 대신 바깥으로 손을 뻗게 하세요 — 그 단 하나의 방향 역전이 NAT 뒤 SSH를 안전하게 만듭니다.
Termalin은 저장된 터널, 웹 터미널, 그리고 사설 서버를 위한 키 없는 Connector를 갖춘 무료 크로스 플랫폼 SSH 클라이언트입니다 — 다운로드하거나, 키를 안전하게 다루는 방식을 확인해 보세요.