elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [APORTE] [PowerShell] Crear reglas de firewall para bloquear tráfico de direcciones IPv4
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [APORTE] [PowerShell] Crear reglas de firewall para bloquear tráfico de direcciones IPv4  (Leído 897 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
[APORTE] [PowerShell] Crear reglas de firewall para bloquear tráfico de direcciones IPv4
« en: 22 Septiembre 2024, 11:22 am »

El siguiente script desarrollado en el lenguaje PowerShell sirve para automatizar la creación de reglas del firewall de Windows para bloquear tráfico de direcciones IPv4.

Las direcciones IPv4 pueden estar definidas en el propio script, o en un archivo de texto local.

En la cabecera del script, se puede asignar el valor apropiado para especificar la ruta de un archivo que contenga direcciones IPv4:
Código:
$ipv4ListFile = "$PSScriptRoot\Ipv4.txt"

Ejemplo del contenido del archivo:
Código:
172.64.149.23
192.229.221.95
20.190.177.85
20.73.194.208

O directamente también se pueden establecer las IPv4 a bloquear, en el siguiente array:
Código:
$ipArray = @()











Block IP addresses.ps1
Código
  1. # Script Version 1.3
  2.  
  3. <#
  4. ===========================================================================================
  5. |                                                                                         |
  6. |                                      User Settings                                      |
  7. |                                                                                         |
  8. ===========================================================================================
  9. #>
  10.  
  11. # Path to a plain text file containing IP addresses.
  12. # Note: The file must contain a single IP address per line.
  13. [string] `
  14. $ipListFile = "$PSScriptRoot\Ipv4.txt"
  15.  
  16. # An Array with additional IP addresses to block.
  17. [string[]] `
  18. $ipArray = @()
  19.  
  20. <#
  21. ===========================================================================================
  22. |                                                                                         |
  23. |                                    Functions                                            |
  24. |                                                                                         |
  25. ===========================================================================================
  26. #>
  27.  
  28. function Show-WelcomeScreen {
  29.    Clear-Host
  30.    Write-Host ""
  31.    Write-Host " $($host.ui.RawUI.WindowTitle)"
  32.    Write-Host " +=======================================+"
  33.    Write-Host " |                                       |"
  34.    Write-Host " | This script will add firewall rules   |"
  35.    Write-Host " | to block network traffic for the IP   |"
  36.    Write-Host " | addresses specified in the input file |"
  37.    Write-Host " | and/or defined in this script file.   |"
  38.    Write-Host " |                                       |"
  39.    Write-Host " +=======================================+"
  40.    Write-Host ""
  41.    Write-Host " Input File Path: $ipListFile" -ForegroundColor DarkGray
  42.    Write-Host ""
  43.    Write-Host " IP addresses hardcoded in this script: $($ipArray.Count)" -ForegroundColor DarkGray
  44.    Write-Host ""
  45. }
  46.  
  47. function Confirm-Continue {
  48.    Write-Host " Press 'Y' key to continue or 'N' key to exit."
  49.    Write-Host ""
  50.    Write-Host " -Continue? (Y/N)"
  51.    do {
  52.        $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  53.        $char = $key.Character.ToString().ToUpper()
  54.        if ($char -ne "Y" -and $char -ne "N") {
  55.            [console]::beep(1500, 500)
  56.        }
  57.    } while ($char -ne "Y" -and $char -ne "N")
  58.    if ($char -eq "N") {Exit(1)} else {Clear-Host}
  59. }
  60.  
  61. function Show-GoodbyeScreen {
  62.    Write-Host "Operation Completed!" -BackgroundColor Black -ForegroundColor Green
  63.    Write-Host ""
  64.    Write-Host "Press any key to exit..."
  65.    $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
  66. }
  67.  
  68. function Add-FirewallRules {
  69.    param (
  70.        [string]$ipListFile,
  71.        [string[]]$ipArray
  72.    )
  73.  
  74.    Write-Host "Compiling internal C# code..."
  75.    # Natural Sorting C# Snippet
  76.    Add-Type -TypeDefinition '
  77.        using System;
  78.        using System.Collections.Generic;
  79.        using System.Runtime.InteropServices;
  80.  
  81.        public static class NativeMethods {
  82.            [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
  83.            public static extern int StrCmpLogicalW(string first, string second);
  84.        }
  85.  
  86.        public class NaturalStringComparer : IComparer<string> {
  87.            public int Compare(string first, string second) {
  88.                return NativeMethods.StrCmpLogicalW(first, second);
  89.            }
  90.        }
  91.    '
  92.  
  93.    Write-Host "Fetching computer's firewall rules..."
  94.    $ruleGroupName = "$env:COMPUTERNAME IP Blocks"
  95.    [CimInstance[]]$currentRules = Get-NetFirewallRule -Group $ruleGroupName -ErrorAction SilentlyContinue
  96.  
  97.    Write-Host "Building IP address collection..."
  98.    $comparer = [NaturalStringComparer]::new()
  99.    $sortedSet = [System.Collections.Generic.SortedSet[string]]::new($ipArray, $comparer)
  100.    if (Test-Path $ipListFile) {
  101.        Write-Host "Fetching IP addresses from input file..."
  102.        $ipList = Get-Content -Path $ipListFile | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
  103.        foreach ($ip in $ipList) {
  104.            $sortedSet.Add($ip) | Out-Null
  105.        }
  106.    }
  107.    if ($sortedSet.Count -eq 0) {
  108.        Write-Warning "There are no IP addresses to process."
  109.        return
  110.    }
  111.    $totalItemCount   = $sortedSet.Count
  112.    $currentItemIndex = 0
  113.  
  114.    Write-Host "Start processing IP address collection..."
  115.    Write-Host ""
  116.    foreach ($ip in $sortedSet) {
  117.        $currentItemIndex +=1
  118.        Write-Host "[$currentItemIndex of $totalItemCount] IP address: $ip"
  119.  
  120.        $ruleNameInbound = "IP Block (Inbound) ($ip)"
  121.        $currentRules | Where-Object {
  122.            $_.DisplayName -eq $ruleNameInbound
  123.        } -ErrorAction SilentlyContinue | Remove-NetFirewallRule
  124.  
  125.        Write-Host "Adding firewall rule to block inbound traffic..." -ForegroundColor DarkGray
  126.        [CimInstance]$ruleInbound =
  127.            New-NetFirewallRule `
  128.                -DisplayName "$ruleNameInbound" `
  129.                -Description "This rule disables incoming traffic for address: $ip" `
  130.                -Group "$ruleGroupName" `
  131.                -Direction "Inbound" `
  132.                -Action "Block" `
  133.                -RemoteAddress "$ip" `
  134.                -Profile "Any" `
  135.                -Enabled "True" `
  136.                -LocalAddress "Any" `
  137.                -InterfaceType "Any"
  138.  
  139.        $ruleNameOutbound = "IP Block (Outbound) ($ip)"
  140.        $currentRules | Where-Object {
  141.            $_.DisplayName -eq $ruleNameOutbound
  142.        } -ErrorAction SilentlyContinue | Remove-NetFirewallRule
  143.  
  144.        Write-Host "Adding firewall rule to block outbound traffic..." -ForegroundColor DarkGray
  145.        [CimInstance]$ruleOutbound =
  146.            New-NetFirewallRule `
  147.                -DisplayName "$ruleNameOutbound" `
  148.                -Description "This rule disables outgoing traffic for address: $ip" `
  149.                -Group "$ruleGroupName" `
  150.                -Direction "Outbound" `
  151.                -Action "Block" `
  152.                -RemoteAddress "$ip" `
  153.                -Profile "Any" `
  154.                -Enabled "True" `
  155.                -LocalAddress "Any" `
  156.                -InterfaceType "Any"
  157.  
  158.        Write-Host ""
  159.    }
  160. }
  161.  
  162. <#
  163. ===========================================================================================
  164. |                                                                                         |
  165. |                                         Main                                            |
  166. |                                                                                         |
  167. ===========================================================================================
  168. #>
  169.  
  170. [System.Console]::Title = "Block IP addresses - by Elektro"
  171. [CultureInfo]::CurrentUICulture = "en-US"
  172.  
  173. try { Set-ExecutionPolicy -ExecutionPolicy "Unrestricted" -Scope "Process" } catch { }
  174.  
  175. Show-WelcomeScreen
  176. Confirm-Continue
  177. Add-FirewallRules -ipListFile $ipListFile -ipArray $ipArray
  178. Show-GoodbyeScreen
  179. Exit(0)



Notas:

 - Probado en Windows 10 (PowerShell 5.1.19041.1682). Debería funcionar igual en Windows 11.

EDITADO: Script actualizado a la versión 1.1. Al final he decidido utilizar el cmdlet New-NetFirewallRule a pesar de los inconvenientes, por que entiendo que así será más compatible y útil para más gente.

EDITADO: Script actualizado a la versión 1.2. Se ha mejorado bastante la velocidad de ejecución del código, optimizando la metodología de obtención de las reglas de firewall del equipo.

EDITADO: Script actualizado a la versión 1.3. Últimos ajustes y micro-optimizaciones aplicados ().



« Última modificación: 23 Septiembre 2024, 13:56 pm por Eleкtro » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines