Windows防火牆,netsh,阻止文本文件中的所有ip
我正在使用以下腳本阻止 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 - 對於閱讀本文的任何批處理文件專家,請隨時提出更好的替代方案 - 我自己不是專家!)