Oppgaven med å blokkere trafikk fra enkelte land virker enkel, men førsteinntrykket kan være villedende. I dag vil vi fortelle deg hvordan dette kan implementeres.
forhistorie
Resultatene av et Google-søk på dette emnet er skuffende: de fleste av løsningene har lenge vært "råtne", og noen ganger ser det ut til at dette emnet har blitt skrinlagt og glemt for alltid. Vi har finkjemmet mange gamle plater og er klare til å dele en moderne versjon av instruksjonene.
Vi anbefaler at du leser hele artikkelen før du utfører disse kommandoene.
Klargjøring av operativsystemet
Filtrering vil bli konfigurert ved hjelp av verktøyet iptables, som krever en utvidelse for å fungere med GeoIP-data. Denne utvidelsen finner du i
I skrivende stund er den gjeldende versjonen av xtables-addons 3.9. Imidlertid kan bare 20.04 finnes i standard Ubuntu 3.8 LTS-repositoriene, og 18.04 i Ubuntu 3.0-repositoriene. Du kan installere utvidelsen fra pakkebehandlingen med følgende kommando:
apt install xtables-addons-common libtext-csv-xs-perl
Merk at det er små, men viktige forskjeller mellom versjon 3.9 og den nåværende tilstanden til prosjektet, som vi vil diskutere senere. For å bygge fra kildekoden, installer 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
Klon depotet:
git clone https://git.code.sf.net/p/xtables-addons/xtables-addons xtables-addons-xtables-addons
cd xtables-addons-xtables-addons
xtables-addons inneholder mange utvidelser, men vi er kun interessert i xt_geoip. Hvis du ikke vil dra unødvendige utvidelser inn i systemet, kan du ekskludere dem fra bygget. For å gjøre dette må du redigere filen mconfig. For alle ønskede moduler, installer y, og merk alle unødvendige n. Vi samler inn:
./autogen.sh
./configure
make
Og installer med superbrukerrettigheter:
make install
Under installasjonen av kjernemoduler kan det oppstå en feil som ligner på følgende:
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
Denne situasjonen oppstår på grunn av umuligheten av å signere kjernemoduler, fordi ingenting å signere. Du kan løse dette problemet med et par kommandoer:
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 kompilerte kjernemodulen er installert, men systemet oppdager den ikke. La oss be systemet lage et avhengighetskart som tar hensyn til den nye modulen, og deretter laste den:
depmod -a
modprobe xt_geoip
La oss sørge for at xt_geoip er lastet inn i systemet:
# lsmod | grep xt_geoip
xt_geoip 16384 0
x_tables 40960 2 xt_geoip,ip_tables
Sørg i tillegg for at utvidelsen er lastet inn i iptables:
# cat /proc/net/ip_tables_matches
geoip
icmp
Vi er fornøyd med alt og det gjenstår bare å legge til modulnavnet / etc / modulerslik at modulen fungerer etter omstart av OS. Fra nå av forstår iptables geoip-kommandoer, men den har ikke nok data å jobbe med. La oss begynne å laste geoip-databasen.
Få GeoIP-databasen
Vi oppretter en katalog der informasjon som er forståelig for iptables-utvidelsen vil bli lagret:
mkdir /usr/share/xt_geoip
I begynnelsen av artikkelen nevnte vi at det er forskjeller mellom versjonen fra kildekoden og versjonen fra pakkebehandlingen. Den mest merkbare forskjellen er endringen i databaseleverandør og skript xt_geoip_dl, som laster ned de nyeste dataene.
Pakkebehandlingsversjon
Skriptet ligger i banen /usr/lib/xtables-addons, men når du prøver å kjøre det, vil du se en lite informativ feil:
# ./xt_geoip_dl
unzip: cannot find or open GeoLite2-Country-CSV.zip, GeoLite2-Country-CSV.zip.zip or GeoLite2-Country-CSV.zip.ZIP.
Tidligere ble GeoLite-produktet, nå kjent som GeoLite Legacy, distribuert under lisens, brukt som en database
For det første i januar 2018
For det andre, siden desember 2019 MaxMind
Siden vi ønsker å bruke deres produkt, vil vi registrere oss på denne siden.
Du vil da motta en e-post som ber deg angi et passord. Nå som vi har opprettet en konto, må vi opprette en lisensnøkkel. På din personlige konto finner vi varen Mine lisensnøkler, og klikk deretter på knappen Generer ny lisensnøkkel.
Når vi oppretter en nøkkel, blir vi bare stilt ett spørsmål: vil vi bruke denne nøkkelen i GeoIP Update-programmet? Vi svarer negativt og trykker på knappen Bekrefte. Nøkkelen vises i et popup-vindu. Lagre denne nøkkelen på et trygt sted, siden når du lukker popup-vinduet, vil du ikke lenger kunne se hele nøkkelen.
Vi har muligheten til å laste ned GeoLite2-databaser manuelt, men formatet deres er ikke kompatibelt med formatet som forventes av xt_geoip_build-skriptet. Det er her GeoLite2xtables-skriptene kommer til unnsetning. For å kjøre skript, installer 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
Deretter kloner vi depotet med skript og skriver den tidligere oppnådde lisensnøkkelen til en fil:
git clone https://github.com/mschmitt/GeoLite2xtables.git
cd GeoLite2xtables
echo YOUR_LICENSE_KEY=’123ertyui123' > geolite2.license
La oss kjøre skriptene:
# Скачиваем данные 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ålegger en grense på 2000 nedlastinger per dag og tilbyr, med et stort antall servere, å cache oppdateringen på en proxy-server.
Vær oppmerksom på at utdatafilen må kalles dbip-country-lite.csv... Dessverre, 20_convert_geolite2 produserer ikke en perfekt fil. Manus xt_geoip_build forventer tre kolonner:
- start av adresseområde;
- slutten av adresseområdet;
- landskode i iso-3166-alpha2.
Og utdatafilen inneholder seks kolonner:
- start av adresseområde (strengrepresentasjon);
- slutten av adresseområdet (strengrepresentasjon);
- start av adresseområde (numerisk representasjon);
- slutten av adresseområdet (numerisk representasjon);
- landskode;
- navnet på landet.
Dette avviket er kritisk og kan korrigeres på en av to måter:
- redigere 20_convert_geolite2;
- redigere xt_geoip_build.
I det første tilfellet reduserer vi
/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
Merk at forfatteren
Kildeversjon
Når du installerer fra kildekodeskript xt_geoip_* finnes i katalogen /usr/local/libexec/xtables-addons. Denne versjonen av skriptet bruker en database
cd /usr/share/xt_geoip/
/usr/local/libexec/xtables-addons/xt_geoip_dl
/usr/local/libexec/xtables-addons/xt_geoip_build
Etter disse trinnene er iptables klar til å fungere.
Bruker geoip i iptables
Modul xt_geoip legger bare til to nøkler:
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.
Metodene for å lage regler for iptables forblir generelt uendret. For å bruke nøkler fra tilleggsmoduler, må du eksplisitt spesifisere navnet på modulen med -m-bryteren. For eksempel en regel for å blokkere innkommende TCP-tilkoblinger på port 443 ikke fra USA på alle grensesnitt:
iptables -I INPUT ! -i lo -p tcp --dport 443 -m geoip ! --src-cc US -j DROP
Filer opprettet av xt_geoip_build brukes kun ved opprettelse av regler, men tas ikke i betraktning ved filtrering. For å oppdatere geoip-databasen riktig, må du derfor først oppdatere iv*-filene, og deretter gjenskape alle reglene som bruker geoip i iptables.
Konklusjon
Filtrering av pakker basert på land er en strategi som er litt glemt av tiden. Til tross for dette utvikles programvareverktøy for slik filtrering, og kanskje snart vil en ny versjon av xt_geoip med en ny geoip-dataleverandør dukke opp i pakkeadministratorer, noe som vil forenkle livet til systemadministratorer.
Kun registrerte brukere kan delta i undersøkelsen.
Har du noen gang brukt filtrering etter land?
-
59,1%Ja 13
-
40,9%No9
22 brukere stemte. 3 brukere avsto.
Kilde: www.habr.com