tailscale/tailscale · error
only implemented on Synology
Error message
only implemented on Synology
What it means
runConfigureSynology requires runtime.GOOS == linux AND distro.Get() == distro.Synology before it will create /dev/net/tun and adjust outbound settings. The command manipulates DSM-specific system state, so on ordinary Linux or non-Linux hosts it refuses immediately with this error.
Source
Thrown at cmd/tailscale/cli/configure-synology.go:74
This command is intended to run at boot as root on a Synology device to
create the /dev/net/tun device and give the tailscaled binary permission
to use it.
See: https://tailscale.com/s/synology-outbound
`),
FlagSet: (func() *flag.FlagSet {
fs := newFlagSet("synology")
return fs
})(),
}
}
func runConfigureSynology(ctx context.Context, args []string) error {
if len(args) > 0 {
return errors.New("unknown arguments")
}
if runtime.GOOS != "linux" || distro.Get() != distro.Synology {
return errors.New("only implemented on Synology")
}
if uid := os.Getuid(); uid != 0 {
return fmt.Errorf("must be run as root, not %q (%v)", os.Getenv("USER"), uid)
}
hi := hostinfo.New()
isDSM6 := strings.HasPrefix(hi.DistroVersion, "6.")
isDSM7 := strings.HasPrefix(hi.DistroVersion, "7.")
if !isDSM6 && !isDSM7 {
return fmt.Errorf("unsupported DSM version %q", hi.DistroVersion)
}
if _, err := os.Stat("/dev/net/tun"); os.IsNotExist(err) {
if err := os.MkdirAll("/dev/net", 0755); err != nil {
return fmt.Errorf("creating /dev/net: %v", err)
}
if out, err := exec.Command("/bin/mknod", "/dev/net/tun", "c", "10", "200").CombinedOutput(); err != nil {
return fmt.Errorf("creating /dev/net/tun: %v, %s", err, out)
}
}View on GitHub (pinned to cfe32b8be6)
Solutions
- SSH into the Synology NAS and run `sudo tailscale configure synology` there
- Verify DSM detection: `cat /etc/VERSION` should show a DSM build
- If the CLI is containerized on the NAS, run it from the host shell instead
Example fix
# before $ tailscale configure synology error: only implemented on Synology # after nas$ sudo tailscale configure synology
Defensive patterns
Strategy: validation
Validate before calling
[ "$(uname -s)" = "Linux" ] || { echo 'needs Linux'; exit 1; }
grep -q synology /etc/VERSION 2>/dev/null || { echo 'only on Synology DSM hosts'; exit 1; }
sudo tailscale configure synology Prevention
- Reserve the synology subcommand for the NAS host shell
- Verify DSM markers (/etc/VERSION) when distro detection is in doubt
- Keep host-specific configuration out of generic provisioning scripts
When it happens
Trigger: Executing `tailscale configure synology` anywhere other than a Synology DSM host — a desktop, a Debian server, or an environment where distro.Get() fails to identify DSM.
Common situations: Running the setup from a workstation by mistake; a containerized tailscale CLI on the NAS that cannot see DSM markers; testing in a VM that mimics but is not DSM.
Related errors
- only implemented on Synology
- only implemented on JetKVM
- flash-appliance is only supported on linux and darwin (got %
- the pve-appliance subcommand is only available on Linux; for
- unknown arguments
AI-assisted analysis of tailscale/tailscale@cfe32b8be6 (2026-08-15).
Data as JSON: /api/errors/01ee08ed586ee8f5.
Report an issue: GitHub.