Windows

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

  • March 19, 2021

我正在使用以下腳本阻止 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 個規則。

希望有人可以幫助我。謝謝

對於 < 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 - 對於閱讀本文的任何批處理文件專家,請隨時提出更好的替代方案 - 我自己不是專家!)

引用自:https://serverfault.com/questions/653814