2026/03/15

[Korean] Mikrotik router의 내부 container 또는 하단 서브라우터에 tailscale 운용방법


최초작성: 2026/3/15

1. 서론

 Mikrotik 라우터를 15년 정도 사용해오면서 다수의 거점에 설치한 Mikrotik router를 site-to-site VPN연결을 L2TP-ipsec으로 운영해왔습니다만, 최근 android가 l2tp 지원을 없애버리는 바람에  Wireguard로 바꿨습니다. 

 Wireguard는 최근 엔트리 모델을 제외한 거의 모든 CPU가 쓸 수 있는 ipsec 하드웨어 암호화 가속의 지원을 받을 수 없는 대신 최신암호화 알고리즘을 사용하며 일반적으로 유명한 OS들이 지원하기 때문에 최신기기를 쓴다면 바꾸는 것이 좋습니다. 가볍고 정말 빠릅니다.

 그렇다고 Wireguard가 마냥 좋기만 한 건 아니고 L2TP에서 바꾸면서 불편했던 점 한가지는, OSI계층이 L2(MAC)이 아닌 L3(IP)방식이기 때문에 L2 네트워크 검색를 쓰는 소프트웨어에서 검색이 안됩니다. 그걸 감안하면 하드웨어가속이 없는데도 고속이며 간편하게 쓸 수 있는 장점이 있습니다.

 하지만 이것도 site-to-site를 연결하는 거점수가 적다면 편한데(이건 L2TP도 마찬가지입니다), 관리하는 거점수가 점점 많아지다보니 mesh VPN을 일일이 연결하기에는 많이 힘들고, 스크립트를 써서 하기에도 관리를 하자니 마땅한 대시보드가 없었습니다. 정말 이런 관리 대시보드 만드시는 분들 존경합니다.  그래서 찾다찾다 Wireguard기반의 mesh vpn을 자동생성하고, 관리 페이지에서 소프트웨어적으로 일원화된 패킷 제어 정책이 가능한 tailscale을 도입하고 싶었습니다. 

 Tailscale의 각 거점간 제어는 Tailscale 또는 Headscale 관리 페이지에서 하지만, 서로간의 실제 트래픽은 센터를 거치지 않고 P2P로 전송됩니다. 2026년 3월 현재 tailscale서비스는 3명의 user 및 100대 device까지 연결할 수 있어 개인 및 중소규모 용도로는 충분합니다. 그 이상의 경우는 오픈소스판 headscale 컨트롤러를 직접 설치해서 운영하거나 유료 플랜을 고려해 봐야 합니다.

 사실 Mikrotik에는 Tailscale대신 RouterOS 7부터 ARM32/ARM64/x86-64 CPU기종부터 Zerotier를 네이티브앱으로 지원하기 시작했습니다. Zerotier는 유저(클라이언트)측면에서 매우 설정이 간편하여 그냥 쓴다는 식의 개념이며, OSI L2로 인식하기 때문에(공식문서를 보면 엄밀히는 L1~L3를 애매하게 걸쳐있는 듯 합니다) MAC 기반의 검색이 가능해집니다. 가입해서 맛만 본 결과, 관리자측면으로는 상당히 복잡해서 쓰기 힘들었고, 결정적인 건 zerotier가 무료플랜이 빈약해서 Tailscale로 네트워크를 새로 구축했습니다. 아직 Mikrotik에는 네이티브 앱이 없어서 container를 직접 생성해서 돌리거나, Mikrotik 밑에 openwrt 등 서브라우터를 달아 Tailscale 커널모드로 돌릴 필요가 있습니다.

 그럼 지금부터 Tailscale의 서브라우터와 container설치 방법을 각각 알아보겠습니다. Mikrotik에서 돌아가는 tailscale은 kernel 모드 wireguard가 아닌 user space모드로 돌아가기 때문에 subnet router 기능 등이 정상적으로 동작하지 않을 수 있습니다. 확실한 동작을 위해서는 서브라우터에 openwrt나 리눅스등에 설치해서 사용하는 게 좋습니다.

2. Mikrotik 하단에 물리는 서브라우터에 Tailscale을 설치
3. Mikrotik 내부 container에 Tailscale을 설치


