- Tailscale를 설치하지 않고 포터블 형식(?)으로 사용할 수 있도록 작업 폴더들를 먼저 생성합니다.
D:\tsPortable
D:\tsPortable\logs
D:\tsExtract
- TailScale 사이트에 접속(https://pkgs.tailscale.com/stable/)해서 최신 윈도우즈 설치파일(*.msi)의 다운로드 링크 주소를 복사합니다.(2026-9-3일 기준 tailscale-setup-1.102.3-amd64.msi)
- 관리자 권한으로 명령 프롬프트(
cmd)를 실행한 후 작업 폴더(D:\tsPortable)로 이동합니다.
- curl 명령어를 사용해서 복사한 최신 윈도우즈 설치파일(*.msi)을 다운로드합니다.
curl.exe -L -o tailscale.msi https://pkgs.tailscale.com/stable/tailscale-setup-1.102.3-amd64.msi
- “관리 설치(administrative install)” 라고 부르는데(/a 옵션), MSI를 실제로 설치하지 않고 내부 파일만 지정 디렉터리로 압축해제합니다.
msiexec /a "D:\tsPortable\tailscale.msi" TARGETDIR=D:\tsExtract /l*v D:\tsExtract\ts-extract-log.txt
- D:\tsExtract\PFiles64\Tailscale 디렉토리에 압축 해제된 아래 3개 파일을 D:\tsPortable 폴더로 복사 또는 이동시킵니다.
tailscale.exe
tailscaled.exe
wintun.dll (현재 userspace 모드에서는 불필요합니다. 나중에 wintun 모드로 전환 시 필요합니다)
- https://nssm.cc/release/nssm-2.24.zip를 다운로드하고, 압축 해제 후 win64/nssm.exe 파일을 D:\tsPortable 폴더에 저장합니다. NSSM(Non-Sucking Service Manager)은 자기 자신이 서비스로 등록되고, 그 안에서 대상 프로그램을 자식 프로세스로 실행하는 래퍼입니다.
- nssm 명령어를 사용해서 Tailscale 서비스를 등록합니다.
nssm install tsPortable "D:\tsPortable\tailscaled.exe"
nssm set tsPortable AppDirectory D:\tsPortable
:: --tun=userspace-networking 옵션을 사용하면 가상 NIC(wintun)을 만들지 않으므로,
:: OS 라우팅 테이블에 Tailscale IP 대역(100.x.x.x)이 등록되지 않습니다.
:: 따라서 일반 프로그램은 100.x 주소로 직접 통신할 수 없고, 반드시 SOCKS5/HTTP 프록시(localhost:1080)를 경유해야 합니다.
nssm set tsPortable AppParameters "--statedir=D:\tsPortable --socket=\\.\pipe\my-tailscaled --tun=userspace-networking --socks5-server=localhost:1080 --outbound-http-proxy-listen=localhost:1080"
:: 로그 (없으면 서비스 모드에서 원인 추적 불가)
:: C:\ProgramData\Tailscale\Logs 폴더에도 Tailscale 자체 로깅 시스템(logpolicy)의 로그가 기록됩니다
nssm set tsPortable AppStdout D:\tsPortable\logs\tailscaled.out.log
nssm set tsPortable AppStderr D:\tsPortable\logs\tailscaled.err.log
nssm set tsPortable AppRotateFiles 1
nssm set tsPortable AppRotateBytes 10485760
:: 크래시 루프 시 재시작 간격을 늘려 로그가 폭주하지 않게 함
nssm set tsPortable AppThrottle 60000
:: 포터블 Tailscale 시작 (부팅 자동 시작은 SERVICE_AUTO_START, 수동 시작은 SERVICE_DEMAND_START)
nssm set tsPortable Start SERVICE_AUTO_START
:: 서비스 기동
nssm start tsPortable
timeout /t 5 /nobreak >nul
:: SERVICE_RUNNING 이어야 합니다.
nssm status tsPortable
:: 상태가 RUNNING 이어야 합니다.
sc query tsPortable | findstr /i "RUNNING STOPPED PENDING"
:: tailscaled.exe 프로세스의 PID를 확인합니다.
tasklist | findstr tailscaled
:: 오류가 발생하면 아래 로그 파일에서 확인합니다.
type D:\tsPortable\logs\tailscaled.err.log
:: 서비스 제거
nssm stop tsPortable
nssm remove tsPortable confirm
- 아래 명령을 실행하면 인증 페이지 주소가 출력됩니다. 해당 주소로 접속하여 로그인에 성공하면 Success 메시지가 출력됩니다.
:: Windows에서 tailscaled는 기본적으로 서버 모드가 아니라 클라이언트 연결에 종속됩니다.
:: 정식 설치본은 GUI(tailscale-ipn.exe)가 상시 연결을 붙들고 있어 문제가 없지만,
:: CLI만 쓰는 이 구성에서는 up 명령이 끝나는 순간 연결이 0이 되어 백엔드가 내려갑니다.
:: --unattended 옵션은 ForceDaemon: true를 state 파일에 기록해 이 종속을 해제합니다.
:: --unattended는 Windows 전용 옵션으로 다른 OS에 적용하시면 안됩니다.
D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled up --unattended
To authenticate, visit:
https://login.tailscale.com/a/___________
Success.
- Tailscale이 새 버전을 감지하면 자동으로 업데이트하는 것을 방지합니다.(예방 차원)
D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled set --auto-update=false
- 현재 디바이스에 할당된 IP주소를 확인합니다.
D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled ip -4
100.9x.2xx.1xx
- 인증이 성공하여 tailscaled.state파일이 생성되면, 아래 명령으로 Tailscale 네트워크에 접속된 디바이스 리스트를 확인합니다.
:: --json 옵션을 추가하면 연결 경로 상세 정보를 확인할 수 있습니다.
D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled status
100.9x.2xx.1xx desktop-mini tailscale계정@ windows -
100.1xx.1xx.3x api tailscale계정@ linux idle; offers exit node
--more--
:: 데몬이 state 파일에 저장한 현재 설정 전체를 출력합니다.
D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled debug prefs
"ForceDaemon": true,
"AutoUpdate": {
"Check": true,
"Apply": false
},
- 실제 데이터 트래픽이 흐르는지는 검증합니다.
:: 네트워크 진단 (NAT 유형, DERP 지연 등)
D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled netcheck
Report:
* Time: 2026-09-03 13:25:36.1306016+09:00
* UDP: false
* IPv4: (no addr found)
* IPv6: no, but OS has support
* MappingVariesByDestIP:
* PortMapping:
* CaptivePortal: false
* Nearest DERP: Tokyo
* DERP latency:
- tok: 31.2ms (Tokyo)
-- more --
:: Tailscale 자체 ping (userspace 모드에서는 OS ping이 아니라 이걸 써야 함)
:: DERP(Designated Encrypted Relay for Packets)은 Tailscale이 직접 연결(P2P)에 실패했을 때 쓰는 중계 서버입니다.
D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled ping 100.1xx.1xx.3x
pong from api (100.1xx.1xx.3x) via DERP(tok) in 69ms
pong from api (100.1xx.1xx.3x) via DERP(tok) in 67ms
pong from api (100.1xx.1xx.3x) via DERP(tok) in 67ms
--more--
:: 22번 포트(ssh) 통신이 가능한지 확인합니다.
curl -v --socks5-hostname localhost:1080 telnet://100.1xx.1xx.3x:22
* Trying 127.0.0.1:1080...
* Connected to localhost (127.0.0.1) port 1080 (#0)
* SOCKS5 connect to 100.1xx.1xx.3x:22 (remotely resolved)
* SOCKS5 request granted.
* Connected to localhost (127.0.0.1) port 1080 (#0)
SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.18