Kuinka estää IP-osoitteet palomuurissani iptablesilla ja nftable-tiedostoilla Linuxissa

Kun palvelimemme on alttiina Internetille, perussuositus on määrittää palvelimesi palomuuri sallia vain liikenne, jonka haluamme sallia, ja estää muu liikenne. Usein olemme joutuneet raakojen joukkojen hyökkäysten tai palvelunestohyökkäysten uhreiksi muista maista kuin Espanjasta. Suurimmassa osassa tapauksia on suositeltavaa sallia vain sen maan IP-osoitteet, jossa olet tai yrityksesi, ja kieltää oletusarvoisesti kaikki muu liikenne, jota meillä ei ole sallitussa luettelossa. Tänään opetamme tässä artikkelissa lataamaan tietyn maan kaikki IP-alueet estämään sen milloin tahansa, tai sallimaan yhden niistä aina käyttämällä IPv4: ää, koska sen käyttö on enemmistöä, jos aiot käyttää IPv6: ta sinun on mukautettava käsikirjoitus.

Palomuurin käytännöt: sallivat tai rajoittavat

Palomuureilla on pääasiassa kaksi käytäntöä, salliva käytäntö sallii kaiken liikenteen paitsi mitä olemme nimenomaisesti kieltäneet. Rajoittavassa käytännössä sallimme vain määrittelemämme liikenteen. Turvallisuuden vuoksi on aina suositeltavaa, että Internet WAN -järjestelmässä on rajoittava käytäntö, jotta vältetään se, että huonosti asetettu sääntö voi aiheuttaa liikennettä, jota emme halua tulla verkkoomme, ja lisäksi on tehokkaampaa (vähän) sääntöjä sallia tietty liikenne ja kieltää loput irtotavarana kuin päinvastoin.

Estä palomuurini maa-IP-osoitteet iptablesilla ja nftable-tiedostoilla Linuxissa

Palomuurin erittäin hyvä käytäntö olisi sallia vain yksi tai useampi maa ja kieltää muut maat oletuksena. Siksi alla esitettävää komentosarjaa voidaan helposti muokata sallimaan vain ladatut IP-osoitteet tai aliverkot ja estää myöhemmin muut IP-osoitteet käytännön mukaan.

Mistä saan eri maiden IP-osoitteet ja alueet?

In IP Kielto löydät kaikki kullekin maalle kuuluvat IPv4-osoitelohkot, tällä tavoin voimme saada kaikki IP-osoitealueet CIDR-muodossa kaikista maailman maista, meillä on mahdollisuus nähdä Espanjan IP-alueet, Kiina, Venäjä ja monet muut. Mitä suurempi maa, sitä enemmän IPv4-osoitealueita meillä on, joten meidän on sallittava tai evättävä pääsy näihin verkkoihin, jotta ne voidaan myöhemmin kieltää tai sallia. Sisään tämä toinen linkki meillä on käytettävissä kunkin maan IPv6-osoitelohkot.

Erittäin tärkeä yksityiskohta on, että IPDeny päivittää koko IP-osoitetietokannan hyvin usein, sekä IPv4: n että IPv6: n, estääkseen meitä estämästä IP-osoitteita tai alueita maasta, joka on tosiasiassa toisessa. Tätä verkkosivua päivitetään melkein päivittäin, kun IPv4- ja IPv6-osoitelohkot muuttuvat tai lisäävät.

IPptablettien määritys ipsetin avulla maiden estämiseksi

iptables on Linux palomuuri par excellence, vaikka on joitain jakeluita, jotka tekevät hyppyn nftable-tiedostoihin, mikä on iptables-kehitys, paljon nopeammin, tehokkaammin ja helpommin konfiguroitavissa, mutta tällä hetkellä käytämme edelleen iptables-syntaksia, vaikka alla käytämme nftable-tiedostoja , kuten Debian-käyttöjärjestelmän uusimmissa versioissa ja monissa muissa. Jos käytät iptablesia, on erittäin suositeltavaa käyttää ipset-laajennusta, jonka avulla voimme estää tai sallia miljoonia IP-osoitteita, mutta tehokkaammin kuin jos teemme sen suoraan IPtable-sovellusten kanssa. Koko maan salliminen tai estäminen on erittäin suositeltavaa tehdä se ipsetin kautta, koska se on selvästi tehokkaampi kuin iptables.

Jotta voisit käyttää ipsetiä iptablesin kanssa, sinun on asennettava se, koska sitä ei ole asennettu oletuksena, voit asentaa sen seuraavasti:

