Try to make the tun replacable

Former-commit-id: 6be0958887
This commit is contained in:
Owen
2025-12-30 21:38:07 -05:00
parent c56696bab1
commit cce8742490
4 changed files with 517 additions and 193 deletions

View File

@@ -35,6 +35,7 @@ var (
uapiListener net.Listener
tdev tun.Device
middleDev *olmDevice.MiddleDevice
interfaceName string
dnsProxy *dns.DNSProxy
apiServer *api.API
olmClient *websocket.Client
@@ -237,11 +238,11 @@ func StartTunnel(config TunnelConfig) {
stopPing = make(chan struct{})
var (
interfaceName = config.InterfaceName
id = config.ID
secret = config.Secret
userToken = config.UserToken
id = config.ID
secret = config.Secret
userToken = config.UserToken
)
interfaceName = config.InterfaceName
apiServer.SetOrgID(config.OrgID)
@@ -307,12 +308,7 @@ func StartTunnel(config TunnelConfig) {
tdev, err = func() (tun.Device, error) {
if config.FileDescriptorTun != 0 {
if runtime.GOOS == "android" { // otherwise we get a permission denied
theTun, _, err := tun.CreateUnmonitoredTUNFromFD(int(config.FileDescriptorTun))
return theTun, err
} else {
return olmDevice.CreateTUNFromFD(config.FileDescriptorTun, config.MTU)
}
return olmDevice.CreateTUNFromFD(config.FileDescriptorTun, config.MTU)
}
var ifName = interfaceName
if runtime.GOOS == "darwin" { // this is if we dont pass a fd
@@ -329,11 +325,11 @@ func StartTunnel(config TunnelConfig) {
return
}
if config.FileDescriptorTun == 0 {
if realInterfaceName, err2 := tdev.Name(); err2 == nil {
interfaceName = realInterfaceName
}
// if config.FileDescriptorTun == 0 {
if realInterfaceName, err2 := tdev.Name(); err2 == nil { // if the interface is defined then this should not really do anything?
interfaceName = realInterfaceName
}
// }
// Wrap TUN device with packet filter for DNS proxy
middleDev = olmDevice.NewMiddleDevice(tdev)
@@ -389,7 +385,7 @@ func StartTunnel(config TunnelConfig) {
}
// Create and start DNS proxy
dnsProxy, err = dns.NewDNSProxy(tdev, middleDev, config.MTU, wgData.UtilitySubnet, config.UpstreamDNS, config.TunnelDNS, interfaceIP)
dnsProxy, err = dns.NewDNSProxy(middleDev, config.MTU, wgData.UtilitySubnet, config.UpstreamDNS, config.TunnelDNS, interfaceIP)
if err != nil {
logger.Error("Failed to create DNS proxy: %v", err)
}
@@ -956,6 +952,33 @@ func StartTunnel(config TunnelConfig) {
logger.Info("Tunnel process context cancelled, cleaning up")
}
func AddDevice(fd uint32) {
if middleDev == nil {
logger.Error("MiddleDevice is nil, cannot add device")
return
}
if tunnelConfig.MTU == 0 {
logger.Error("No MTU configured, cannot create device")
return
}
tdev, err := olmDevice.CreateTUNFromFD(fd, tunnelConfig.MTU)
if err != nil {
logger.Error("Failed to create TUN device: %v", err)
return
}
// if config.FileDescriptorTun == 0 {
if realInterfaceName, err2 := tdev.Name(); err2 == nil { // if the interface is defined then this should not really do anything?
interfaceName = realInterfaceName
}
// Here we replace the existing TUN device in the middle device with the new one
middleDev.AddDevice(tdev)
}
func Close() {
// Restore original DNS configuration
// we do this first to avoid any DNS issues if something else gets stuck