Брандмауэр Windows, netsh, блок весь дюйм/с от текстового файла

использую следующий документ на получение для IP блока от текстового файла в брандмауэр окон.

Я использую окна 2 008 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.

Там какой-либо путь состоит в том, чтобы создать меньше правил с несколькими, дюйм/с запретил на том же правиле? Насколько я помню, что каждое правило имеет максимум 200 позволенных запрещенных дюйм/с. Таким образом, когда IP-адрес 201 найден, он должен создать новое правило. Таким образом, если у нас есть 1 000 дюйм/с для блокирования его, создаст всего 5 правил x 200 IP на правило вместо 1 000 правил.

Надо надеяться, кто-то может помочь мне.Спасибо

4
задан 19 December 2014 в 23:32
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). Как только вы освоите его, вы поймете, что он намного намного более интуитивен, чем пакетные файлы.

(P.S. - Для любого эксперта по пакетным файлам, читающего это, не стесняйтесь предложить лучшую альтернативу - я сам не эксперт!)

1
ответ дан 3 December 2019 в 03:29

См. Раздел «Предостережения и отказ от ответственности» на http://cyber-defense.sans.org/blog/2011/10/25/windows-firewall-script- блок-адреса-сетевые-диапазоны , а затем посмотрите, как работает их сценарий Import-Firewall-Blocklist.ps1.

3
ответ дан 3 December 2019 в 03:29

Теги

Похожие вопросы