sudo apt install ipset

Asennuksen jälkeen voimme alkaa käyttää sitä.

Seuraava ohjelmoima komentosarja koostuu maan tai useamman estämisestä, lisäämällä kaikki sen IPdenylta ladatut aliverkot ja sisällyttämällä kaikki aliverkot ipsetiin, jotta sille voidaan myöhemmin soittaa ja estää se iptablesissa. Tällä tavalla iptables on paljon tehokkaampi kuin jos teet sen ilman ipset-laajennusta.

#!/bin/bash
# El objetivo de este script es BLOQUEAR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos BLOQUEAR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a iptables (cortafuegos), ipset (extension de IPTABLESables), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que iptables no pueda interpretar ###
IPTABLES=/sbin/iptables
IPSET=/sbin/ipset
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/iptables-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPSET flush paisbloqueado
$IPSET destroy paisbloqueado
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que IPTABLES interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el IPset nuevo para bloquear el pais
$IPSET create paisbloqueado hash:net
for ipbloqueo in $FILTROIPS
do
$IPSET add paisbloqueado $ipbloqueo
done
done
#Denegamos el tráfico del ipset creado.
$IPTABLES -I INPUT -m set --match-set paisbloqueado src -j DROP
#Permitimos todo el resto del trafico. CUIDADO CON ESTO
$IPTABLES -A INPUT -j ACCEPT
exit 0

Nyt voimme nähdä iptablesin tilan asettamalla seuraavan, ja näemme, että se käyttää määritettyä ipsetiä:

iptables -L

Jos haluat nähdä ipsetin tilan, asetamme seuraavan:

ipset list

Aina kun haluamme estää uuden maan, joudut suorittamaan komentosarjan uudelleen ja automaattisesti kaikki ipsetin sisältö poistetaan ja kaikki uudet aliverkot lisätään tyhjästä. Tämä on suositeltavin, koska eri maiden erilaisia ​​IP-osoitteiden tietokantoja ja alueita päivitetään jatkuvasti. Meidän on huomattava, että Kiinan kaltaisissa maissa on paljon IP-osoitelohkoja, joten kaikkien sääntöjen soveltaminen palomuuriin kestää useita minuutteja, jos yritämme vain "mainoksella", se on melkein välitöntä, koska meillä on hyvin vähän.

Jos Internet-palvelumme toimii vain Espanjassa, tämän skriptin ansiosta voimme kieltää kaikki muut maat, mutta meidän on pidettävä mielessä, että jos espanjalainen käyttäjä käyttää välityspalvelinta tai VPN toisesta maasta, emme salli pääsyä.

IPtablettien määritys ipsetillä, jotta Espanja voi estää ja loput estää

Tässä komentosarjassa teemme päinvastoin kuin edellinen, mitä teemme, on ladata Espanjan IP-osoitteiden tietokanta, lisäämme se uuteen luotuun ipsetiin ja sallimme pääsyn. Oletuksena se estää kaiken muun liikenteen muista maista. Jos yrityksesi on Espanjassa ja haluat heidän vain muodostavan yhteyden Espanjaan, tämä on paras ja tehokkain asia, jonka voit tehdä, koska sallit vain yhden maan ja et estä nimenomaisesti muuta maailmaa.

#!/bin/bash
# El objetivo de este script es PERMITIR todo el tráfico del pais que nosotros definamos.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos PERMITIR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a iptables (cortafuegos), ipset (extension de IPTABLESables), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que iptables no pueda interpretar ###
IPTABLES=/sbin/iptables
IPSET=/sbin/ipset
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/iptables-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPSET flush paispermitido
$IPSET destroy paispermitido
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que IPTABLES interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el IPset nuevo para bloquear el pais
$IPSET create paispermitido hash:net
for ippermitir in $FILTROIPS
do
$IPSET add paispermitido $ippermitir
done
done
#Permitimos el tráfico del ipset creado.
$IPTABLES -I INPUT -m set --match-set paispermitido src -j ACCEPT
#DENEGAMOS todo el resto del trafico.
$IPTABLES -A INPUT -j DROP
exit 0

Nyt voimme nähdä iptablesin tilan asettamalla seuraavan, ja näemme, että se käyttää määritettyä ipsetiä:

iptables -L

Jos haluat nähdä ipsetin tilan, asetamme seuraavan:

ipset list

Kuten olet nähnyt, on todella helppoa estää tai sallia maa, joka käyttää ipsettiä iptablesista, ja lisäksi se on paljon tehokkaampaa kuin tekemällä se suoraan iptablesin kanssa, joten suosittelemme, että käytät ipsetä tällaisiin toimintoihin .