2. Mikrotik 하단에 물리는 서브라우터에 Tailscale을 설치(타사 공유기도 가능)

 되도록이면 3의 내부에 container로 돌려보고 싶은데 정 안되면 이 방법을 사용하시면 됩니다. 가상적으로 안되면 물리적으로 해결해버리는 게 가장 확실한 방법입니다. 저같은 경우에는 container와 L3 switch에 openwrt를 설치하고 tailscale을 올려서 여러개의 tailnet을 사용하고 있습니다. 

 사실 이 방법 자체는 메인 라우터가 꼭 mikrotik이 아니라 어떤 공유기라도 사용할 수 있으며 정적 라우팅에 한줄 추가해주는 것 만으로 똑같이 쓸 수 있습니다.

 개인적으로는 서브라우터에 openwrt luci 웹관리페이지를 올리고 소프트웨어 메뉴에서 업데이트 후 luci-app-tailscale-community 설치 및 재부팅해서 쓰는게 제일 간편하고 직관성있게 관리할 수 있어서 추천합니다.

 대부분 mikrotik이 내부에서 접근가능한 proxmox 등에 가상머신을 생성하여 tailscale을 설치하는 편이 간편하지만, 저전력으로 해결하고 싶다면 라즈베리파이 또는 안쓰는 오래된 라우터에 openwrt 등을 설치하고 tailscale을 설치하여 사용하는 방법이 주류입니다. 기본적으로 tailscale까지 설치하였다고 가정하고 라우터측 설정만 알아봅니다.

tailscale이 설치된 서브라우터의 ip 172.24.0.2

mikrotik 라우터의 ip 172.24.0.1


  -tailnet에 트래픽이 나갈 수 있도록 정적 라우팅(static routing)지정
   /ip/route add dst-address=100.64.0.0/10 gateway=172.24.0.2
   tailscale의 개인네트워크 주소대역 100.64.0.0/10으로 나가는 게이트웨이를 container를 통해서 나가게끔 지정하는 설정입니다. 이 설정이 없으면 라우터 밑에 물린 단말들이 tailnet 바깥으로 통신할 수 없습니다.

 Mikrotik 측에서는 설정이 이게 끝입니다. tailnet으로 향하는 트래픽만 전담으로 처리하는 서버를 지정하는 것만으로 tailnet과 통신할 수 있게됩니다. 만약 디폴트 게이트웨이를 tailnet으로 지정하고 exit node를 별도 지정할 경우 모든 트래픽이 VPN처럼 지나가게 됩니다. 이러한 예제가 apple tv나 아마존 fire tv스틱에 tailscale을 설치하고 VPN용도로 미국 또는 한국 전용 컨텐츠 시청을 위해 활용되고 있는 듯 보입니다.

3. Mikrotik 내부 container에 Tailscale을 설치

 3.1 Container-Tailscale 설치가 가능한 모델

 CPU 아키텍쳐: ARM64, X86, ARM32(초심자 비권장)
 ※초심자는 ARM32v5모델을 안쓰는 게 좋습니다. 
    hEX S(2025)를 포함해 공식홈페이지에 "ARM64"가 아닌 "ARM"으로 표시된 것을 말합니다.
    CPU자체가 ARM64지원해도 펌웨어가 32bit인 경우도 마찬가지로 컨테이너를 다루기 어렵습니다.

 CPU아키텍쳐는 Mikrotik 홈페이지의 하드웨어 스펙을 자세히 확인하시길 바랍니다.

 위의 3개 아키텍쳐 중 ARM32 CPU를 사용하는 router 모델은 arm32v5 아키텍쳐용 패키지 이미지를 다운로드 받아서 써야하는데, 대부분의 docker/github에서는 ARM32용을 arm32v7 이미지만 기본제공을 하고 Mikrotik  arm32 CPU용 arm32v5 패키지는 대부분 없어서 직접 이미지를 빌드해야합니다. arm32v5는 매우 오래된 아키텍쳐이며, 이 과정을 아무리 요즘 AI가 방법을 다 가르쳐준다 한들 임베디드 환경용 이미지를 직접 빌드하는 작업은 매우 진입장벽이 높아서 정말 고생할 겁니다. 작업중간에 트러블이 생겨도 이게 무슨 문제인지 이해를 못해서 진행이 안될 것이 뻔하기 때문입니다.

 저도 hEX S (2025)모델이 ARM CPU모델 중 가장 저렴하여 이 모델을 구입해서 설치하려 했지만, 구입하고 나서 OS가 arm32v7 미지원(CPU하드웨어적으로는 v5/v7 양쪽 다 지원)이라서 직접 빌드해서 써야하는 상황이라는 것을 알았을 때는 이미 늦었고, 한번만 만들고 계속 쓸 수 있다면 하겠지만 container의 특징상 이걸 펌웨어 업데이트할 때마다 새로 빌드할 필요가 있었습니다. 어찌저찌 한번 빌드환경을 만들면 좋겠지만 대다수의 사람들이 그렇게까지는 못하기 때문에 고역일겁니다.

 라우터 장비에서 돌아가는 컨테이너 특성상 보안이 중요하기 때문에 공식 패키지만 사용하는 게 좋지만 arm32v5용 이미지를 누군가 따로 만들어 공개중인 비공식판을 쓰겠다면 아래 링크를 쓰면됩니다.
