From 27cb977a8f7ae27388302b4f3343bdfc2cbb9838 Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Thu, 13 Aug 2026 16:22:51 +0200 Subject: Increased speed 1000x times by replacing host reachable method with another port scan task. The speed is gained by removing thread pinning method isReachable() --- .../com/it_jaros/jns/scan/engine/ScanHostTask.java | 24 +++++++++------------- .../com/it_jaros/jns/scan/engine/ScanPortTask.java | 4 ---- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java index 0fbfef0..ce06287 100644 --- a/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java +++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanHostTask.java @@ -3,15 +3,13 @@ package com.it_jaros.jns.scan.engine; import com.it_jaros.jns.scan.Scan; import com.it_jaros.jns.scan.domain.PortRange; import com.it_jaros.jns.scan.domain.PortResult; +import com.it_jaros.jns.scan.domain.PortState; import com.it_jaros.jns.scan.domain.ScanResult; -import java.io.IOException; -import java.net.InetAddress; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.LockSupport; public class ScanHostTask implements Callable { @@ -21,18 +19,16 @@ public class ScanHostTask implements Callable { private final CancelledToken cancelledToken; private final boolean disableOnlineCheck; private final int maxWorkersPerHost; - private final int timeoutInMillis; - private final long delayInNanos; + private final PortResultAccumulator accumulator; public ScanHostTask(Scan scan, String host, ScanExecutionContext context) { this.scan = scan; this.host = host; this.context = context; + this.accumulator = new PortResultAccumulator(host); this.cancelledToken = context.cancelledToken(); - this.delayInNanos = TimeUnit.MILLISECONDS.toNanos(Math.max(0, context.scanOptions().delayInMillis())); this.disableOnlineCheck = context.scanOptions().disableOnlineCheck(); this.maxWorkersPerHost = context.scanOptions().maxWorkersPerHost(); - this.timeoutInMillis = context.scanOptions().timeoutInMillis(); } @Override @@ -55,10 +51,6 @@ public class ScanHostTask implements Callable { // Unreachable host return ScanResult.empty(host); } - // online check also sends packets to the target system. - // in order not to violate set delay time - // we wait here too - LockSupport.parkNanos(delayInNanos); } final PortRange portRange = new PortRange(scan.getPorts()); @@ -74,7 +66,6 @@ public class ScanHostTask implements Callable { // we run as long as the producer is running OR // as long as things are in pipeline waiting to be processed // ONLY exception is when cancelled is set - final PortResultAccumulator accumulator = new PortResultAccumulator(host); while (!cancelledToken.isCancelled() && (state.running().get() || state.inPipeline().get() > 0)) { try { PollState poll = getPortResult(state); @@ -94,8 +85,13 @@ public class ScanHostTask implements Callable { private boolean checkHostOnline() { try { - return InetAddress.getByName(host).isReachable(timeoutInMillis); - } catch (IOException e) { + PortResult result = new ScanPortTask(host, 7, context).call(); + Exception exception = result.getException(); + accumulator.add(result); + if (exception == null && !result.getState().equals(PortState.FILTERED)) { + return true; + } + } catch (Exception e) { // we ignore this error because it means that the host is probably not online } diff --git a/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java b/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java index c5591e7..b6c5964 100644 --- a/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java +++ b/src/main/java/com/it_jaros/jns/scan/engine/ScanPortTask.java @@ -8,7 +8,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.ConnectException; import java.net.InetSocketAddress; -import java.net.NoRouteToHostException; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; import java.util.concurrent.Callable; @@ -89,9 +88,6 @@ public class ScanPortTask implements Callable { } } catch (ConnectException ignored) { result.setState(PortState.CLOSED); - } catch (NoRouteToHostException ignored) { - // NoRouteToHostException: this can be safely ignored because the port is closed if a host is unreachable - // Will happen a lot when scanning for open ports, so not needed } catch (IOException e) { result.setException(e); } -- cgit v1.3.1