1편에서 tmux를 다뤘습니다. 이번에는 그걸 실제로 써서, 집에 있는 데스크탑에서 하던 작업을 밖에서 노트북으로 이어받는 구성을 만들어 보겠습니다.
제 상황은 이렇습니다. 곧 Mac Studio가 들어오는데, 거기서 작업하다가 그 상태를 그대로 놔둔 채 외출해서 맥북으로 이어서 하고 싶습니다. 부수적으로, 데스크탑에 설치한 개발 도구와 설정을 노트북에서 그대로 쓰고 싶습니다.
먼저 정리할 것: 화면 미러링은 마지막 수단입니다
보통 이런 얘기를 하면 원격 데스크탑부터 떠올립니다. 그런데 목적이 "작업 상태를 이어받는 것"이지 "화면을 보는 것"이 아니라면, 화면을 통째로 영상으로 보내는 건 낭비입니다.
| SSH + tmux | 화면 공유 | |
|---|---|---|
| 대역폭 | 수십 KB/s | 수십 Mbps |
| 지연 체감 | 거의 없음 | 그대로 |
| 노트북 사양 | 무관 | 디코딩 부담 |
| 연결이 끊기면 | 작업은 계속 진행 | 재접속 필요 |
| GUI 앱 상태 | 못 봄 | 그대로 |
그래서 터미널 작업은 SSH와 tmux로, GUI 앱이 꼭 필요할 때만 화면 공유로 나누는 게 맞습니다.
구조
[ 밖 - 노트북 ] [ 집 - 데스크탑 ]
Tailscale <--- WireGuard ---> Tailscale
| (NAT 통과) |
ssh desktop -----------------> sshd
| |
tmux attach -t main ----------> tmux 세션 "main"
(작업이 계속 돌고 있음)
1단계. 외부에서 집으로 들어가기 - Tailscale
집 공유기 안쪽에 있는 데스크탑에 밖에서 붙으려면 NAT를 넘어야 합니다. 전통적인 방법은 공유기에서 포트포워딩을 여는 건데, 공인 IP에 포트를 노출하는 일이라 권하지 않습니다. 스캔 봇이 하루에도 수백 번 두드립니다.
Tailscale은 WireGuard 기반 메시 VPN입니다. 양쪽에 설치하고 같은 계정으로 로그인하면 끝입니다.
- 공유기 설정 불필요, 외부에 열리는 포트 없음
- 기기마다 고정 주소(100.x.x.x)와 이름이 붙습니다
- 개인 용도는 무료 티어로 충분합니다
brew install --cask tailscale # 양쪽 모두
tailscale status # 기기 목록 확인
이후로는 ssh desktop처럼 이름으로 붙을 수 있습니다. 집이든 카페든 LTE든 똑같습니다.
2단계. 작업을 살려두기 - tmux
핵심은 이겁니다. 데스크탑에서 작업을 시작할 때부터 tmux 안에서 합니다.
# 데스크탑 앞에서
tmux new -s main
(작업 시작)
# 외출. 노트북에서
ssh desktop -t tmux attach -t main
화면이 그대로 이어집니다. 실행 중이던 작업도 계속 돌고 있습니다. 회선이 끊겨도 데스크탑에서는 계속 진행되고, 다시 붙으면 됩니다.
덤으로, 데스크탑 앞에서도 같은 세션을 동시에 열 수 있습니다. 양쪽 화면이 미러됩니다. 집에 돌아와서 노트북을 덮고 데스크탑 앞에 앉으면 그 화면이 이미 떠 있습니다.
3단계. GUI가 필요할 때만 화면 공유
Xcode나 디자인 툴처럼 창 상태가 중요한 작업은 어쩔 수 없이 화면이 필요합니다.
데스크탑에서 시스템 설정 - 일반 - 공유 - 화면 공유를 켜고, 노트북에서 Finder - 서버에 연결로 vnc://desktop에 붙습니다.
여기서 알아둘 제약이 있습니다. macOS의 고성능 화면 공유는 양쪽 맥이 모두 Apple Silicon이어야 합니다. Intel 맥은 해당이 없습니다. 제 맥북이 2018년 Intel 모델이라 저는 일반 모드만 씁니다.
참고로 고성능 모드의 요구사항은 4K 단일 디스플레이 기준 75Mbps에 낮고 일정한 지연, 유선 권장입니다. 밖에서 쓰는 상황에는 어차피 맞추기 어렵습니다.
중요한 구분: 클라우드 세션은 대체재가 아닙니다
요즘 AI 코딩 도구들이 클라우드에서 세션을 돌려주는 기능을 제공합니다. 그럼 이런 구성 없이 그걸 쓰면 되지 않나 싶은데, 다릅니다.
| 어디서 실행 | 내 데스크탑 파일 | 집 LAN (NAS 등) | 설치한 도구, 설정 | |
|---|---|---|---|---|
| 클라우드 세션 | 업체 서버 | 없음 | 없음 | 없음 |
| SSH + tmux | 내 데스크탑 | 있음 | 있음 | 있음 |
클라우드 세션은 저장소를 클라우드 샌드박스에 체크아웃해 돌리는 구조입니다. 내 데스크탑 자원을 꺼내 쓰는 게 아니라 다른 기계를 빌리는 겁니다. 로컬 파일도, 집 NAS도, 내가 설치한 설정도 못 씁니다.
둘은 용도가 다릅니다. 로컬 자원이 필요 없는 작업은 클라우드로 떠넘기고, 내 환경이 필요한 작업은 SSH로 붙습니다.
데스크탑 쪽 준비
| 항목 | 설정 |
|---|---|
| 원격 로그인 | 시스템 설정 - 일반 - 공유 - 원격 로그인 켜기 |
| 화면 공유 | 같은 화면에서 화면 공유 켜기 |
| 잠자기 방지 | 에너지 설정에서 디스플레이만 끄고 시스템은 깨어 있게 |
| 네트워크 깨우기 | Wake for network access 켜기 |
| 로그인 세션 | 재부팅 후 화면 공유가 되려면 로그인된 상태여야 합니다. FileVault를 쓰면 부팅 후 한 번은 직접 잠금 해제해야 합니다 |
작업 중 잠드는 게 걱정되면 tmux 세션 안에서 caffeinate -dims를 돌려두면 됩니다.
보안
- Tailscale은 외부에 포트를 열지 않습니다. 포트포워딩 대비 공격면이 훨씬 작습니다
- SSH는 키 인증만 쓰고 비밀번호 인증은 끕니다
- 화면 공유는 Tailscale 망 안에서만 접근하게 두고, 공유기에서 5900을 열지 않습니다
- Tailscale 계정에 2단계 인증을 겁니다
정리
- 목적이 "작업을 이어받는 것"이면 화면 미러링은 마지막 수단입니다
- Tailscale로 NAT를 넘고, SSH로 붙고, tmux로 작업을 살려둡니다
- 포트포워딩은 하지 마세요
- 고성능 화면 공유는 양쪽 다 Apple Silicon이어야 합니다
- 클라우드 세션은 내 기계 자원을 쓰는 게 아닙니다. 용도가 다릅니다
다음 글에서는 요즘 나온 에이전트 도구 Orca와 tmux를 비교해 보겠습니다. 비슷해 보이는데 실행 위치가 정반대라 결론이 갈립니다.