저같은 경우에는 ARM64 Mikrotik장비에 container, 그리고 안쓰는 구형 mips계열 실기라우터에 openwrt를 올린 후 각각 독립적인 tailnet을 구성해서 쓰고 있습니다.

seanmamasde/tailscale-mikrotik:latest-armv5

Package tailscale-mikrotik · GitHub



 3.2 사전준비 설정
 간혹 위치가 약간 틀린 경우도 있긴 하지만 기본적으로 Mikrotik의 winbox는 커맨드라인을 거의 그대로 바라보는 형식이기 때문에 "커맨드=winbox의 메뉴위치"라서 익숙해지면 직관적입니다.
  -USB메모리(SSD) 준비 : mikrotik에 USB를 꽂고 winbox에서 ext4로 포멧하는 게 가장 쉽습니다.
    /system/disks에 있습니다.

  -container용 전용 브릿지 생성 및 IP부여
    /interface/bridge add name=bridge_container
    /ip/address add address=172.24.0.1/24 interface=bridge_container
    ※Container이미지용 IP가 아닌 같은 subnet대역의 라우터측 IP 지정입니다.

  -tailscale container용 가상이더넷장치 생성 
    /interface/veth add name=veth_tailscale address=172.24.0.2/24 gateway=172.24.0.1
    /interface/bridge/port add interface=veth_tailscale bridge=bridge_container
    ※Container이미지용 IP지정입니다. /ip/address에서 지정이 아닌 가상interface생성시에 지정됩니다. /ip/address에서 직접 지정해도 되긴 합니다만 별 의미가 없고 관리가 난잡해지니 veth에서 지정해주는 것이 좋습니다. 복수IP도 지정 가능합니다.

  -tailnet에 트래픽이 나갈 수 있도록 정적 라우팅(static routing)지정
   /ip/route add dst-address=100.64.0.0/10 gateway=172.24.0.2
   tailscale의 개인네트워크 주소대역 100.64.0.0/10으로 나가는 게이트웨이를 container를 통해서 나가게끔 지정하는 설정입니다. 이 설정이 없으면 라우터 밑에 물린 단말들이 tailnet 바깥으로 통신할 수 없습니다.

  -container 앱의 기본설정
   /container/config set registry-url=https://ghcr.io tmpdir=/usb1/container/pull
  ※반드시 라우터 내부 NAND 플래시가 아닌 USB또는 외장ssd로 지정바랍니다.
  ※github가 아닌 docker로 지정하면 계정/패스워드도 필요합니다.


  -tailscale container 이미지 작성 전 상세설정1 (tailscale관리페이지 설정)
   Setting ->Keys->Generate auth key->
   description을 적당히 지정, "Pre approved"을 ON한 후 키생성을 하면 단 한번만 보여주는 키를 생성합니다. 관리자라도 정말로 한번만 보여주니까 반드시 복사해두십시요. 잃어버리면 revoke해서 비활성화 하고 다시 키생성하면 되긴 합니다. 이 키는 로그인ID와 패스워드와 같은 것이라 누구에게도 알려져서는 안됩니다.







  -tailscale container 이미지 작성 전 상세설정2 (mikrotik 라우터 설정)
   /container/mounts add list=tailscale_mount src=/usb1/container/tailscale dst=/var/lib/tailscale
   source는 이미지가 위치할 장소지정을 의미합니다. 내장 NAND는 절대 지정하지 말기 바랍니다.
   destination는 이미지 내부의 tailscale의 위치를 지정하는데, 밑의 envs(environment)옵션지정과 반드시 일치해야 합니다. TS_AUTH_KEY에 위에서 생성한 auth key값을 "tskey-auth-"를 포함해 그대로 복사합니다. 이 키가 윈도우가 아닌 장비들이 tailnet에 로그인할 때 쓰입니다.

   /container/envs add list=tailscale_envs key=TS_EXTRA_ARGS value=--accept-routes
   /container/envs add list=tailscale_envs key=TS_ROUTES value=172.24.0.0/24
   /container/envs add list=tailscale_envs key=UPDATE_TAILSCALE value=-y
   /container/envs add list=tailscale_envs key=TS_STATE_DIR value=/var/lib/tailscale
   /container/envs add list=tailscale_envs key=CONTAINER_GATEWAY value=172.24.0.1
   /container/envs add list=tailscale_envs key=TS_AUTH_KEY value=tskey-auth-(키코드)
 라우터 내부의 서브넷 접근을 혀용하기 위해 accept routes를 허용했고, VPN용도로 쓰고싶은 분들은 TS_EXTRA_ARGS에 --advertise-exit-node를 스페이스 하나 추가로 옵션지정해주면 됩니다. 
 172.24.0.0/24은 라우터의 내부 서브넷입니다. 예제로는 위의 container 브릿지용 대역만 넣었지만 이걸 넣지않고 라우터 별도 내부대역을 지정하면 그 대역 단말들을 tailnet에 접속한 모든 단말들끼리 외부에서 직접 접근이 가능해집니다. 예를들면 mikrotik의 기본대역 192.168.88.0/24을 추가해주면 라우터의 winbox를 포함한 기본설정된 내부대역을 접근할 수 있습니다. 만약 대역을 192.168.88.0으로 하겠다면 /ip/route의 정적라우팅도 잊지말고 바꿔야 합니다.

  드디어 준비가 끝났습니다. 이제 이미지 생성입니다.

  -tailscale이 설치된 container작성
  /container add name=tailscale1 remote-image=tailscale/tailscale/latest root-dir=/usb1/container/tailscale interface=veth_tailscale dns=8.8.8.8 mountlists=tailscale shm-size=64MB tmpfs=/tmp:64:01 envlists=tailscale start-on-boot=yes logging=yes 
  ※fluent-network가 제작한 이미지도 사용가능하지만 공식 tailscale과 envs옵션지정이 같은 기능이라도 약간 틀려서 혼동할 수 있으니 주의바랍니다.

 여기까지 하면 github의 tailscale공식페이지에서 각 장비에 맞는 CPU아키텍쳐의 이미지를 자동으로 다운로드 해서 생성합니다. 문제가 없다면 생성되었을 것이고 수동으로 start 해줍니다.
   /container start tailscale1  (위에서 생성한 name명을 입력)

