AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 653814
Accepted
Chris
Chris
Asked: 2014-12-20 13:32:19 +0800 CST2014-12-20 13:32:19 +0800 CST 2014-12-20 13:32:19 +0800 CST

Windows防火墙,netsh,阻止文本文件中的所有ip

  • 772

我正在使用以下脚本阻止 ip 从文本文件进入 Windows 防火墙。

我正在使用 Windows 2008 R2

    @echo off
if "%1"=="list" (
  netsh advfirewall firewall show rule Blockit | findstr RemoteIP
  exit/b
)

:: Deleting existing block on ips
netsh advfirewall firewall delete rule name="Blockit"

:: Block new ips (while reading them from blockit.txt)
for /f %%i in (blockit.txt) do (
  netsh advfirewall firewall add rule name="Blockit" protocol=any dir=in action=block remoteip=%%i
  netsh advfirewall firewall add rule name="Blockit" protocol=any dir=out action=block remoteip=%%i
)

:: call this batch again with list to show the blocked IPs
call %0 list

问题是,此脚本为每个被阻止的 IP 创建 1 个单独的规则。

有什么方法可以创建更少的规则,在同一规则上禁止多个 ip?据我所知,每条规则最多允许 200 个被禁止的 ip。因此,当找到 201 号 IP 时,它应该创建一个新规则。这样,如果我们要阻止 1000 个 ip,它将只创建 5 个规则 x 每个规则 200 个 ip,而不是 1000 个规则。

希望有人可以帮助我。谢谢

windows
  • 2 2 个回答
  • 7970 Views

2 个回答

  • Voted
  1. DTK
    2014-12-20T14:15:52+08:002014-12-20T14:15:52+08:00

    查看http://cyber-defense.sans.org/blog/2011/10/25/windows-firewall-script-block-addresses-network-ranges上的“警告和法律免责声明”部分,然后查看他们的Import-Firewall-Blocklist.ps1 脚本有效。

    • 3
  2. Best Answer
    Steve365
    2014-12-21T10:51:29+08:002014-12-21T10:51:29+08:00

    对于 < 200 个 IP 的简单情况,您首先需要遍历文件并将所有 IP 地址放入一个字符串中。然后您可以在循环外调用 netsh 命令两次(一次用于入站流量,一次用于出站)。

    为了让它能够处理超过 200 个 IP,我在 for 循环中添加了一个计数器。一旦超过 200 个 IP,它将调用 netsh 命令并重置 IP 计数器,然后继续循环遍历文件。最终结果应该是您最终得到一系列格式为“Blockit n ”的规则,其中 n 是一个数字。

    我不确定的一个部分是顶部的列表和删除指令。为了使这些正常工作,脚本需要知道存在多少相关的“Blockit”规则。我能想到的最好的办法是列出这些并通过 for 循环中的 findstr 传递结果。我不确定它是否工作正常。我会继续努力,但我想我现在会发布这个,因为它快到了——希望你能弄清楚最后一点:)

    请注意在顶部附近添加了 enabledelayedexpansion 指令 - 这让我们可以使用 !VAR! 初始化期间不会扩展的样式变量;仅在执行时。否则最终的 IPADDR 变量将只包含文本文件中的最后一个 IP。

    @echo off
    setlocal enabledelayedexpansion
    if "%1"=="list" (
      SET /A RULECOUNT=0
      for /f %%i in ('netsh advfirewall firewall show rule name^=all ^| findstr Blockit') do (
        SET /A RULECOUNT+=1
        netsh advfirewall firewall show rule Blockit!RULECOUNT! | findstr RemoteIP
      )
      SET "RULECOUNT="
      exit/b
    )
    
    REM Deleting existing block on ips
    SET /A RULECOUNT=0
    for /f %%i in ('netsh advfirewall firewall show rule name^=all ^| findstr Blockit') do (
      SET /A RULECOUNT+=1
      netsh advfirewall firewall delete rule name="Blockit!RULECOUNT!"
    )
    SET "RULECOUNT="
    
    REM Block new ips (while reading them from blockit.txt)
    SET /A IPCOUNT=0
    SET /A BLOCKCOUNT=1
    for /f %%i in (blockit.txt) do (
      SET /A IPCOUNT+=1
      if !IPCOUNT! == 201 (
        netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=in action=block remoteip=!IPADDR!
        netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=out action=block remoteip=!IPADDR!
        SET /A BLOCKCOUNT+=1
        SET /A IPCOUNT=1
        set IPADDR=%%i
      ) else (
        if not "!IPADDR!" == "" (  
          set IPADDR=!IPADDR!,%%i
        ) else (
          set IPADDR=%%i
        )
      )
    )
    
    REM add the final block of IPs of length less than 200
    netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=in action=block remoteip=!IPADDR!
    netsh advfirewall firewall add rule name="Blockit!BLOCKCOUNT!" protocol=any dir=out action=block remoteip=!IPADDR!
    
    SET "IPCOUNT="
    SET "BLOCKCOUNT="
    SET "IPADDR="
    
    REM call this batch again with list to show the blocked IPs
    call %0 list
    

    顺便说一句,如果是我,我可能会为这类事情学习 Powershell(或者实际上是半现代 Microsoft 平台上的任何脚本)。一旦你掌握了它,你会发现它比批处理文件直观得多。

    (PS - 对于阅读本文的任何批处理文件专家,请随时提出更好的替代方案 - 我自己不是专家!)

    • 1

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve