xtables-addons: filtrer pakker efter lande

xtables-addons: filtrer pakker efter lande
Opgaven med at blokere trafik fra bestemte lande virker simpel, men første indtryk er ofte misvisende. I dag vil vi fortælle, hvordan dette kan implementeres.

Background

Google-søgninger om dette emne er skuffende: de fleste løsninger er for længst blevet "forældede", og nogle gange virker det, som om emnet er blevet lagt på hylden i årevis. Vi har "gennemsøgt" mange gamle indlæg og er klar til at dele en moderne version af vejledningen.

Vi anbefaler, at du læser artiklen helt igennem, før du udfører de angivne kommandoer.

Forberedelse af operativsystemet

Filtreringen vil blive konfigureret ved hjælp af et værktøj iptables, som kræver en udvidelse for at arbejde med GeoIP-data. En sådan udvidelse kan findes i xtables-addons. xtables-addons installerer udvidelser til iptables som selvstændige kernelmoduler, hvilket betyder, at du ikke behøver at genkompilere operativsystemets kernel.

På tidspunktet for skrivningen er den aktuelle version af xtables-addons – 3.9. Dog kan der i de standard repositories for Ubuntu 20.04 LTS kun findes 3.8, mens i repositories for Ubuntu 18.04 – 3.0. For at installere udvidelsen fra pakket manageren kan du bruge følgende kommando:

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

Vi bemærker, at der er små, men vigtige forskelle mellem version 3.9 og den nuværende tilstand af projektet, som vi vil tale om senere. For at bygge fra kildekoderne skal vi installere alle nødvendige pakker:

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

Vi kloner repository:

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

cd xtables-addons-xtables-addons

xtables-addons indeholder mange udvidelser, men vi er kun interesserede i xt_geoip. Hvis du ikke ønsker at bringe unødvendige udvidelser ind i systemet, kan de udelukkes fra bygningen. For at gøre dette skal filen mconfigredigeres. For alle ønskede moduler skal der sættes et y, og alle unødvendige skal markeres som n. Vi bygger:

./autogen.sh

./configure

make

Og installer med root-rettigheder:

make install

Under installationen af kernelmoduler kan der opstå en fejl af følgende type:

INSTALL /root/xtables-addons-xtables-addons/extensions/xt_geoip.ko
At main.c:160:
- SSL fejl:02001002:systemlibrary:fopen:Ingen sådan fil eller bibliotek: ../crypto/bio/bss_file.c:72
- SSL fejl:2006D080:BIO-rutiner:BIO_new_file:ingen sådan fil: ../crypto/bio/bss_file.c:79
sign-file: certs/signing_key.pem: Ingen sådan fil eller bibliotek

Denne situation opstår på grund af manglende muligheder for at signere kernelmoduler, da der ikke er noget at underskrive med. Du kan løse dette problem med et par kommandoer:

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

cat < x509.genkey

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

[ req_distinguished_name ]
CN = Moduler

