xtables-addons: filtrera paket efter land

xtables-addons: filtrera paket efter land
Uppgiften att blockera trafik från vissa länder verkar enkel, men första intryck kan vara vilseledande. Idag kommer vi att berätta hur detta kan implementeras.

förhistoria

Resultaten av en Google-sökning om detta ämne är nedslående: de flesta av lösningarna har länge varit "ruttna" och ibland verkar det som att det här ämnet har lagts på hyllan och glömts bort för alltid. Vi har gått igenom många gamla skivor och är redo att dela med oss ​​av en modern version av instruktionerna.

Vi rekommenderar att du läser hela artikeln innan du utför dessa kommandon.

Förberedelse av operativsystem

Filtrering kommer att konfigureras med hjälp av verktyget iptables, som kräver en förlängning för att fungera med GeoIP-data. Denna tillägg finns i xtables-tillägg. xtables-addons installerar tillägg för iptables som oberoende kärnmoduler, så det finns inget behov av att kompilera om OS-kärnan.

I skrivande stund är den nuvarande versionen av xtables-addons 3.9. Däremot kan endast 20.04 hittas i standardarkiven för Ubuntu 3.8 LTS och 18.04 i Ubuntu 3.0-förråden. Du kan installera tillägget från pakethanteraren med följande kommando:

apt install xtables-addons-common libtext-csv-xs-perl

Observera att det finns små men viktiga skillnader mellan version 3.9 och projektets nuvarande tillstånd, vilket vi kommer att diskutera senare. För att bygga från källkod, installera alla nödvändiga paket:

apt install git build-essential autoconf make libtool iptables-dev libxtables-dev pkg-config libnet-cidr-lite-perl libtext-csv-xs-perl

Klona förvaret:

git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons

cd xtables-addons-xtables-addons

xtables-addons innehåller många tillägg, men vi är bara intresserade av xt_geoip. Om du inte vill dra in onödiga tillägg i systemet kan du utesluta dem från bygget. För att göra detta måste du redigera filen mconfig. För alla önskade moduler, installera y, och markera alla onödiga n. Vi samlar in:

./autogen.sh

./configure

make

Och installera med superanvändarrättigheter:

make install

Under installationen av kärnmoduler kan ett fel som liknar följande inträffa:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL error:02001002:system library:fopen:No such file or directory: ../crypto/bio/bss_file.c:72
- SSL error:2006D080:BIO routines:BIO_new_file:no such file: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: No such file or directory

Denna situation uppstår på grund av omöjligheten att signera kärnmoduler, eftersom inget att skriva på. Du kan lösa det här problemet med ett par kommandon:

cd /lib/modules/(uname -r)/build/certs

cat <<EOF > x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Modules

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem

Den kompilerade kärnmodulen är installerad, men systemet upptäcker den inte. Låt oss be systemet att skapa en beroendekarta med hänsyn till den nya modulen och sedan ladda den:

depmod -a

modprobe xt_geoip

Låt oss se till att xt_geoip laddas in i systemet:

# lsmod | grep xt_geoip
xt_geoip               16384  0
x_tables               40960  2 xt_geoip,ip_tables

Se dessutom till att tillägget är inläst i iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Vi är nöjda med allt och allt som återstår är att lägga till modulnamnet / etc / modulerså att modulen fungerar efter omstart av operativsystemet. Från och med nu förstår iptables geoip-kommandon, men det har inte tillräckligt med data att arbeta med. Låt oss börja ladda geoip-databasen.

Hämta GeoIP-databasen

Vi skapar en katalog där information som är förståelig för iptables-tillägget kommer att lagras:

mkdir /usr/share/xt_geoip

I början av artikeln nämnde vi att det finns skillnader mellan versionen från källkoden och versionen från pakethanteraren. Den mest märkbara skillnaden är förändringen i databasleverantör och skript xt_geoip_dl, som laddar ner den senaste informationen.

Pakethanterarens version

Skriptet finns i sökvägen /usr/lib/xtables-addons, men när du försöker köra det kommer du att se ett inte särskilt informativt fel:

# ./xt_geoip_dl 
unzip:  cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.

Tidigare användes GeoLite-produkten, nu känd som GeoLite Legacy, distribuerad under licens, som en databas Creative Commons ASA 4.0 företaget MaxMind. Två händelser hände med den här produkten på en gång som "bröt" kompatibiliteten med iptables-tillägget.

För det första i januari 2018 meddelat om uppsägning av support för produkten, och den 2019 januari 2 togs alla länkar till nedladdning av den gamla versionen av databasen bort från den officiella webbplatsen. Nya användare rekommenderas att använda produkten GeoLite2 eller dess betalda version GeoIPXNUMX.

För det andra, sedan december 2019 MaxMind han uppgav om en betydande förändring av tillgången till deras databaser. För att följa California Consumer Privacy Act beslutade MaxMind att "täcka" distributionen av GeoLite2 med registrering.

Eftersom vi vill använda deras produkt kommer vi att registrera oss på denna sida.

xtables-addons: filtrera paket efter land
Du kommer då att få ett e-postmeddelande som ber dig ange ett lösenord. Nu när vi har skapat ett konto måste vi skapa en licensnyckel. På ditt personliga konto hittar vi varan Mina licensnycklar, och klicka sedan på knappen Skapa ny licensnyckel.

