@@ -58,7 +58,7 @@ func init() {
5858 scanCmd .Flags ().String ("domain" , "" , "tunnel domain (required for tunnel/edns/e2e steps)" )
5959 scanCmd .Flags ().String ("pubkey" , "" , "DNSTT public key (enables e2e test)" )
6060 scanCmd .Flags ().String ("cert" , "" , "Slipstream cert path (enables slipstream e2e test)" )
61- scanCmd .Flags ().String ("test-url" , "https ://httpbin.org/ip" , "URL to test through tunnel" )
61+ scanCmd .Flags ().String ("test-url" , "http ://httpbin.org/ip" , "URL to test through tunnel" )
6262 scanCmd .Flags ().String ("proxy-auth" , "" , "SOCKS proxy auth as user:pass (for e2e tests)" )
6363 scanCmd .Flags ().Bool ("doh" , false , "scan DoH resolvers instead of UDP" )
6464 scanCmd .Flags ().Bool ("skip-ping" , false , "skip ICMP ping step" )
@@ -185,7 +185,7 @@ func runScan(cmd *cobra.Command, args []string) error {
185185 }
186186
187187 printBanner (len (ips ), dohMode , domain , steps )
188- printPreFlight (len (ips ), domain , dnsttBin , slipstreamBin , steps )
188+ printPreFlight (len (ips ), domain , pubkey , testURL , proxyAuth , dnsttBin , slipstreamBin , steps )
189189
190190 ctx , stop := signal .NotifyContext (context .Background (), os .Interrupt )
191191 defer stop ()
@@ -215,7 +215,7 @@ func hline(left, fill, right string, width int) string {
215215 return left + strings .Repeat (fill , width ) + right
216216}
217217
218- func printPreFlight (ipCount int , domain , dnsttBin , slipstreamBin string , steps []scanner.Step ) {
218+ func printPreFlight (ipCount int , domain , pubkey , testURL , proxyAuth , dnsttBin , slipstreamBin string , steps []scanner.Step ) {
219219 if ! isTTY () {
220220 return
221221 }
@@ -242,7 +242,22 @@ func printPreFlight(ipCount int, domain, dnsttBin, slipstreamBin string, steps [
242242 fmt .Fprintf (w , " %s\u2718 %s Domain: %s%s%s — %sNS delegation NOT found!%s\n " ,
243243 colorRed , colorReset , colorCyan , domain , colorReset , colorRed , colorReset )
244244 fmt .Fprintf (w , " %sTunnel/e2e steps will likely fail. Verify your DNS setup:%s\n " , colorDim , colorReset )
245- fmt .Fprintf (w , " %snslookup -type=NS %s 8.8.8.8%s\n " , colorDim , domain , colorReset )
245+ fmt .Fprintf (w , " %sdig NS %s @8.8.8.8 (or check your registrar/Cloudflare dashboard)%s\n " , colorDim , domain , colorReset )
246+ }
247+ }
248+ // Preflight e2e: test tunnel connectivity with a known-good resolver
249+ if dnsttBin != "" && domain != "" && pubkey != "" {
250+ fmt .Fprintf (w , " %s…%s Tunnel preflight: testing dnstt-server connectivity...\n " , colorDim , colorReset )
251+ preflightTimeout := time .Duration (e2eTimeout ) * time .Second
252+ result := scanner .PreflightE2E (dnsttBin , domain , pubkey , testURL , proxyAuth , preflightTimeout )
253+ if result .OK {
254+ fmt .Fprintf (w , "\r \033 [2K\033 [A\033 [2K %s\u2714 %s Tunnel preflight: %sconnected via %s%s\n " ,
255+ colorGreen , colorReset , colorGreen , result .Resolver , colorReset )
256+ } else {
257+ fmt .Fprintf (w , "\r \033 [2K\033 [A\033 [2K %s\u2718 %s Tunnel preflight: %sFAILED — %s%s\n " ,
258+ colorRed , colorReset , colorRed , result .Err , colorReset )
259+ fmt .Fprintf (w , " %sYour dnstt-server may not be running or is misconfigured.%s\n " , colorDim , colorReset )
260+ fmt .Fprintf (w , " %sThe e2e step will likely produce 0 results.%s\n " , colorDim , colorReset )
246261 }
247262 }
248263 fmt .Fprintf (w , "\n " )
0 commit comments