From 77689a9aecfba600b6cf1aba7d851f6d78d1ea07 Mon Sep 17 00:00:00 2001 From: Andre <200930841+Andre-Bzk@users.noreply.github.com> Date: Fri, 23 Oct 2026 09:37:41 +0200 Subject: [PATCH] fix: make tunnel start despite unreadable DNS answers wstunnel's built-in DNS resolver fails on some DNS servers because it cannot read their EDNS answers. With a connection pool the client then never opened the local port. Use the Windows resolver instead. The port check also took ~2 s per attempt, so the start script showed an empty window for a long time before the error appeared. --- client/scripts/common.ps1 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/scripts/common.ps1 b/client/scripts/common.ps1 index 0b6f10f..8add515 100644 --- a/client/scripts/common.ps1 +++ b/client/scripts/common.ps1 @@ -14,7 +14,11 @@ $LogDir = Join-Path $ClientDir 'logs' $ProxyUrl = "http://$LocalProxy" function Get-TunnelArgs([string]$LogLevel) { - $tunnelArgs = @('client', '-L', "http://$LocalProxy", '-c', '2', '--log-lvl', $LogLevel) + # Windows-Resolver statt des eingebauten: Manche DNS-Server liefern EDNS-Antworten, + # die wstunnel nicht lesen kann. Dann scheitert jede Verbindung, und mit -c wartet + # der Client endlos auf den Pool, bevor er den lokalen Port oeffnet. + $tunnelArgs = @('client', '-L', "http://$LocalProxy", '-c', '2', '--log-lvl', $LogLevel, + '--dns-resolver', 'system://0.0.0.0') if (-not $SkipTlsVerify) { $tunnelArgs += '--tls-verify-certificate' } if ($UpstreamProxy) { $tunnelArgs += @('--http-proxy', $UpstreamProxy) } if ($UpstreamProxyUser) { $tunnelArgs += @('--http-proxy-login', $UpstreamProxyUser) } @@ -44,7 +48,8 @@ function Invoke-WithTunnelEnv([scriptblock]$Action) { function Test-TunnelListening { $parts = $LocalProxy.Split(':') $client = New-Object System.Net.Sockets.TcpClient - try { $client.Connect($parts[0], [int]$parts[1]); return $true } + # Connect() auf einen geschlossenen Port dauert unter Windows ~2 s (SYN-Wiederholungen) + try { return $client.ConnectAsync($parts[0], [int]$parts[1]).Wait(500) -and $client.Connected } catch { return $false } finally { $client.Close() } }