Firewall do Windows, netsh, bloqueia todos os ips de um arquivo de texto

4

estou usando o seguinte script para bloquear os ip's de um arquivo de texto no firewall do Windows.

Estou usando o 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

O problema é que esse script está criando uma regra separada para cada IP bloqueado.

Existe alguma maneira de criar menos regras com vários ips banidos na mesma regra? Tanto quanto me lembro cada regra tem um máximo de 200 ips proibidos permitidos. Então, quando o número 201 do ip for encontrado, ele deverá criar uma nova regra. Desta forma, se tivermos 1000 ips para bloquear, criaremos apenas 5 regras x 200 ip por regra, em vez de 1000 regras.

Espero que alguém possa me ajudar. Obrigado

    
por Chris 19.12.2014 / 22:32

2 respostas

1

Para o caso simples de < 200 IPs primeiro você precisa para percorrer o arquivo e obter todos os endereços IP em uma única seqüência de caracteres. Em seguida, você pode chamar o comando netsh duas vezes fora do loop (uma vez para o tráfego de entrada e uma vez para a saída).

Para permitir que ele lide com mais de 200 IPs, adicionei um contador ao loop for. Depois de exceder 200 IPs, ele chamará o comando netsh e redefinirá o contador IP antes de continuar a percorrer o arquivo. O resultado final deve ser que você acabe com uma série de regras no formato "Blockit n ", onde n é um número.

A única seção em que estou inseguro é a lista e as diretivas de exclusão no topo. Para fazer com que eles funcionem corretamente, o script precisa saber quantas regras relevantes de 'Blockit' existem. O melhor que consegui fazer foi listar esses e passar os resultados por meio de um findstr em um loop for. Não tenho certeza de que está funcionando corretamente. Eu continuarei trabalhando nisso, mas pensei em postar isso agora, já que está quase lá - e espero que você consiga descobrir o último passo:)

Observe a adição da diretiva de exclusão enabledelayed no topo - isso nos permite usar! VAR! variáveis de estilo que não serão expandidas durante a inicialização; somente em execução. Caso contrário, a variável final do IPADDR conterá apenas o último IP no arquivo de texto.

@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

Como um aparte, se fosse eu provavelmente procuraria aprender Powershell para esse tipo de coisa (ou mesmo qualquer script em uma plataforma Microsoft semi-moderna). Depois de pegar o jeito, você verá que é muito mais intuitivo que os arquivos em lote.

(P.S. - Para qualquer especialista em arquivo de lote que esteja lendo isso, sinta-se à vontade para sugerir uma alternativa melhor - eu não sou nenhum especialista!)

    
por 20.12.2014 / 19:51
3

Veja a seção "Advertências e isenções legais" em link e, em seguida, veja como funciona o script" Import-Firewall-Blocklist.ps1 ".

    
por 19.12.2014 / 23:15