commit dd745f128ad50c303977880d11870fb5539a94f8
parent a8dd54bc52340035a2097e19cf5d0e1f1ca1b722
Author: Matthias Jaros <jaros@mailbox.org>
Date: Mon, 23 Mar 2026 14:29:55 +0100
Renamed blocked to filtered ports to do it like nmap and changed default
scan values
Diffstat:
8 files changed, 33 insertions(+), 30 deletions(-)
diff --git a/src/main/java/com/it_jaros/network_scanner/App.java b/src/main/java/com/it_jaros/network_scanner/App.java
@@ -11,7 +11,7 @@ public class App {
ScanOptions options = cliParser.parseArgs(args);
Scanner scanner = new Scanner(options.openSocketLimit(), options.timeoutInMillis(),
options.delayInMillis(), options.maxWorkersPerHost(), options.maxTargetsLimit());
- printResults(scanner.scan(options), options.showBlockedPorts());
+ printResults(scanner.scan(options), options.showFilteredPorts());
} catch (IllegalArgumentException e) {
System.out.printf("Error while parsing arguments: %s", e.getMessage());
cliParser.usageAndExit();
@@ -20,21 +20,21 @@ public class App {
}
}
- public static void printResults(List<ScanResult> results, boolean showBlockedPorts) {
- results.forEach((ScanResult r) -> printResult(r, showBlockedPorts));
+ public static void printResults(List<ScanResult> results, boolean showFilteredPorts) {
+ results.forEach((ScanResult r) -> printResult(r, showFilteredPorts));
}
- private static void printResult(ScanResult result, boolean showBlockedPorts) {
- if (result.openPorts().isEmpty() && (!showBlockedPorts || result.blockedPorts().isEmpty())) {
+ private static void printResult(ScanResult result, boolean showFilteredPorts) {
+ if (result.openPorts().isEmpty() && (!showFilteredPorts || result.filteredPorts().isEmpty())) {
return;
}
System.out.println(result.target());
if (!result.openPorts().isEmpty()) {
- System.out.println("\topen:\t" + map(result.openPorts()));
+ System.out.printf("\t (%d) open:\t%s%n", result.openPorts().cardinality(), map(result.openPorts()));
}
- if (showBlockedPorts && !result.blockedPorts().isEmpty()) {
- System.out.println("\tblocked:\t" + map(result.blockedPorts()));
+ if (showFilteredPorts && !result.filteredPorts().isEmpty()) {
+ System.out.printf("\t (%d) filtered:\t%s%n", result.filteredPorts().cardinality(), map(result.filteredPorts()));
}
System.out.println();
}
diff --git a/src/main/java/com/it_jaros/network_scanner/CliParser.java b/src/main/java/com/it_jaros/network_scanner/CliParser.java
@@ -13,11 +13,11 @@ public class CliParser {
Set<String> targets = new HashSet<>();
int socketLimit = 1000;
int delayInMillis = 0;
- int timeoutInMillis = 1000;
+ int timeoutInMillis = 100;
int maxWorkersPerHost = 1000;
int maxTargetsLimit = 10;
String ports = "1-1024";
- boolean showBlockedPorts = false;
+ boolean showFilteredPorts = false;
for (int i = 0; i < args.length; i++) {
final String currentArg = args[i];
if (!currentArg.startsWith("-")) {
@@ -48,8 +48,8 @@ public class CliParser {
case "--ports", "-p":
ports = args[++i];
break;
- case "--showBlocked", "-sb":
- showBlockedPorts = true;
+ case "--showFilteredPorts", "-sf":
+ showFilteredPorts = true;
break;
default:
throw new IllegalArgumentException("No such param " + currentArg);
@@ -61,10 +61,10 @@ public class CliParser {
}
System.out.printf(
- "Parsed arguments: targets('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s), maxTargetsLimit(%s), showBlockedPorts(%s) %n",
- targets, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, showBlockedPorts);
+ "Parsed arguments: targets('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s), maxTargetsLimit(%s), showFilteredPorts(%s) %n",
+ targets, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, showFilteredPorts);
- return new ScanOptions(targets.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, ports, showBlockedPorts);
+ return new ScanOptions(targets.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, ports, showFilteredPorts);
}
public void usageAndExit() {
@@ -79,6 +79,7 @@ public class CliParser {
--ports, -p:\t\tPorts to be scanned
--maxWorkersPerHost, -wh:\tVirtual Worker Threads run per target. Higher doesn't mean necessarily faster. But the more you use the more RAM is required (Default: 1000)
--maxTargetsLimit, -tl:\\tMax number of targets that are scanned at the same time (Default: 10)
+ --showFilteredPorts, -sf:\\\\tShow also filtered ports
Examples:
java -jar scanner.jar localhost
diff --git a/src/main/java/com/it_jaros/network_scanner/PortState.java b/src/main/java/com/it_jaros/network_scanner/PortState.java
@@ -3,5 +3,5 @@ package com.it_jaros.network_scanner;
public enum PortState {
OPEN,
CLOSED,
- BLOCKED
+ FILTERED
}
diff --git a/src/main/java/com/it_jaros/network_scanner/Progress.java b/src/main/java/com/it_jaros/network_scanner/Progress.java
@@ -2,4 +2,4 @@ package com.it_jaros.network_scanner;
import java.util.concurrent.atomic.AtomicInteger;
-public record Progress(String host, int total, AtomicInteger done, AtomicInteger open, AtomicInteger blocked) {}
-\ No newline at end of file
+public record Progress(String host, int total, AtomicInteger done, AtomicInteger open, AtomicInteger filtered) {}
+\ No newline at end of file
diff --git a/src/main/java/com/it_jaros/network_scanner/ProgressBar.java b/src/main/java/com/it_jaros/network_scanner/ProgressBar.java
@@ -59,12 +59,12 @@ public class ProgressBar {
System.out.println(createBar(
progress.host(),
progress.open().get(),
- progress.blocked().get(),
+ progress.filtered().get(),
progress.done().get(),
progress.total()));
}
- public String createBar(String label, int open, int blocked, int done, int total) {
+ public String createBar(String label, int open, int filtered, int done, int total) {
int width = 30;
double pct = total == 0 ? 1.0 : (done / (double) total);
int filled = (int) (pct * width);
@@ -72,7 +72,7 @@ public class ProgressBar {
String brackets = "[" + "#".repeat(filled) + "-".repeat(width - filled) + "]";
int percent = (int) (pct * 100);
- return String.format("%-40s open: %s blocked: %s %s %3d%% (%d/%d)", label, open, blocked, brackets, percent, done, total);
+ return String.format("%-40s open: %s filtered: %s %s %3d%% (%d/%d)", label, open, filtered, brackets, percent, done, total);
}
public void stop() {
diff --git a/src/main/java/com/it_jaros/network_scanner/ScanOptions.java b/src/main/java/com/it_jaros/network_scanner/ScanOptions.java
@@ -2,4 +2,4 @@ package com.it_jaros.network_scanner;
import java.util.List;
-public record ScanOptions(List<String> targets, int openSocketLimit, int delayInMillis, int timeoutInMillis, int maxWorkersPerHost, int maxTargetsLimit, String ports, boolean showBlockedPorts) {}
+public record ScanOptions(List<String> targets, int openSocketLimit, int delayInMillis, int timeoutInMillis, int maxWorkersPerHost, int maxTargetsLimit, String ports, boolean showFilteredPorts) {}
diff --git a/src/main/java/com/it_jaros/network_scanner/ScanResult.java b/src/main/java/com/it_jaros/network_scanner/ScanResult.java
@@ -2,4 +2,4 @@ package com.it_jaros.network_scanner;
import java.util.BitSet;
-public record ScanResult(String target, BitSet openPorts, BitSet blockedPorts) {}
+public record ScanResult(String target, BitSet openPorts, BitSet filteredPorts) {}
diff --git a/src/main/java/com/it_jaros/network_scanner/Scanner.java b/src/main/java/com/it_jaros/network_scanner/Scanner.java
@@ -74,7 +74,7 @@ public class Scanner {
AtomicLong portSlotFactory = new AtomicLong(System.nanoTime());
Semaphore maxWorkers = new Semaphore(maxWorkersPerHost);
BitSet openPorts = new BitSet(PortRange.MAX_PORT);
- BitSet blockedPorts = new BitSet(PortRange.MAX_PORT);
+ BitSet filteredPorts = new BitSet(PortRange.MAX_PORT);
Progress progress = new Progress(target, portRange.getTotal(), new AtomicInteger(), new AtomicInteger(), new AtomicInteger() );
progressBar.submit(progress);
@@ -90,8 +90,8 @@ public class Scanner {
PortState state = getPortState(target, currentPort);
if (state.equals(PortState.OPEN)) {
progress.open().incrementAndGet();
- } else if (state.equals(PortState.BLOCKED)) {
- progress.blocked().incrementAndGet();
+ } else if (state.equals(PortState.FILTERED)) {
+ progress.filtered().incrementAndGet();
}
return new PortResult(currentPort, state);
} finally {
@@ -109,8 +109,8 @@ public class Scanner {
PortResult portResult = f.get();
if (portResult.state().equals(PortState.OPEN)) {
openPorts.set(portResult.port());
- } else if (portResult.state().equals(PortState.BLOCKED)) {
- blockedPorts.set(portResult.port());
+ } else if (portResult.state().equals(PortState.FILTERED)) {
+ filteredPorts.set(portResult.port());
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
@@ -124,7 +124,7 @@ public class Scanner {
}
}
- return new ScanResult(target, openPorts, blockedPorts);
+ return new ScanResult(target, openPorts, filteredPorts);
}
private void waitForSlot(AtomicLong scanSlotFactory) {
@@ -144,8 +144,10 @@ public class Scanner {
return PortState.OPEN;
} catch (NoRouteToHostException ignored) {
// this can be safely ignored because the port is closed if a host is unreachable
+ } catch (SocketTimeoutException ignored) {
+ return PortState.FILTERED;
} catch (ConnectException ignored) {
- return PortState.BLOCKED;
+ return PortState.CLOSED;
} catch (IOException ignored) {
// Will happen a lot when scanning for open ports, so not needed
} finally {