Назад | Перейти на главную страницу

Брандмауэр 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

Проблема в том, что этот сценарий создает 1 отдельное правило для каждого заблокированного IP-адреса.

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

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

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

В простом случае <200 IP-адресов вам сначала нужно перебрать файл и собрать все IP-адреса в одну строку. Затем вы можете дважды вызвать команду netsh вне цикла (один раз для входящего трафика и один раз для исходящего).

Чтобы он мог обрабатывать более 200 IP-адресов, я добавил счетчик в цикл for. Когда вы превысите 200 IP-адресов, он вызовет команду netsh и сбросит счетчик IP-адресов, прежде чем продолжить просмотр файла. Конечным результатом должно быть то, что вы получите ряд правил в формате «Blockitп", где 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. - Для любых экспертов по пакетным файлам, читающих это, не стесняйтесь предлагать лучшую альтернативу - я сам не эксперт!)