{"slug":"tailscaled-daemon","title":"tailscaled daemon","tags":["tailscale"],"agent_summary":"Last validated: Jan 5, 2026","trigger_phrases":[],"runnable":false,"markdown":"\r\n# tailscaled daemon\r\n\r\nLast validated: Jan 5, 2026\r\n\r\nThe Tailscale software that runs on your devices is split across\r\nseveral binaries and processes.\r\n\r\n## [Platform differences](https://tailscale.com/docs/reference/tailscaled\\#platform-differences)\r\n\r\nOn most platforms, the [CLI](https://tailscale.com/docs/reference/tailscale-cli) is a binary named\r\n`tailscale` (or `tailscale.exe`) and the more privileged daemon that\r\ndoes all the network handling is called `tailscaled` (or\r\n`tailscaled.exe`). Note the final `d` for \"daemon\". The majority of the\r\nCLI commands accessible by using the `tailscale` command require that the daemon\r\nbe running on the machine.\r\n\r\nThere are [three ways to run Tailscale on macOS](https://tailscale.com/docs/concepts/macos-variants).\r\nOnly the third non-GUI way contains the typical `tailscale` vs\r\n`tailscaled` split. The two GUI variants bundle all components into\r\none binary that macOS loads in different contexts: the GUI, the daemon\r\n(named either `IPNExtension` for the App Store variant or\r\n`io.tailscale.ipn.macsys.network-extension` for the zip file\r\ndownload), and the CLI (which is the same binary as the GUI, but goes\r\ninto CLI mode when run from a terminal). The daemons for the two macOS\r\nGUI variants, despite having different names, are virtually\r\nidentical. But they're not technically `tailscaled`, the subject of this topic, despite sharing the majority of the same code. Notably,\r\nany `tailscaled` behavior that involves changing flags to `tailscaled`\r\nis not always available on the macOS GUI variants.\r\n\r\n## [Where does tailscaled run?](https://tailscale.com/docs/reference/tailscaled\\#where-does-tailscaled-run)\r\n\r\nOn Linux and other Unix-like platforms, `tailscaled` typically runs as a\r\nsystemd service, or whatever your distro or OS's init system is.\r\n\r\nOn macOS, `tailscaled` (when not using a GUI build, as mentioned\r\nabove) runs as a `launchd` service.\r\n\r\nOn Windows, `tailscaled` runs as a Windows service named \"Tailscale\".\r\n\r\n## [Stopping and starting tailscaled](https://tailscale.com/docs/reference/tailscaled\\#stopping-and-starting-tailscaled)\r\n\r\nYou should not normally need to manually stop and start the\r\n`tailscaled` process. It should go into an idle state when you use the\r\nCLI command `tailscale down`. If you're debugging something or\r\nchanging flags, though, the instructions vary by platform.\r\n\r\nOn systemd, you can run `sudo systemctl $VERB tailscaled`, where the verb is one of `stop`, `start`, `restart`, or the like.\r\n\r\nOn Windows, you can run `net stop Tailscale` or `net start Tailscale`,\r\nor use the Windows Service Manager.\r\n\r\n## [Getting logs from tailscaled](https://tailscale.com/docs/reference/tailscaled\\#getting-logs-from-tailscaled)\r\n\r\nA portable way to attach to the daemon and stream its logs is to use\r\nthe CLI and run `tailscale debug daemon-logs`. That does not currently support\r\ngetting any retroactive logs, however.\r\n\r\nOn systemd, you can use `journalctl -u tailscaled --since=\"1 hour ago\"`.\r\n\r\nOn Windows, refer to `C:\\ProgramData\\Tailscale\\Logs`.\r\n\r\nOn macOS, for the GUI builds, use `Console.app` and search for\r\n`Tailscale` or `IPNExtension`.\r\n\r\n## [Flags to tailscaled](https://tailscale.com/docs/reference/tailscaled\\#flags-to-tailscaled)\r\n\r\n`tailscaled` has a number of flags (command-line arguments) that do\r\nvarious things. Some are not stable interfaces and meant primarily for\r\ndebugging. Some of the more frequently used and stable ones are:\r\n\r\n- `--tun=NAME` to specify the TUN device name, or `userspace-networking` as a magic value to not use kernel support and do everything in-process.\r\n- `--port=N` to set the UDP port to listen on for peer-to-peer traffic; 0 means to auto-select.\r\n- `--verbose=N`, where N defaults to 0. Values 1 or higher are increasingly verbose.\r\n- `--debug=localhost:8080`, to run a debug HTTP server serving paths such as `/debug/pprof`, `/debug/metrics`, `/debug/ipn`, or `/debug/magicsock`. The exact details of what's accessible over the debug server is subject to change over time.\r\n- `--no-logs-no-support` disables telemetry and opts you out of getting any support that would then require such telemetry for debugging\r\n\r\nTo control where and how state (including preferences and keys) is stored, use:\r\n\r\n- `--statedir=` for a directory on disk where to store config, keys,\r\nTaildrop files, and other state.\r\n- `--state=` to either a `/path/to/file`, `kube:<secret-name>` to use\r\nKubernetes secrets, `arn:aws:ssm:...` to store state in AWS SSM, or\r\n`mem:` to not store state and register as an ephemeral node. By default, if not\r\nprovided, the state is stored in `<statedir>/tailscaled.state`.\r\n- `--encrypt-state` to optionally encrypt the state file using the local TPM\r\ndevice on Linux.\r\n\r\nThere are also two flags to run proxies:\r\n\r\n- `--socks5-server=[host]:port`, to run a SOCK5 server, making your tailnet accessible by using SOCKS5\r\n- `--outbound-http-proxy-listen=[host]:port`, to run an HTTP proxy server, making your tailnet accessible by using HTTP.\r\n\r\nThe SOCK5 and HTTP proxy may have the same value in which case only\r\none port is opened but will automatically vary which protocol it\r\nspeaks based on what the client says first.\r\n\r\nThe following flags take an action and exit:\r\n\r\n- `--version` prints version info and exists\r\n- `--cleanup` cleans up system state from a previous run\r\n\r\n## [Setting flags](https://tailscale.com/docs/reference/tailscaled\\#setting-flags)\r\n\r\nSetting `tailscaled` flags varies by platform.\r\n\r\nOn Linux, you can modify the `FLAGS` in `/etc/default/tailscaled`,\r\nwhich the systemd unit definition will include.\r\n\r\n## [Environment variables](https://tailscale.com/docs/reference/tailscaled\\#environment-variables)\r\n\r\n### [Windows](https://tailscale.com/docs/reference/tailscaled\\#windows)\r\n\r\nYou can set some environment variables on Windows by doing the following:\r\n\r\n- Create a `tailscaled-env.txt` file in `C:\\ProgramData\\Tailscale`.\r\n- In the `tailscaled-env.txt` file you can set `PORT=N` (for example, to change the default UDP listen port).\r\n- Save the file and run `net stop Tailscale`, `net start Tailscale` to apply the changes.\r\n","html":"<h1>tailscaled daemon</h1>\n<p>Last validated: Jan 5, 2026</p>\n<p>The Tailscale software that runs on your devices is split across\r\nseveral binaries and processes.</p>\n<h2><a href=\"https://tailscale.com/docs/reference/tailscaled#platform-differences\">Platform differences</a></h2>\n<p>On most platforms, the <a href=\"https://tailscale.com/docs/reference/tailscale-cli\">CLI</a> is a binary named\r\n<code>tailscale</code> (or <code>tailscale.exe</code>) and the more privileged daemon that\r\ndoes all the network handling is called <code>tailscaled</code> (or\r\n<code>tailscaled.exe</code>). Note the final <code>d</code> for \"daemon\". The majority of the\r\nCLI commands accessible by using the <code>tailscale</code> command require that the daemon\r\nbe running on the machine.</p>\n<p>There are <a href=\"https://tailscale.com/docs/concepts/macos-variants\">three ways to run Tailscale on macOS</a>.\r\nOnly the third non-GUI way contains the typical <code>tailscale</code> vs\r\n<code>tailscaled</code> split. The two GUI variants bundle all components into\r\none binary that macOS loads in different contexts: the GUI, the daemon\r\n(named either <code>IPNExtension</code> for the App Store variant or\r\n<code>io.tailscale.ipn.macsys.network-extension</code> for the zip file\r\ndownload), and the CLI (which is the same binary as the GUI, but goes\r\ninto CLI mode when run from a terminal). The daemons for the two macOS\r\nGUI variants, despite having different names, are virtually\r\nidentical. But they're not technically <code>tailscaled</code>, the subject of this topic, despite sharing the majority of the same code. Notably,\r\nany <code>tailscaled</code> behavior that involves changing flags to <code>tailscaled</code>\r\nis not always available on the macOS GUI variants.</p>\n<h2><a href=\"https://tailscale.com/docs/reference/tailscaled#where-does-tailscaled-run\">Where does tailscaled run?</a></h2>\n<p>On Linux and other Unix-like platforms, <code>tailscaled</code> typically runs as a\r\nsystemd service, or whatever your distro or OS's init system is.</p>\n<p>On macOS, <code>tailscaled</code> (when not using a GUI build, as mentioned\r\nabove) runs as a <code>launchd</code> service.</p>\n<p>On Windows, <code>tailscaled</code> runs as a Windows service named \"Tailscale\".</p>\n<h2><a href=\"https://tailscale.com/docs/reference/tailscaled#stopping-and-starting-tailscaled\">Stopping and starting tailscaled</a></h2>\n<p>You should not normally need to manually stop and start the\r\n<code>tailscaled</code> process. It should go into an idle state when you use the\r\nCLI command <code>tailscale down</code>. If you're debugging something or\r\nchanging flags, though, the instructions vary by platform.</p>\n<p>On systemd, you can run <code>sudo systemctl $VERB tailscaled</code>, where the verb is one of <code>stop</code>, <code>start</code>, <code>restart</code>, or the like.</p>\n<p>On Windows, you can run <code>net stop Tailscale</code> or <code>net start Tailscale</code>,\r\nor use the Windows Service Manager.</p>\n<h2><a href=\"https://tailscale.com/docs/reference/tailscaled#getting-logs-from-tailscaled\">Getting logs from tailscaled</a></h2>\n<p>A portable way to attach to the daemon and stream its logs is to use\r\nthe CLI and run <code>tailscale debug daemon-logs</code>. That does not currently support\r\ngetting any retroactive logs, however.</p>\n<p>On systemd, you can use <code>journalctl -u tailscaled --since=\"1 hour ago\"</code>.</p>\n<p>On Windows, refer to <code>C:\\ProgramData\\Tailscale\\Logs</code>.</p>\n<p>On macOS, for the GUI builds, use <code>Console.app</code> and search for\r\n<code>Tailscale</code> or <code>IPNExtension</code>.</p>\n<h2><a href=\"https://tailscale.com/docs/reference/tailscaled#flags-to-tailscaled\">Flags to tailscaled</a></h2>\n<p><code>tailscaled</code> has a number of flags (command-line arguments) that do\r\nvarious things. Some are not stable interfaces and meant primarily for\r\ndebugging. Some of the more frequently used and stable ones are:</p>\n<ul>\n<li><code>--tun=NAME</code> to specify the TUN device name, or <code>userspace-networking</code> as a magic value to not use kernel support and do everything in-process.</li>\n<li><code>--port=N</code> to set the UDP port to listen on for peer-to-peer traffic; 0 means to auto-select.</li>\n<li><code>--verbose=N</code>, where N defaults to 0. Values 1 or higher are increasingly verbose.</li>\n<li><code>--debug=localhost:8080</code>, to run a debug HTTP server serving paths such as <code>/debug/pprof</code>, <code>/debug/metrics</code>, <code>/debug/ipn</code>, or <code>/debug/magicsock</code>. The exact details of what's accessible over the debug server is subject to change over time.</li>\n<li><code>--no-logs-no-support</code> disables telemetry and opts you out of getting any support that would then require such telemetry for debugging</li>\n</ul>\n<p>To control where and how state (including preferences and keys) is stored, use:</p>\n<ul>\n<li><code>--statedir=</code> for a directory on disk where to store config, keys,\r\nTaildrop files, and other state.</li>\n<li><code>--state=</code> to either a <code>/path/to/file</code>, <code>kube:&#x3C;secret-name></code> to use\r\nKubernetes secrets, <code>arn:aws:ssm:...</code> to store state in AWS SSM, or\r\n<code>mem:</code> to not store state and register as an ephemeral node. By default, if not\r\nprovided, the state is stored in <code>&#x3C;statedir>/tailscaled.state</code>.</li>\n<li><code>--encrypt-state</code> to optionally encrypt the state file using the local TPM\r\ndevice on Linux.</li>\n</ul>\n<p>There are also two flags to run proxies:</p>\n<ul>\n<li><code>--socks5-server=[host]:port</code>, to run a SOCK5 server, making your tailnet accessible by using SOCKS5</li>\n<li><code>--outbound-http-proxy-listen=[host]:port</code>, to run an HTTP proxy server, making your tailnet accessible by using HTTP.</li>\n</ul>\n<p>The SOCK5 and HTTP proxy may have the same value in which case only\r\none port is opened but will automatically vary which protocol it\r\nspeaks based on what the client says first.</p>\n<p>The following flags take an action and exit:</p>\n<ul>\n<li><code>--version</code> prints version info and exists</li>\n<li><code>--cleanup</code> cleans up system state from a previous run</li>\n</ul>\n<h2><a href=\"https://tailscale.com/docs/reference/tailscaled#setting-flags\">Setting flags</a></h2>\n<p>Setting <code>tailscaled</code> flags varies by platform.</p>\n<p>On Linux, you can modify the <code>FLAGS</code> in <code>/etc/default/tailscaled</code>,\r\nwhich the systemd unit definition will include.</p>\n<h2><a href=\"https://tailscale.com/docs/reference/tailscaled#environment-variables\">Environment variables</a></h2>\n<h3><a href=\"https://tailscale.com/docs/reference/tailscaled#windows\">Windows</a></h3>\n<p>You can set some environment variables on Windows by doing the following:</p>\n<ul>\n<li>Create a <code>tailscaled-env.txt</code> file in <code>C:\\ProgramData\\Tailscale</code>.</li>\n<li>In the <code>tailscaled-env.txt</code> file you can set <code>PORT=N</code> (for example, to change the default UDP listen port).</li>\n<li>Save the file and run <code>net stop Tailscale</code>, <code>net start Tailscale</code> to apply the changes.</li>\n</ul>\n"}