Tailscale을 설치하지 않고 포터블처럼 사용하기

  1. Tailscale를 설치하지 않고 포터블 형식(?)으로 사용할 수 있도록 작업 폴더들를 먼저 생성합니다.
    D:\tsPortable
    D:\tsPortable\logs
    D:\tsExtract
    
  2. TailScale 사이트에 접속(https://pkgs.tailscale.com/stable/)해서 최신 윈도우즈 설치파일(*.msi)의 다운로드 링크 주소를 복사합니다.(2026-9-3일 기준 tailscale-setup-1.102.3-amd64.msi)
  3. 관리자 권한으로 명령 프롬프트(cmd)를 실행한 후 작업 폴더(D:\tsPortable)로 이동합니다.
  4. curl 명령어를 사용해서 복사한 최신 윈도우즈 설치파일(*.msi)을 다운로드합니다.
    curl.exe -L -o tailscale.msi https://pkgs.tailscale.com/stable/tailscale-setup-1.102.3-amd64.msi
    
  5. “관리 설치(administrative install)” 라고 부르는데(/a 옵션), MSI를 실제로 설치하지 않고 내부 파일만 지정 디렉터리로 압축해제합니다.
    msiexec /a "D:\tsPortable\tailscale.msi" TARGETDIR=D:\tsExtract /l*v D:\tsExtract\ts-extract-log.txt
    
    TailScale administrative install
    
  6. D:\tsExtract\PFiles64\Tailscale 디렉토리에 압축 해제된 아래 3개 파일을 D:\tsPortable 폴더로 복사 또는 이동시킵니다.
    tailscale.exe
    tailscaled.exe
    wintun.dll (현재 userspace 모드에서는 불필요합니다. 나중에 wintun 모드로 전환 시 필요합니다)
    
  7. https://nssm.cc/release/nssm-2.24.zip를 다운로드하고, 압축 해제 후 win64/nssm.exe 파일을 D:\tsPortable 폴더에 저장합니다. NSSM(Non-Sucking Service Manager)은 자기 자신이 서비스로 등록되고, 그 안에서 대상 프로그램을 자식 프로세스로 실행하는 래퍼입니다.
  8. 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
    
  9. 아래 명령을 실행하면 인증 페이지 주소가 출력됩니다. 해당 주소로 접속하여 로그인에 성공하면 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.
    
  10. Tailscale이 새 버전을 감지하면 자동으로 업데이트하는 것을 방지합니다.(예방 차원)
    D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled set --auto-update=false
    
  11. 현재 디바이스에 할당된 IP주소를 확인합니다.
    D:\tsPortable\tailscale.exe --socket=\\.\pipe\my-tailscaled ip -4
    100.9x.2xx.1xx
    
  12. 인증이 성공하여 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
            },
    
  13. 실제 데이터 트래픽이 흐르는지는 검증합니다.
    :: 네트워크 진단 (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
    

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다