电话
400 9058 355
本文介绍在防火墙访问控制列表(acl)分析场景下,快速检测目标端口范围是否与已有服务端口范围存在交集的三种算法方案,并重点推荐基于区间排序与二分查找的最优实践。
在网络安全运维与自动化策略分析中,常需判断一组待检端口(如 {"5672", "15672-15674"})是否与防火墙 ACL 中已配置的服务端口范围(如 {"20-22", "443", "8080-8088", "10000-65535"})存在交集。由于端口表示形式混合了单值(443)与区间(20-22),直接暴力展开为完整整数集合(如 {20,21,22})虽逻辑清晰,但在端口范围广(如 10000-65535 含 55536 个端口)时极易引发内存与性能瓶颈。因此,需设计不展开、低开销、可复用的区间交集判定方案。
该方案将所有端口统一为 [start, end] 形式(如 "443" → (443, 443),"20-22" → (20, 22)),对 ACL 区间列表按 start 排序后构建 List
public record PortRange(int start, int end) {
public boolean intersects(PortRange other) {
return this.start <= other.end && other.start <= this.end;
}
}
public class PortRangeChecker {
private final List sortedAclRanges;
public PortRangeChecker(String[] aclPortStrings) {
this.sortedAclRanges = Arrays.stream(aclPortStrings)
.map(PortRangeChecker::parseRange)
.sorted(Comparator.comparingInt(PortRange::start))
.collect(Collectors.toList());
}
private static PortRange parseRange(String s) {
String[] parts = s.trim().split("-");
int start = Integer.parseInt(parts[0]);
int 
end = parts.length == 2 ? Integer.parseInt(parts[1]) : start;
return new PortRange(Math.min(start, end), Math.max(start, end));
}
public boolean hasIntersection(String[] targetPortStrings) {
for (String target : targetPortStrings) {
PortRange targetRange = parseRange(target);
// 二分查找首个 start <= targetRange.end 的区间(潜在重叠起点)
int pos = binarySearchFirstStartLE(sortedAclRanges, targetRange.end);
if (pos < 0) continue;
// 向前/向后有限扫描(通常只需检查 1~2 个邻近区间)
for (int i = Math.max(0, pos - 1); i < Math.min(sortedAclRanges.size(), pos + 2); i++) {
if (sortedAclRanges.get(i).intersects(targetRange)) {
return true;
}
}
}
return false;
}
private static int binarySearchFirstStartLE(List list, int upperBound) {
int left = 0, right = list.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (list.get(mid).start() <= upperBound) {
left = mid + 1;
} else {
right = mid;
}
}
return left - 1; // 最右满足 start <= upperBound 的索引
}
} 优势总结:
综上,区间归一化 + 有序列表 + 二分定位 + 局部扫描是平衡开发成本、运行效率与资源消耗的最佳路径,适用于绝大多数企业级防火墙策略分析系统。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...