Брандмауэр Windows, netsh, заблокировать все ips из текстового файла
Я использую следующий скрипт для блокировки 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
Проблема в том, что этот скрипт создает 1 отдельное правило для каждого заблокированного IP.
Есть ли способ создать меньше правил с несколькими ips, заблокированными для одного и того же правила? Насколько я помню, каждое правило имеет максимум 200 разрешенных забаненных ips. Поэтому, когда IP-номер 201 найден, он должен создать новое правило. Таким образом, если у нас есть 1000 ips для блокировки, он создаст всего 5 правил x 200 ip на правило вместо 1000 правил.
Надеюсь, кто-нибудь сможет мне помочь. Спасибо
2 ответа
Для простого случая < 200 IP-адресов вам сначала нужно перебрать файл и получить все IP-адреса в одну строку. Затем вы можете вызвать команду netsh дважды вне цикла (один раз для входящего трафика и один раз для исходящего).
Чтобы позволить ему справиться с более чем 200 IP, я добавил счетчик в цикл for. Когда вы превысите 200 IP-адресов, он вызовет команду netsh и сбросит счетчик IP-адресов, прежде чем продолжить цикл по файлу. Конечный результат должен состоять в том, что вы получите ряд правил в формате "Blockitn", где n - число.
Единственный раздел, в котором я не уверен, - это список и директивы удаления в верхней части. Чтобы заставить их работать должным образом, скрипт должен знать, сколько существует соответствующих правил 'Blockit'. Лучшее, что я могу придумать, это перечислить их и передать результаты через findstr в цикле for. Я не уверен, что это работает совершенно правильно, хотя. Я буду продолжать работать над этим, но подумал, что я опубликую это сейчас, так как он почти готов - и, надеюсь, вы сможете понять последний бит:)
Обратите внимание на добавление директивы 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 - для любого эксперта по пакетным файлам, читающего это, не стесняйтесь предлагать лучшую альтернативу - я сам не эксперт!)
Посмотрите раздел "Предостережения и правовые оговорки" на http://cyber-defense.sans.org/blog/2011/10/25/windows-firewall-script-block-addresses-network-ranges а затем посмотрите, как их Скрипт Import-Firewall-Blocklist.ps1 работает.