Nftables-kokoonpano estää maat

nftables on uusi Linux-palomuuri, parempi, nopeampi ja intuitiivisempi kuin suositut iptables, joita olemme aina käyttäneet. nftables on jo asennettu useimpiin Linux-jakeluihin, vaikka käytämme iptables-syntaksia. Jos käytät uusimpia Debian-versioita, käytät jo nftable-tiedostoja tietämättä sitä, mutta emme voi käyttää itse nftables-syntaksia.

Jotta voisimme käyttää nftable-tiedostoja 100%, meidän on asennettava se suoraan arkistoista suorittamalla seuraava komento:

sudo apt install nftables

Asennuksen jälkeen voimme aloittaa nftable-asetusten määrittämisen “nft” -komennolla. Syntaksi eroaa radikaalisti iptablesista, joten jos et ole käyttänyt sitä, uuden syntaksin mukauttaminen kestää jonkin aikaa.

Seuraava ohjelmoima komentosarja koostuu maan tai useamman estämisestä, lisäämällä kaikki sen IPdenylta ladatut aliverkot ja sisällyttämällä kaikki aliverkot nftable-tiedostoihin estääkseen sen palomuurissa. Meidän on muistettava, että nftables on paljon tehokkaampi kuin iptables, ja se toimii todella hyvin.

#!/bin/bash
# El objetivo de este script es BLOQUEAR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos BLOQUEAR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a nftables (cortafuegos), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que NFT no pueda interpretar ###
NFT=/sbin/nft
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/NFT-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$NFT flush set filter ips_baneadas
$NFT flush chain ip filter INPUT
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que NFT interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el set de ips_baneadas de tipo IPv4.
$NFT add set ip filter ips_baneadas {type ipv4_addr; flags interval;}
#Metemos en el set todos los rangos de IP.
for ipbloqueo in $FILTROIPS
do
$NFT add element ip filter ips_baneadas { $ipbloqueo }
done
done
#Bloqueamos todo lo que coincida con el SET anteriormente creado.
$NFT add rule ip filter INPUT ip saddr @ips_baneadas counter drop
$NFT list ruleset > /etc/nftables.conf
systemctl restart nftables.service
exit 0

Nyt voimme nähdä nftable-tilan asettamalla seuraavan, ja näemme, että se käyttää määritettyä ipset:

nft list ruleset

Määritetään nftable-sovelluksia maiden sallimiseksi

Seuraava ohjelmoima komentosarja koostuu maan sallimisesta, kaikkien sen IPdenylta ladattujen aliverkkojen lisäämisestä ja kaikkien aliverkkojen sisällyttämisestä nft-taulukoihin salliakseen sen palomuurissa, loput liikenteestä estetään. Meidän on muistettava, että nftables on paljon tehokkaampi kuin iptables, ja se toimii todella hyvin.

#!/bin/bash
# El objetivo de este script es PERMITIR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos PERMITIR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a nftables (cortafuegos), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que NFT no pueda interpretar ###
NFT=/sbin/nft
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/NFT-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$NFT flush set filter ips_permitidas
$NFT flush chain ip filter INPUT
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que NFT interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el set de ips_permitidas de tipo IPv4.
$NFT add set ip filter ips_permitidas {type ipv4_addr; flags interval;}
#Metemos en el set todos los rangos de IP.
for ippermitida in $FILTROIPS
do
$NFT add element ip filter ips_permitidas { $ippermitida }
done
done
#Permitimos todo lo que coincida con el SET anteriormente creado.
$NFT add rule ip filter INPUT ip saddr @ips_permitidas counter accept
#Bloqueamos todo lo demas en cadena base
$NFT add chain ip filter INPUT '{ policy drop; }'
#Guardamos y reiniciamos servicio
$NFT list ruleset > /etc/nftables.conf
systemctl restart nftables.service
exit 0

Nyt voimme nähdä nftable-tilan asettamalla seuraavan, ja näemme, että se käyttää määritettyä ipset:

nft list ruleset

Toistaiseksi olemme saaneet tämän oppaan iptablesista ja ipsetistä estääksesi tai sallimasta IP-osoitteita eri maista, olemme myös nähneet, miten se tehdään nftable-sovelluksilla, uudella Linux-palomuurilla, jossa on uusi syntaksi, joka on paljon intuitiivisempi, mutta se maksaa meille jotkut työt tottuvat siihen, jos olemme aina työskennelleet iptablesin kanssa.