직접 구성
tmux, mosh, Tailscale: 휴대폰으로 코딩 에이전트를 쓰는 직접 구성 스택
휴대폰에서 Claude Code나 Codex를 실행하는 고전적인 방법은 터미널 앱, 사설 네트워크, 로밍에도 끊기지 않는 연결, 그리고 나머지 모든 것을 견디는 세션입니다. 각각 무료이고 잘 알려져 있습니다. 정확한 명령과 함께 구성 방법을 소개하고, 어디가 괴로운지도 솔직하게 살펴봅니다.
빠른 답변
서버와 휴대폰에 Tailscale을 설치하고 tailscale set --ssh를 켜서, 서버에는 내 사설 tailnet으로만 닿게 하세요. 연결보다 오래 살도록 에이전트를 tmux new -A -s main 안에서 실행하세요. Claude Code를 위해 ~/.tmux.conf에 set -g allow-passthrough on과 extended-keys 줄을 추가하세요. Blink, Termius, Termux에서 mosh(mosh dev@server -- tmux new -A -s main)로 연결합니다. 잘 작동합니다. 약점은 작은 화면의 전체 화면 TUI와, 훅을 추가하지 않으면 푸시 알림이 없다는 점입니다.
휴대폰에서 Claude Code를 쓰는 방법을 검색해 봤다면 이 스택을 여러 블로그 글에서 봤을 겁니다. 실제로 작동하기 때문입니다. Tailscale은 포트를 열지 않고 휴대폰에서 서버까지 사설 암호화 경로를 만들어 줍니다. mosh는 Wi-Fi에서 4G로 바꾸거나 휴대폰을 잠가도 연결을 유지합니다. tmux는 그래도 연결이 끊길 때 에이전트를 계속 실행합니다. 셋을 제대로 조합하는 방법을 소개합니다.
스택 구성
| 계층 | 도구 | 해결하는 것 | 건너뛰어도 되는 경우 |
|---|---|---|---|
| 네트워크 | Tailscale (Tailscale SSH) | NAT 뒤에서도 서버에 사설로 접근. 공개 SSH 포트 없음. SSO 기반 접근 | 서버에 이미 강화된 공개 SSH가 있고 만족한다면 |
| 전송 | mosh | 로밍, 잠자기, 약한 신호를 견딤. 로컬 에코로 지연을 가림 | 안정된 네트워크에서만 접속한다면 |
| 세션 | tmux | 연결을 끊어도 에이전트가 계속 실행됨. 프로젝트별 여러 창 | 없음. 가장 중요한 계층 |
| 클라이언트 | Blink, Termius, Termux… | 휴대폰의 터미널 | — |
tmux 설정
설치하고, 어디서든 다시 연결할 수 있는 이름 있는 세션을 시작하세요.
sudo apt install tmux # Debian/Ubuntu (dnf / apk elsewhere)
tmux new -A -s main # attach to "main", or create it
cd ~/src/my-app && claude # or: codex, agy, opencode…
# detach with Ctrl-b then d — the agent keeps running
-A를 쓰면 처음이든 그 이후든 같은 명령이 작동하므로, 휴대폰 터미널 앱에 스니펫으로 저장해 두기 좋습니다. 그다음 에이전트에 필요한 설정을 tmux에 주세요. Anthropic의 터미널 설정 문서에 따르면, 다음 줄을 추가하지 않으면 tmux 안에서는 Shift+Enter가 줄바꿈 대신 전송이 되고, 알림이 바깥 터미널에 닿지 않습니다.
# ~/.tmux.conf
set -g allow-passthrough on
set -s extended-keys on
set -as terminal-features 'xterm*:extkeys'
# quality of life on a phone
set -g mouse on # scroll and pick panes with your finger
set -g history-limit 50000 # agents print a lot
tmux source-file ~/.tmux.conf로 적용하세요. extended-keys를 켜도 많은 휴대폰 키보드는 Shift+Enter를 아예 보내지 못합니다. Claude Code는 줄바꿈으로 Ctrl+J나 \ 다음 Enter도 받으며, 둘 다 어떤 터미널에서든 작동합니다.
프로젝트나 에이전트마다 tmux 창 하나를 쓰세요. Ctrl-b c는 새 창을 열고 Ctrl-b n은 다음 창으로 갑니다. 같은 저장소에서 여러 세션을 돌린다면 각각에 별도의 git worktree를 주세요. 그 내용과 재부팅 시 일어나는 일은 24시간 가이드에서 다룹니다. tmux 세션은 재부팅을 견디지 못합니다.
mosh vs ssh
일반 SSH는 하나의 TCP 연결 위에서 실행됩니다. 휴대폰의 네트워크가 바뀌거나 iOS가 앱을 한동안 일시 중지하면 그 연결은 끊기고, 다시 접속해 다시 연결해야 합니다. mosh는 SSH로 로그인해 서버에서 mosh-server를 시작한 뒤, IP 변경과 잠자기를 넘어 계속되는 자체 UDP 프로토콜로 전환합니다. 입력도 로컬에서 에코하므로 200 ms 회선도 반응이 빠르게 느껴집니다.
# on the server
sudo apt install mosh # Fedora: sudo dnf install mosh · Alpine: apk add mosh
# from a client
mosh dev@my-server -- tmux new -A -s main
mosh는 UDP 포트 60000~61000을 씁니다. 공인 IP라면 방화벽에서 이 포트를 열어야 합니다. 예를 들어 sudo ufw allow 60000:61000/udp와 클라우드 제공업체의 방화벽입니다. Tailscale을 거치면 트래픽이 tailnet 안에 머물므로 공개 포트가 필요 없습니다. 한계 하나: mosh는 보이는 화면만 동기화하므로 mosh 자체로는 스크롤백이 없습니다. mosh 문서도 기록에는 tmux나 screen을 권하는데, 둘을 함께 쓸 이유가 하나 더 생깁니다.
Tailscale SSH
Tailscale은 서버와 휴대폰을 사설 WireGuard 네트워크(tailnet)에 넣습니다. Tailscale SSH는 한 걸음 더 나아가, tailnet ID로 SSH 인증을 Tailscale이 처리하므로 SSH 키를 배포할 필요가 전혀 없습니다.
# on the server (Linux)
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up # log in to your tailnet
sudo tailscale set --ssh # enable Tailscale SSH
Tailscale 문서에 따르면 tailscale set --ssh는 tailnet에서 오는 트래픽에 대해 tailscaled가 포트 22를 맡게 합니다. 그러면 일반 SSH 클라이언트가 머신의 MagicDNS 이름으로 ssh dev@my-server처럼 접속합니다. 세부 사항:
- 확인 모드. 기본 정책은
"action": "check"를 쓰므로 가끔 브라우저에서 다시 인증하라는 요청을 받습니다. 터미널에 로그인 URL이 나타나는 것은 정상입니다. - 서버 플랫폼. Linux는 완전히 지원됩니다. macOS에서는 오픈 소스
tailscale+tailscaledCLI 빌드만 Tailscale SSH 서버가 될 수 있으므로, App Store 앱을 쓰는 Mac mini는 tailnet 위에서 일반 SSH를 써야 합니다. - 공개 포트를 닫으세요. tailnet으로 머신에 닿는 것을 확인했다면, 제공업체 방화벽에서 공개 포트 22를 닫으세요. 스스로를 잠그지 않도록 두 번째 세션을 연 채로, 이 순서대로 하세요.
휴대폰에서는 Tailscale 앱을 설치하고 같은 tailnet에 로그인한 뒤 연결된 채로 두세요. 그러면 터미널 앱이 my-server에 로컬 네트워크에 있는 것처럼 닿습니다.
iOS와 Android 클라이언트
| 클라이언트 | 플랫폼 | mosh | 참고 |
|---|---|---|---|
| Blink Shell | iPhone, iPad | 예 | mosh 중심으로 만들어짐. iPad에서 하드웨어 키보드 지원이 강력함. blink.sh에 따르면 2주 체험 후 연 $19.99 |
| Termius | iOS, Android, 데스크톱 | 예 | 무료 Starter 등급에 SSH와 mosh 포함. 기기 간 동기화는 Pro(termius.com/pricing에 따르면 연간 결제 시 월 $10) |
| Termux | Android | 예 (pkg install openssh mosh) | 휴대폰 위의 완전한 Linux 사용자 공간. 무료 오픈 소스 |
| JuiceSSH | Android | 예 | mosh.org에 mosh 클라이언트로 등재 |
어떤 클라이언트를 고르든 Esc, Ctrl, Tab, 화살표가 있는 추가 키 줄을 설정하세요. Claude Code는 중단에 Esc를, 권한 모드 순환에 Shift+Tab을 쓰는데, 둘 다 기본 휴대폰 키보드에는 없습니다.
어디가 괴로운가
스택 자체는 믿을 만합니다. 괴로운 것은 신뢰성 이외의 모든 것입니다.
- 6인치 화면의 데스크톱 TUI. Claude Code, Codex, agy는 100열 이상을 전제로 만들어졌습니다. 휴대폰에서는 줄바꿈된 diff를 읽고, 도구 출력을 엄지로 스크롤하고, 입력 줄을 찾아 헤매게 됩니다.
- 푸시 알림 없음. 에이전트가 끝나거나 승인이 필요해도, 훅을 추가하지 않으면 아무것도 알려 주지 않습니다. 터미널은 앱이 앞에 있을 때만 알림을 줍니다. 사람들이 덧붙이는 ntfy 훅은 휴대폰에서 요청 승인하기 가이드에서 다룹니다.
- 스크롤백에 묻힌 승인. 권한 요청은 바쁜 창 속 몇 줄일 뿐입니다. 한 시간 뒤에 돌아오면 그것을 찾고, 읽고, 화살표 키로 답해야 합니다.
- 백그라운드 문제. iOS는 터미널 앱을 떠나면 곧 일시 중지합니다. 돌아오면 mosh가 회복하지만, 앱이 백그라운드에 있는 동안 세션을 지켜봐 줄 수는 없습니다.
- 복사와 붙여넣기. tmux, mosh, 휴대폰 터미널에 걸쳐 텍스트를 선택하는 것은 고통스럽습니다. 로그인 링크 같은 긴 URL이 최악입니다.
- 여러 서버, 여러 에이전트. 머신이 늘 때마다 Tailscale 노드, 호스트 항목, 기억해야 할 tmux 배치가 하나씩 늘어납니다.
이 중 어느 것도 이 스택을 피할 이유는 아닙니다. 무료이고, 모든 에이전트와 작동하며, 모든 부분을 직접 제어합니다. 다만 무엇을 감수하는지는 알아야 합니다. 장단점은 SSH 터미널 앱과 Maude 비교에서 자세히 다룹니다.
또는 전용 앱을 쓰세요
Maude는 에이전트 작업에서 클라이언트와 세션 계층을 대신합니다. 서버의 작은 데몬이 세션을 소유하므로 tmux 없이도 계속 실행되고, 앱은 이를 채팅으로 보여 주며 도구 카드, diff, 허용/거부가 있는 푸시 알림, 받은함을 제공합니다. Tailscale은 그대로 쓸 수 있습니다. 서버가 Maude 릴레이로 먼저 연결하고 SSH를 대체 수단으로 쓰므로, Maude는 tailnet과 LAN의 서버에서도 작동합니다. 셸이 필요할 때는 각 세션에 진짜 터미널이 있습니다. Claude Code, Codex, OpenCode, Grok Build, Antigravity에서 작동합니다.
자주 묻는 질문
Claude Code에는 tmux와 screen 중 무엇이 좋나요?
allow-passthrough와 extended-keys)을 문서화했고, 분할과 스크립팅이 더 쉬우며, 대부분의 휴대폰 터미널 가이드가 tmux를 전제로 합니다.