无需过多解释为什么我需要这样做,我试图将 Windows XP 防火墙置于允许所有端口配置中,并且仅拒绝列表中的某些端口。
我使用批处理命令行和 netsh 防火墙 add portopening 命令编写了此脚本。据我所知,如果激活防火墙,它将拒绝所有流量,并且只允许有例外的端口,因此通过批处理脚本,我打开了 TCP 和 UDP 上的所有 65,000 多个端口,本质上是打开了防火墙,但配置为“允许所有”。然后,在列表中所有我想阻止的端口都打开后,我拒绝了它们。
这个策略似乎有效,但我预料到并且现在看到的问题是 svchost.exe 占用了我 50% 的 CPU 时间,必须不断处理这些防火墙规则。
从我在 Windows XP 上看到的情况来看,没有办法打开防火墙并将其设置为“允许所有”配置,因为 XP 防火墙无法定义端口范围,必须逐个定义。看起来 Windows Vista 或 7 会容易得多,因为防火墙进行了高级功能改造。
有人对如何实现这种“允许所有,拒绝某些”策略有什么建议吗?我意识到这是 Windows 防火墙的奇怪用法,但假设我必须这样做,这可能吗?
答案1
完全同意阿弗拉齐尔评论...
据我所知,没有应用程序或服务需要打开 65536 个入站端口!
要明确的是,开放端口是服务正在运行的端口,在聆听状态为了响应外部连接请求。例如,Apache 的 Web 服务器的端口 80 HTTP。
传入的连接请求是一个带有标志 SYN 的 TCP 数据包,并且没有到达所需端口的数据:端口 80 用于 HTTP 连接,119 用于 NNTP,21 用于 FTP 等等。
如果服务已准备好允许连接到此端口,则服务器将向客户端发送带有标志 ACK、SYN 的 TCP 数据包,客户端通过带有标志 ACK 的 TCP 数据包确认连接请求...,然后连接进入在既定状态下。这是正常的握手。
如果监听端口上的服务无法接受连接,它会发送一个带有标志 ACK、RST 的 TCP 数据包:这是一个封闭的端口...
嗯...长话短说:
1- 您需要第三方防火墙。可能看看并停下来这是一个基于规则的防火墙。
2- 配置需要打开这些大量端口的应用程序,并仅为此应用程序设置规则
3-将此规则放在阻止所有其他 TCP 传入连接请求(带有标志 SYN)的规则之前,依此类推......
希望这能有所帮助。让我们知道。:)
答案2
我很好奇以这种方式配置防火墙的用例是什么。除非有东西在监听开放端口,否则开放端口是无用的,如果您有一个程序在监听这么多端口,只需为该程序本身设置一个例外,这样就可以解决所有问题。
如果这不起作用,那么在我看来,XP 内置的防火墙根本无法有效地完成您的任务。
Vista 和 7 内置的防火墙允许规则上的端口范围,并且可以更轻松地将防火墙置于您想要的状态。
否则,您将需要评估第三方工具,看看它们的效果如何。自从 XP SP2 发布以来,我还没有使用过第三方防火墙,因此我无法提出任何建议。
答案3
这是一个老问题,但我认为最好的解决方案是完全禁用防火墙,然后禁用您不希望远程用户访问的任何服务。我想你想得太多了。额外的好处是,此解决方案使用的处理时间少于零。
答案4
更新:不要这样做,这会严重减慢系统速度,因此您最好分析一下您真正需要哪些端口。
我知道现在很晚了,但我刚好有一位客户有这个要求。我们先不讨论这有多大意义,但这至少可以让日志记录保持活动状态,而不是禁用防火墙。
我能够通过为每个 tcp 和 udp 创建 65535 条规则来通过 cmd 打开所有端口......
FOR /L %I IN (0,1,65535) DO netsh firewall add portopening TCP %I "TCP "%I
这将为 TCP 创建从 0 到 65535 的增量规则。UDP 当然也遵循相同的原则。规则名称采用“TCP 1”、“TCP 2”等模式。
这显然需要很长时间,如果你想加快速度,可以将其拆分为多个 cmd 窗口。我通过像这样替换括号的内容将其拆分为 4 个相同的部分。
part 1 (0,1,16300)
part 2 (16301,1,32600)
part 3 (32601,1,48900)
part 4 (48901,1,65535)
仍在测试具有如此多规则的防火墙是否不会以某种奇怪的方式影响系统,但到目前为止,它似乎与禁用防火墙时的影响相同。