Брандмауэр 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 работает.

Другие вопросы по тегам