summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIrbe Krumina <irbe@tailscale.com>2024-12-04 15:18:21 +0000
committerIrbe Krumina <irbe@tailscale.com>2024-12-04 15:18:24 +0000
commiteb0496441f1636c216ff77cf3418fd365e6bae31 (patch)
treeeb986ee142d8e1f1f7a9d3628d38a1a0eefc1af6
parent2aac91688883090d892f01a2953cc0318aee9c90 (diff)
downloadtailscale-irbekrm/tunmssg.tar.xz
tailscale-irbekrm/tunmssg.zip
net/tstun: make tun creation error diagnostic more container friendlyirbekrm/tunmssg
Check for read/write permissions on /dev/net/tun before running the modprobe check that almost always fail in containers. Updates tailscale/tailscale#14277 Signed-off-by: Irbe Krumina <irbe@tailscale.com>
-rw-r--r--net/tstun/tun_linux.go10
1 files changed, 9 insertions, 1 deletions
diff --git a/net/tstun/tun_linux.go b/net/tstun/tun_linux.go
index 9600ceb77..59f02dc22 100644
--- a/net/tstun/tun_linux.go
+++ b/net/tstun/tun_linux.go
@@ -11,6 +11,7 @@ import (
"strings"
"syscall"
+ "golang.org/x/sys/unix"
"tailscale.com/types/logger"
"tailscale.com/version/distro"
)
@@ -36,6 +37,14 @@ func diagnoseLinuxTUNFailure(tunName string, logf logger.Logf, createErr error)
kernel := utsReleaseField(&un)
logf("Linux kernel version: %s", kernel)
+ const dev = "/dev/net/tun"
+ // Check for read/write access to /dev/net/tun before the modprobe check because modprobe would almost always
+ // fail in containerized environments, see https://github.com/tailscale/tailscale/issues/14277
+ if err := unix.Access(dev, unix.O_RDWR); err != nil {
+ logf("tailscaled likely does not have read or write access to %q, access check failed with: %v", dev, err)
+ return
+ }
+
modprobeOut, err := exec.Command("/sbin/modprobe", "tun").CombinedOutput()
if err == nil {
logf("'modprobe tun' successful")
@@ -45,7 +54,6 @@ func diagnoseLinuxTUNFailure(tunName string, logf logger.Logf, createErr error)
//
// So if there's a problem at this point, it's
// probably because /dev/net/tun doesn't exist.
- const dev = "/dev/net/tun"
if fi, err := os.Stat(dev); err != nil {
logf("tun module loaded in kernel, but %s does not exist", dev)
} else {