När vi skapar en nyckel får vi bara en fråga: kommer vi att använda denna nyckel i GeoIP Update-programmet? Vi svarar negativt och trycker på knappen Bekräfta. Nyckeln kommer att visas i ett popup-fönster. Spara den här nyckeln på ett säkert ställe, eftersom när du stänger popup-fönstret kommer du inte längre att kunna se hela nyckeln.

xtables-addons: filtrera paket efter land
Vi har möjlighet att ladda ner GeoLite2-databaser manuellt, men deras format är inte kompatibelt med det format som förväntas av xt_geoip_build-skriptet. Det är här GeoLite2xtables-skripten kommer till undsättning. För att köra skript, installera NetAddr::IP perl-modulen:

wget https://cpan.metacpan.org/authors/id/M/MI/MIKER/NetAddr-IP-4.079.tar.gz

tar xvf NetAddr-IP-4.079.tar.gz

cd NetAddr-IP-4.079

perl Makefile.PL

make

make install

Därefter klonar vi förvaret med skript och skriver den tidigare erhållna licensnyckeln till en fil:

git clone https://github.com/mschmitt/GeoLite2xtables.git

cd GeoLite2xtables

echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license

Låt oss köra skripten:

# Скачиваем данные GeoLite2
./00_download_geolite2
# Скачиваем информацию о странах (для соответствия коду)
./10_download_countryinfo
# Конвертируем GeoLite2 базу в формат GeoLite Legacy 
cat /tmp/GeoLite2-Country-Blocks-IPv{4,6}.csv |
./20_convert_geolite2 /tmp/CountryInfo.txt > /usr/share/xt_geoip/dbip-country-lite.csv

MaxMind sätter en gräns på 2000 nedladdningar per dag och erbjuder med ett stort antal servrar att cachelagra uppdateringen på en proxyserver.

Observera att utdatafilen måste anropas dbip-country-lite.csv... Tyvärr, 20_convert_geolite2 producerar inte en perfekt fil. Manus xt_geoip_build förväntar sig tre kolumner:

  • start av adressintervall;
  • slutet av adressintervallet;
  • landskod i iso-3166-alpha2.

Och utdatafilen innehåller sex kolumner:

  • start av adressintervall (strängrepresentation);
  • slutet av adressintervallet (strängrepresentation);
  • start av adressintervall (numerisk representation);
  • slutet av adressintervallet (numerisk representation);
  • landets kod;
  • landets namn.

Denna avvikelse är kritisk och kan korrigeras på ett av två sätt:

  1. redigera 20_convert_geolite2;
  2. redigera xt_geoip_build.

I det första fallet minskar vi printf till önskat format, och i det andra - ändrar vi tilldelningen till variabeln $cc$row->[4]. Efter detta kan du bygga:

/usr/lib/xtables-addons/xt_geoip_build -S /usr/share/xt_geoip/ -D /usr/share/xt_geoip

. . .
 2239 IPv4 ranges for ZA
  348 IPv6 ranges for ZA
   56 IPv4 ranges for ZM
   12 IPv6 ranges for ZM
   56 IPv4 ranges for ZW
   15 IPv6 ranges for ZW

Observera att författaren GeoLite2xtables anser inte att dess manus är färdiga för produktion och erbjuder Spår för utveckling av original xt_geoip_*-skript. Låt oss därför gå vidare till sammansättningen från källkoder, där dessa skript redan har uppdaterats.

Källversion

När du installerar från källkodsskript xt_geoip_* finns i katalogen /usr/local/libexec/xtables-addons. Denna version av skriptet använder en databas IP till Country Lite. Licensen är Creative Commons Attribution License, och från tillgängliga data finns de tre mycket nödvändiga kolumnerna. Ladda ner och montera databasen:

cd /usr/share/xt_geoip/

/usr/local/libexec/xtables-addons/xt_geoip_dl

/usr/local/libexec/xtables-addons/xt_geoip_build

Efter dessa steg är iptables redo att fungera.

Använder geoip i iptables

Modul xt_geoip lägger bara till två nycklar:

geoip match options:
[!] --src-cc, --source-country country[,country...]
	Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
	Match packet going to (one of) the specified country(ies)

NOTE: The country is inputed by its ISO3166 code.

Metoderna för att skapa regler för iptables är i allmänhet oförändrade. För att använda nycklar från ytterligare moduler måste du uttryckligen ange namnet på modulen med -m-omkopplaren. Till exempel, en regel för att blockera inkommande TCP-anslutningar på port 443 inte från USA på alla gränssnitt:

iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP

Filer skapade av xt_geoip_build används endast när regler skapas, men beaktas inte vid filtrering. För att uppdatera geoip-databasen korrekt måste du alltså först uppdatera iv*-filerna och sedan återskapa alla regler som använder geoip i iptables.

Slutsats

Att filtrera paket baserat på länder är en strategi som har glömts bort av tiden. Trots detta utvecklas mjukvaruverktyg för sådan filtrering och kanske snart kommer en ny version av xt_geoip med en ny geoip-dataleverantör att dyka upp i pakethanterare, vilket avsevärt kommer att förenkla livet för systemadministratörer.

xtables-addons: filtrera paket efter land

Endast registrerade användare kan delta i undersökningen. Logga in, Snälla du.

Har du någonsin använt filtrering efter land?

  • 59,1%Ja 13

  • 40,9%Nr 9

22 användare röstade. 3 användare avstod från att rösta.

Källa: will.com

Lägg en kommentar