github서버 이상 또는 라우터 펌웨어 버그나 자동 생성 이미지가 라우터와 다른 CPU아키텍쳐로 생성된 게 아니라면 정상 시작할 겁니다. 위에서 자동 approve를 했기 때문에 tailnet에 연결되었습니다.

하지만 아직 subnet 연결이 허용안되어 있으니 연결된 머신을 클릭하여 awaiting approval을 edit에서 대역을 체크해주면 이제 같은 tailnet에 접속한 모든 PC/휴대폰/서버 등에서 라우터 내부와 통신이 가능해집니다. 또한 잊지말고 각 머신의 오른쪽 "..."을 클릭해서 키가 만료되지 않도록 "Disable key expire"를 클릭해주면 키 재성성을 할 필요없이 영원히 계속 사용할 수 있습니다.






여기까지가  mikrotik에서 tailscale container를 생성하여 접속하는 방법을 설명하였습니다. 저는 현재 subnet route가 정상작동하고 있지만 처음 생성했을 당시에는 통신이 불가능했었습니다. 왜 갑자기 가능한지는 지금도 모르겠지만 잘 안된다면 스트레스 받지말고 물리적인 서브라우터를 밑에 물려서 tailscale을 별도 설치하는 게 확실한 방법입니다.

4. 결론
 물리적인 방법과 container로 mikrotik에서 tailscale을 운용하는 방법을 다뤄봤습니다. ARM32를 처음 도입했을 때 공식이미지가 존재하지 않는다는 걸 깨닫고 값싼 중고 라우터를 구해 물리 tailscale 게이트웨이를 제작해서 쓰다가 컨테이너도 도전해서 잘 돌아가서 운용중에 있습니다. wireguard보다 훨씬 운용이 편해져서 아주 만족하고 있습니다.

 굉장히 긴 글 읽느라 수고하셨습니다.