country-ip-blocks
SSHHeatmap
country-ip-blocks | SSHHeatmap | |
---|---|---|
7 | 1 | |
640 | 264 | |
- | - | |
9.9 | 4.6 | |
6 days ago | 5 months ago | |
Python | ||
Creative Commons Zero v1.0 Universal | MIT License |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
country-ip-blocks
- CIDR country-level IP data, straight from the Regional Internet Registries
-
How often do the IP addresses issued to a country change?
Maybe looking at the commit logs/history of https://github.com/herrbischoff/country-ip-blocks gives you some idea about change frequency.
-
Who's Attacking My Server?
Looks not-so reliable. Either fetches a list of blocks from https://github.com/herrbischoff/country-ip-blocks which is a random GitHub repository that collects "straight from the Regional Internet Registries" without any stating any sources nor method for gathering it (which also, I'm assuming, is self-reported data from those registries), or it fetches it from https://www.ipdeny.com/ which currently runs with an expired TLS certificate, which on top of everything, nft-blackhole ignores any issues with certificates anyways, leaving it wide open to MITM attacks (https://github.com/tomasz-c/nft-blackhole/blob/8a656ac0a803a...)
I wouldn't run that if I'd want something to reliably block someone from a specific country.
- Ukraine government websites down as it is bombarded by cyberattacks amid Russian invasion.
-
Create a script to block countries on an Azure NSG
#requires -Version 3.0 -Modules Az.Network function Get-OdCountryIpAddressCidrList { [CmdletBinding( DefaultParameterSetName = 'code' )] param ( # ISO 3166 country [Parameter( ParameterSetName = 'country' )] [string[]] $CountryName, # ISO 3166 2 character code [Parameter( ParameterSetName = 'code' )] [string[]] $CountryAlpha2Code, # IP protocol [Parameter( Mandatory )] [ValidateSet('Ipv4', 'Ipv6')] [string] $Protocol ) begin { $ErrorActionPreference = 'stop' try { $CountryCodeUrl = 'https://restcountries.eu/rest/v2/all' $Iso3166CountryList = Invoke-RestMethod -Uri $CountryCodeUrl -Verbose:$false -ErrorAction Stop $date = Get-Date -Format 's' $CountryList = [System.Collections.Generic.List[psobject]]::new() } # NOTE: When you use a SPECIFIC catch block, exceptions thrown by -ErrorAction Stop MAY LACK # some InvocationInfo details such as ScriptLineNumber. # REMEDY: If that affects you, remove the SPECIFIC exception type [System.ArgumentException] in the code below # and use ONE generic catch block instead. Such a catch block then handles ALL error types, so you would need to # add the logic to handle different error types differently by yourself. catch [System.ArgumentException] { # get error record [Management.Automation.ErrorRecord]$e = $_ # retrieve information about runtime error $info = [PSCustomObject]@{ Exception = $e.Exception.Message Reason = $e.CategoryInfo.Reason Target = $e.CategoryInfo.TargetName Script = $e.InvocationInfo.ScriptName Line = $e.InvocationInfo.ScriptLineNumber Column = $e.InvocationInfo.OffsetInLine } # output information. Post-process collected info, and log info (optional) $info } catch { $PSCmdlet.WriteError( $PSItem ) } } process { $ErrorActionPreference = 'stop' try { if ($PSCmdlet.ParameterSetName -eq 'country') { foreach ($name in $CountryName) { $country = $Iso3166CountryList | Where-Object -Property name -EQ -Value $name if ($country) { $CountryList.Add($country) } else { $CountryNotFoundMessage = "Cound not find ISO 3166-2 country '$name'. ISO 3166-2 list retrieved from $CountryCodeUrl on $date." Write-Error -Message $CountryNotFoundMessage } } } else { foreach ($code in $CountryAlpha2Code) { $country = $Iso3166CountryList | Where-Object -Property alpha2Code -EQ -Value $code if ($country) { $CountryList.Add($country) } else { $CodeNotFoundMessage = "Cound not find ISO 3166-2 country code for '$code' in list. ISO 3166-2 list retrieved from $CountryCodeUrl on $date." Write-Error -Message $CodeNotFoundMessage } } } } catch { $PSCmdlet.WriteError( $PSItem ) } } end { $ErrorActionPreference = 'stop' try { $headers = @{ Accept = 'application/vnd.github.v3.raw' } $IpList = foreach ($entry in $CountryList) { $IsoCode = $entry.alpha2Code $IsoName = $entry.Name $path = '{0}/{1}.cidr' -f $Protocol, $IsoCode [uri]$uri = 'https://api.github.com/repos/herrbischoff/country-ip-blocks/contents/{0}' -f $path.ToLower() Write-Verbose -Message "Retrieving country IPs for $IsoName ($IsoCode)" [PSCustomObject][ordered]@{ Country = $IsoName Code = $IsoCode TopLevelDomain = $entry.topLevelDomain CidrList = ((Invoke-RestMethod -Method Get -Uri $uri -Headers $headers -Verbose:$false).Split([System.Environment]::NewLine, [System.StringSplitOptions]::RemoveEmptyEntries) -split "`n").Trim() CidrListSource = 'https://github.com/herrbischoff/country-ip-blocks/blob/master/{0}' -f $path.ToLower() } } $IpList | Sort-Object -Property Code } catch { $PSCmdlet.WriteError( $PSItem ) } } } $CountryCodeUrl = 'https://restcountries.eu/rest/v2/all' $Iso3166CountryList = Invoke-RestMethod -Uri $CountryCodeUrl -Verbose:$false $nsg = Get-AzNetworkSecurityGroup -Name 'LOL' $port = 8081 ForEach ($country in $Iso3166CountryList) { $CountryName = $country.name If ($CountryName -eq "New Zealand") { $CN = $country.alpha2Code $IPRanges = Get-OdCountryIpAddressCidrList -Protocol Ipv4 -CountryAlpha2Code $CN $IPRangeCidr = $IPRanges.CidrList ForEach ($range in $IPRangeCidr) { IF ($count -eq $null) { $count = 1 } $char = ([char](96 + $count)) $count++ IF ($priority -eq $null) { $priority = 100 } $priority++ $nsg | Add-AzNetworkSecurityRuleConfig -Name "Allow_$($CN)_$($char)" -Description "Allows access from $Countryname" -Access Allow ` -Protocol * -Direction Inbound -Priority $priority -SourceAddressPrefix "$range" -SourcePortRange * ` -DestinationAddressPrefix * -DestinationPortRange * $nsg | Set-AzNetworkSecurityGroup }} }
SSHHeatmap
-
Who's Attacking My Server?
I once made a very similar visualization to see where people are trying to attack my servers from by adapting (e.g. use local geoip database file instead of ipinfo service) the Python script from [1], which uses folium to generate an interactive (standalone HTML file) heatmap of IP address locations.
[1] https://github.com/meesaltena/SSHHeatmap
[2] https://github.com/python-visualization/folium
What are some alternatives?
crowdsec - CrowdSec - the open-source and participative security solution offering crowdsourced protection against malicious IPs and access to the most advanced real-world CTI.
fwknop - Single Packet Authorization > Port Knocking
tailscale - The easiest, most secure way to use WireGuard and 2FA.
nft-blackhole - Script / daemon to blocking IP in nftables by country and black lists
cc0-textures - Torrent downloads of free, CC0 licensed, PBR textures
IP2Location-PHP-Module - This module is a PHP module that enables the user to find the country, region, city, coordinates, zip code, ISP, domain name, timezone, connection speed, IDD code, area code, weather station code, weather station name, mobile, usage types, address type, IAB category, etc that any IP address or host name originates from.
masscan - TCP port scanner, spews SYN packets asynchronously, scanning entire Internet in under 5 minutes.
Config-Collections-for-Nginx - A Collection of Functioning Nginx Configurations [Moved to: https://github.com/Organizr/Config-Collections-for-Nginx]