[ 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 kompilerede kernelmodul er installeret, men systemet kan ikke genkende det. Lad os bede systemet om at oprette en afhængighedskort, der tager det nye modul i betragtning, og derefter indlæse det:

depmod -a

modprobe xt_geoip

Lad os sikre os, at xt_geoip er indlæst i systemet:

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

Lad os også sikre os, at udvidelsen er indlæst i iptables:

# cat /proc/net/ip_tables_matches 
geoip
icmp

Vi er tilfredse, og vi skal blot tilføje modulnavnet til /etc/modules, så modulet virker efter genstart af operativsystemet. Fra nu af forstår iptables geoip-kommandoer, men det mangler data for at fungere. Lad os begynde at indlæse geoip-databasen.

Hentning af GeoIP-database

Vi opretter en mappe, hvor oplysninger, der er forståelige for iptables-udvidelsen, vil blive gemt:

mkdir /usr/share/xt_geoip

I begyndelsen af artiklen nævnte vi, at der er forskelle mellem versionen fra kildekoden og versionen fra pakkeadministratoren. Den mest markante forskel er skiftet af databaseleverandøren og skriptet xt_geoip_dl, som downloader de aktuelle data.

Versionen fra pakkeadministratoren

Skriptet ligger på stien /usr/lib/xtables-addons, men ved forsøg på at køre det kan man se en ikke særlig informativ fejl:

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

Tidligere blev GeoLite-produktet, nu kendt som GeoLite Legacy, distribueret under licens Creative Commons ASA 4.0 af virksomheden MaxMind. Der er sket to store begivenheder med dette produkt, som har "brudt" kompatibiliteten med udvidelsen til iptables.

For det første, i januar 2018 at de kun havde to blokke tilbage /8. , meddelte de, at supporten for produktet ville blive ophørt, og den 2. januar 2019 blev alle links til download af den gamle version af databasen fjernet fra den officielle hjemmeside. Nye brugere opfordres til at bruge produktet GeoLite2 eller den betalte version GeoIP2.

For det andet, fra december 2019 at , meddelte MaxMind, at der ville ske betydelige ændringer i adgangen til deres databaser. For at overholde den californiske beskyttelseslov for forbrugerrettigheder besluttede MaxMind at "lukke" distributionen af GeoLite2 bag registrering.

Da vi ønsker at bruge deres produkt, vil vi registrere os på denne side.

xtables-addons: filtrer pakker efter lande
Efter registreringen vil du modtage en e-mail med en anmodning om at oprette en adgangskode. Nu hvor vi har oprettet en konto, skal vi lave en licensnøgle. I kontrolpanelet finder vi punktet Mine licensnøgler, og derefter klikker vi på knappen Generer ny licensnøgle.

Når vi opretter nøglen, stilles der kun ét spørgsmål: vil vi bruge denne nøgle i programmet GeoIP Update? Vi svarer negativt og klikker på knappen Bekræft. Nøglen vil blive vist i et pop-up vindue. Gem denne nøgle et sikkert sted, da du ikke vil kunne se hele nøglen efter at vinduet lukkes.

xtables-addons: filtrer pakker efter lande
Vi har mulighed for at downloade GeoLite2-databaser manuelt, men deres format er ikke kompatibelt med det format, som skriptet xt_geoip_build forventer. Her kommer skripterne GeoLite2xtables til hjælp. For at arbejde med skripterne installerer vi perl-modulet NetAddr::IP:

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

Dernæst kloner vi repositoriet med skripterne og gemmer den licensnøgle, vi tidligere har fået:

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

cd GeoLite2xtables

echo YOUR_LICENSE_KEY='123ertyui123' > geolite2.license

Vi kører skripterne:

# Скачиваем данные 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 pålægger en grænse på 2000 downloads om dagen, og ved et stort antal servere anbefales det at cache opdateringen på en proxy-server.

Vær opmærksom på, at outputfilen absolut skal hedde dbip-country-lite.csv. Desværre, 20_convert_geolite2 giver ikke en ideel fil. Skriptet xt_geoip_build forventer tre kolonner:

  • startadresserange;
  • slutadresserange;
  • land kode i iso-3166-alpha2.

Og outputfilen indeholder seks kolonner:

  • startadresserange (strengrepræsentation);
  • slutadresserange (strengrepræsentation);
  • startadresserange (numerisk repræsentation);
  • slutadresserange (numerisk repræsentation);
  • lande kode;
  • landets navn.

Denne uoverensstemmelse er kritisk og kan rettes på en af to måder:

  1. redigere 20_convert_geolite2;
  2. redigere xt_geoip_build.

I det første tilfælde reducerer vi printf til det ønskede format, og i det andet — ændrer vi tildelingen til variablen $cc og få en fungerende kommando. $row->[4]. Herefter kan vi udføre samlingen:

/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

Lad os bemærke, at forfatteren GeoLite2xtables ikke anser sine skripter for at være klar til produktion og anbefaler med at følge for developing original scripts xt_geoip_*. So let's move on to the setup from the source codes, where these scripts are already updated.

Version from source codes

When installing from source codes, the scripts xt_geoip_* are located in the directory /usr/local/libexec/xtables-addons. In this version of the script, a database is used IP to Country Lite. The license is the Creative Commons Attribution License, and from the available data, those essential three columns. We download and compile the database:

cd /usr/share/xt_geoip/

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

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

After these actions, iptables is ready for use.

Using geoip in iptables

Module xt_geoip adds just two keys:

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 inputted by its ISO3166 code.

Methods for creating rules for iptables remain largely unchanged. To use keys from additional modules, you must explicitly specify the module name with the key -m. For example, a rule to block incoming TCP connections on port 443 not from the USA on all interfaces:

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

Files created by xt_geoip_build are used only when creating rules but are not considered during filtering. Therefore, to properly update the geoip database, you must first update the iv*-files and then recreate all rules that use geoip in iptables.

Konklusion

Packet filtering based on country affiliation is a somewhat forgotten strategy. Despite this, software tools for such filtering are being developed, and perhaps soon a new version of xt_geoip with a new geoip data provider will appear in package managers, significantly simplifying life for system administrators.

xtables-addons: filtrer pakker efter lande

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, please.

Have you ever used country-based filtering?

  • 59,1%Yes13

  • 40,9%No9

22 users voted. 3 users abstained.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster