내 휴대폰에서 사용하는 Claude Code: Tailscale, Termius, 그리고 주머니 속의 전체 머신
요약
Claude Code의 내장 기능인 /remote-control의 한계를 넘어, Tailscale과 Termius를 활용해 모바일 환경에서 워크스테이션 전체를 제어하는 방법을 소개합니다. 이를 통해 장소에 구애받지 않고 원격으로 코드베이스를 탐색하고 새로운 Claude 세션을 시작할 수 있는 환경을 구축할 수 있습니다.
핵심 포인트
- Claude Code의 /remote-control 기능은 단일 세션 미러링에 국한됨
- Tailscale을 사용하여 복잡한 설정 없이 프라이빗 메쉬 네트워크 구축
- Termius를 통해 모바일에서 워크스테이션으로 SSH 접속 가능
- 워크스테이션 전체를 주머니 속(모바일)으로 가져오는 개발 환경 구축
Claude Code는 내 작업 세션의 형태를 바꾸어 놓았습니다. 예전에는 작업 내내 자리에 앉아 있어야 했지만, 이제는 작업을 시작만 해둡니다. 리팩터링 (Refactor), 일괄 번역, 마이그레이션 스크립트 (Migration script)? 작업을 설명하면 에이전트 (Agent)가 작업을 시작하고, 솔직히 말해서 몇 분 동안은 키보드 앞에 내가 있을 필요가 없어집니다. 바로 그때가 내가 자리에서 일어나는 순간입니다. 그러다 주방에 가 있으면, '4분 전에 나에게 권한 확인 질문을 하려고 멈췄나?' 하는 생각이 들곤 합니다.
이에 대한 Anthropic의 해답은 /remote-control이며, 이는 훌륭합니다. 하지만 저에게는 계속해서 같은 벽에 부딪히는 문제가 있었고, 해결책은 두 개의 앱, 하나의 플래그 (Flag), 그리고 하나의 tmux 세션이었습니다. 클라우드 서비스도, 노출된 포트 (Exposed port)도, 그 어떤 영리한 기술도 필요하지 않았습니다. 이제 내 워크스테이션 (Workstation) 전체가 주머니 속에 들어왔으며, 이 포스트는 제가 이 시스템을 구축하기 전에 읽었더라면 좋았을 '방법(how-to)'에 대한 글입니다.
/remote-control이 제공하는 것과 한계
먼저 공로를 인정하자면, 내장된 기능은 진정으로 유용합니다. 실행 중인 Claude Code 세션에서 /remote-control (또는 /rc)을 입력하고 QR 코드를 스캔하면, 해당 세션이 휴대폰의 Claude 앱에 미러링 (Mirroring)됩니다. 집에 있는 머신은 계속 작업을 수행하며, 아무것도 클라우드로 이동하지 않습니다. 그리고 당신은 어디에 있든 대화를 제어할 수 있습니다. 에이전트가 작업을 마치거나 답변이 필요할 때 푸시 알림 (Push notification)도 받을 수 있습니다. "작업이 멈춰서 나에게 무언가를 물어보려나?" 하는 문제에 대해서는 적절한 도구이며, 저도 여전히 사용하고 있습니다.
하지만 이것은 '하나의 세션'을 미러링할 뿐입니다. 즉, 책상을 떠나기 전에 시작한 하나의 저장소 (Repo) 내에서의 하나의 대화입니다. 휴대폰에서는 다른 프로젝트로 cd 할 수 없습니다. Docker 컨테이너가 왜 CPU를 점유하고 있는지 확인할 수 없습니다. 기차 안에서 갑자기 아이디어가 떠올랐다고 해서 다른 코드베이스에서 두 번째 Claude 세션을 시작할 수도 없습니다. 이 기능은 "이미 실행 중인 것을 제어하게 해달라"는 요구에는 답을 주지만, 그 외에는 아무것도 해주지 않습니다. 그것이 기능의 역할이니 공정하긴 합니다. 제 문제는 소파에서 내 머신에 접속할 수 있게 되자, 머신의 나머지 부분까지도 계속 원하게 되었다는 점입니다.
설정은 두 개의 앱과 하나의 플래그로 이루어집니다
구성 요소: 워크스테이션과 휴대폰에 설치된 Tailscale, 그리고 Android의 SSH 클라이언트인 Termius입니다. Tailscale은 장치 간에 프라이빗 WireGuard 메쉬 (mesh)를 구축합니다. 즉, 노트북과 휴대폰이 Wi-Fi, 4G 등 네트워크 환경에 상관없이 따라다니는 작은 가상 네트워크 ("tailnet")에 함께 놓이게 됩니다. 포트 포워딩 (port forwarding), 동적 DNS (dynamic DNS), 유지 관리해야 할 VPS 릴레이 (relay)가 전혀 필요 없습니다.
저를 놀라게 한 부분은 Tailscale SSH라고 불리는 기능 덕분에 서버 측 설정이 매우 적다는 점입니다. Linux를 실행 중인 제 워크스테이션, Dell Precision 3570의 상태는 다음과 같습니다:
$ which sshd
# nothing
$ ss -tlnp | grep :22
...
OpenSSH 서버가 설치되어 있지 않습니다. 22번 포트에서 대기 중인 프로세스도 없습니다. 그런데도 저는 매일 휴대폰에서 이 머신으로 SSH 접속을 합니다. Tailscale SSH는 tailscaled 자체가 tailnet 인터페이스를 통해 들어오는 SSH 연결에 응답한다는 것을 의미합니다. 데몬 (daemon)이 연결을 종료하고, 사용자의 tailnet 신원을 확인한 뒤 쉘 (shell)을 넘겨줍니다. LAN 측에서든, 인터넷 측에서든, tailnet이 아닌 다른 어떤 인터페이스를 통해서도 통신할 수 있는 SSH는 존재하지 않습니다.
이는 키 관리 (key-management) 번거로움도 없애줍니다. 인증 방식은 "이 장치가 당신과 동일한 tailnet에 로그인되어 있음"을 확인하는 방식입니다. authorized_keys도, 비밀번호도 필요 없으며, 새 휴대폰을 사용할 때 로그인 외에 교체해야 할 것도 아무것도 없습니다.
워크스테이션 측: 명령어 하나로 끝내기
Tailscale을 설치합니다 (공식 스크립트 또는 배포판 패키지 사용):
curl -fsSL https://tailscale.com/install.sh | sh
그 다음 SSH를 활성화하여 실행합니다:
sudo tailscale up --ssh
이것이 서버 설정의 전부입니다. 이제 tailscale status 명령어를 치면 머신이 표시되어야 하며, 휴대폰이 접속되면 다음과 같이 둘 다 나타납니다:
100.71.141.2 tom-precision-3570 tom@ linux -
100.112.88.16 s23-ultra-de-tom tom@ android active
누가 무엇에 SSH 접속을 할 수 있는지는 관리 콘솔(admin console)에 있는 tailnet의 ACL 정책에 의해 결정됩니다. 기본 설정은 무조건 신뢰하기보다 직접 읽어보는 것이 좋습니다:
"ssh": [
{
"action": "check",
...
autogroup:self는 동일한 사용자가 소유한 머신에만 SSH 접속이 가능하다는 의미입니다. 개인용 tailnet(테일넷)에서는 본인뿐이지만, 나중에 tailnet을 공유하게 될 날을 대비하면 중요한 설정입니다. 그리고 `
모바일 SSH 연결은 끊어질 수 있습니다. 엘리베이터, 기차 터널, 혹은 Android가 Termius의 백그라운드 실행 시간이 충분하다고 판단하여 프로세스를 종료하는 경우 등 말이죠. 그리고 일반적인 SSH 셸은 연결과 함께 종료됩니다. 즉, 원격 프로세스가 중단되며, 만약 Claude가 작업 중이었다면 진행 중이던 턴(turn)도 함께 사라집니다. claude --resume 명령어로 대화 내용은 다시 불러올 수 있겠지만, 연결이 끊겼을 당시 에이전트(agent)가 수행하던 작업 자체를 복구할 수는 없습니다.
tmux는 이 문제를 완화하는 대신 근본적으로 해결합니다. 워크스테이션에서 모든 것은 누군가 지켜보고 있는지 여부와 상관없이 멀티플렉서(multiplexer) 내부에서 실행됩니다:
tmux new -A -s phone
-A는 'attach-or-create(연결 또는 생성)'를 의미합니다. 첫 번째 연결이 세션을 만들고, 이후의 모든 연결은 해당 세션으로 다시 진입합니다. 터널에서 연결이 끊겨 커버리지가 떨어지더라도, 30초 후 Termius가 재연결되어 다시 tmux new -A -s phone을 실행하면, Claude는 아무 일도 없었다는 듯이 세 번의 도구 호출(tool calls)을 더 진행한 상태로 그대로 남아 있습니다. 또한 이 세션은 내일 책상 앞에 앉아 tmux attach -t phone 명령어로 이어서 작업할 수 있는 바로 그 세션이기도 합니다.
~/.tmux.conf에 두 줄만 추가하면 터치스크린에서도 편리하게 사용할 수 있습니다:
set -g mouse on
set -g history-limit 50000
마우스 모드(Mouse mode)를 설정하면 tmux의 스크롤백(scrollback)이 터치에 반응합니다. 오프라인 상태인 동안 에이전트가 수행한 작업들을 스와이프하여 스크롤할 수 있습니다. 또한 Termius에서 tmux new 명령어를 시작 스니펫(startup snippet)으로 실행하도록 설정하면, 세션에 연결하는 것이 기억해야 할 습관이 아니라 연결 자체의 속성이 됩니다.
전체 셸(Full shell)이 가능하게 하는 것들
어느 저녁, 제가 대략적으로 사용하는 단계는 다음과 같습니다:
데스크톱 세션 재개. 프로젝트 디렉토리로 cd 한 뒤 claude --resume을 입력하면, 제가 자리를 비웠던 바로 그 지점에서 대화가 이어집니다. 이것만으로도 대부분의 날에는 /remote-control 기능이 필요 없습니다.
어디서든 새로운 세션 시작. 기차 안에서 아이디어가 떠오르면? cd ~/projects/whatever && claude를 입력하여 다른 리포지토리(repo)에서 완전히 새로운 세션을 시작합니다. 휴대폰에서 시작한 세션도 일반 세션과 동일합니다. 내일 책상 앞에 앉아 --resume을 사용하면 큰 화면에서 해당 세션들을 불러올 수 있습니다.
TUI(Text User Interface) 없는 원샷 질문 (One-shot questions). claude -p "what does the failing test in payments actually assert?"를 입력하면 답변을 출력하고 종료됩니다. 휴대폰 화면에서는 때때로 이것만으로도 충분할 때가 있습니다.
머신 그 자체. 이 사이트를 서비스하는 컨테이너에서 docker compose logs -f를 실행하고, 리포지토리(repo)에서 git pull을 하고, 빌드를 시작하거나 디스크 공간을 확인합니다. 책상에서 하던 모든 일을 책상 없이 그대로 수행할 수 있습니다.
그리고 예상치 못한 보너스: 휴대폰은 단순한 SSH 클라이언트가 아니라 네트워크의 피어(peer)입니다. 워크스테이션에서 npm run dev -- --host를 실행하면, 휴대폰의 브라우저에서 http://tom-precision-3570:4321을 통해 개발 서버에 접속할 수 있습니다. 터널링(tunnel)도, 포트 포워딩(port forwarding)도 필요 없습니다. 실제 휴대폰에서 레이아웃 변경 사항을 검토하고, Claude에게 수정을 요청한 뒤, 손안에 있는 페이지가 핫 리로드(hot reload)로 업데이트되는 것을 지켜보았습니다.
솔직한 한계점
홍보 책자를 쓰는 것이 아니기에, 두 가지 한계점을 말씀드립니다.
워크스테이션이 깨어 있어야 합니다. 제 기기는 노트북입니다. 덮개를 닫으면 절전 모드(suspend)로 들어가는데, 절전 모드 상태의 머신은 tailnet 피어가 될 수 없습니다. 제 기기는 대부분 절전 모드를 비활성화한 채 독(dock)에 연결되어 있지만, 만약 사용자의 기기가 절전 모드로 들어간다면 집을 나서기 전에 설정을 변경해야 합니다.
유리 화면 위의 타이핑. 휴대폰으로 에이전트(agent)를 조종하는 것은 편안합니다. 에이전트가 타이핑을 대신해주기 때문입니다. 실제로 휴대폰 SSH를 통해 직접 편집(editing)을 하는 것은 고문이나 다름없습니다. 이 설정이 빛을 발하는 이유는 바로 Claude Code가 그 비율을 뒤집기 때문입니다. 사용자는 짧은 명령을 보내고, 머신은 방대한 작업 결과물을 돌려줍니다.
보안 (한 단락 요약)
이 설정의 어떤 부분도 인터넷에서 접근할 수 없습니다. 열려 있는 포트도, 공개 엔드포인트(public endpoint)도, 심지어 SSH 데몬(daemon)조차 없습니다. 공격 표면(attack surface)은 "내 tailnet에 있는 장치가 되는 것"뿐이며, 이는 제가 관리 콘솔에서 제어하고 클릭 한 번으로 제거할 수 있는 목록에 정확히 포함됩니다. 현실적인 위험은 휴대폰 자체로 옮겨갔으며, 이것이 바로 번거로움에도 불구하고 체크 모드(check-mode) 재인증과 Termius의 앱 잠금 기능을 유지하는 이유입니다. 포트 22를 노출하고 fail2ban을 사용하며 운에 맡기는 전통적인 방식과 비교해 보면, 이 방식은 단순히 더 편리할 뿐만 아니라 기존 방식보다 노출 위험이 더 적습니다.
핵심 요약 (Takeaways)
/remote-control과 SSH는 경쟁 관계가 아니라 상호 보완적인 단계입니다. 단순히 세션 미러링(Mirroring)만 필요할 때는/remote-control을 사용하고, 그 이상이 필요할 때는 전체 셸(Shell)을 유지하세요. 저는 같은 저녁 시간 동안 이 두 가지를 모두 사용합니다.- Tailscale SSH를 사용하면 보안을 강화(Harden)해야 할 서버가 없습니다.
sshd도, 열려 있는 포트도, 키(Key)도 없습니다. SSH 서버는 메시 데몬(Mesh daemon)이며, 오직 메시 네트워크만이 이를 볼 수 있습니다. - Tailnet에 연결된 휴대폰은 단순한 터미널이 아니라 완전한 네트워크 피어(Peer)입니다. 개발 서버, 대시보드,
--host에 바인딩된 모든 것은 휴대폰 브라우저에서 URL 하나만으로 접근 가능합니다. - tmux는 모바일 연결을 지루할 정도로 안정적으로 만듭니다. 매 연결 시작 시
tmux new -A -s phone을 실행하면, 연결이 끊겨도 아무런 문제가 없습니다. 에이전트(Agent)는 계속 작동하고 있으며, 당신은 다시 재연결(Reattach)하기만 하면 됩니다.
이 모든 과정은 30분도 채 걸리지 않았으며, 대부분의 시간은 Termius의 글꼴 크기를 조절하는 데 사용되었습니다. 그리고 이 변화는 Claude Code가 데스크톱에서 이미 만들어낸 변화를 외부로 확장한 것과 같습니다. 즉, 기계가 작동하고 당신은 지시하는 것입니다. 지시하는 작업은 휴대폰 화면에서도 충분히 잘 이루어진다는 것이 증명되었습니다.
원문은 tom-girou.dev에 게시되었으며, 프랑스어와 스페인어 버전도 제공됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기