Skip to content

Commit

Permalink
Merge pull request #1287 from apernet/fix-tun-ipv6-disable
Browse files Browse the repository at this point in the history
fix: tun failed on linux when ipv6.disable=1
  • Loading branch information
tobyxdd authored Jan 4, 2025
2 parents 9e90d7d + 53a4ce2 commit 5520bcc
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 0 deletions.
14 changes: 14 additions & 0 deletions app/internal/tun/check_ipv6_others.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//go:build !unix && !windows

package tun

import "net"

func isIPv6Supported() bool {
lis, err := net.ListenPacket("udp6", "[::1]:0")
if err != nil {
return false
}
_ = lis.Close()
return true
}
16 changes: 16 additions & 0 deletions app/internal/tun/check_ipv6_unix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//go:build unix

package tun

import (
"golang.org/x/sys/unix"
)

func isIPv6Supported() bool {
sock, err := unix.Socket(unix.AF_INET6, unix.SOCK_DGRAM, unix.IPPROTO_UDP)
if err != nil {
return false
}
_ = unix.Close(sock)
return true
}
24 changes: 24 additions & 0 deletions app/internal/tun/check_ipv6_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//go:build windows

package tun

import (
"golang.org/x/sys/windows"
)

func isIPv6Supported() bool {
var wsaData windows.WSAData
err := windows.WSAStartup(uint32(0x202), &wsaData)
if err != nil {
// Failing silently: it is not our duty to report such errors
return true
}
defer windows.WSACleanup()

sock, err := windows.Socket(windows.AF_INET6, windows.SOCK_DGRAM, windows.IPPROTO_UDP)
if err != nil {
return false
}
_ = windows.Closesocket(sock)
return true
}
4 changes: 4 additions & 0 deletions app/internal/tun/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ type EventLogger interface {
}

func (s *Server) Serve() error {
if !isIPv6Supported() {
s.Logger.Warn("tun-pre-check", zap.String("msg", "IPv6 is not supported or enabled on this system, TUN device is created without IPv6 support."))
s.Inet6Address = nil
}
tunOpts := tun.Options{
Name: s.IfName,
Inet4Address: s.Inet4Address,
Expand Down

0 comments on commit 5520bcc

Please sign in to comment.