Blokiranje prometa po zemljama na Linuxu: GeoIP, nftables | INTROSERV
EUR
european

EUR

usa

USD

Croatia Hr
Ex. VAT Ex. VAT 0%

Kako blokirati promet po zemljama na Linux vatrozidu pomoću GeoIP pravila

Razina: Profesionalna
Procijenjeno vrijeme: ~35 minuta
Cilj: Konfigurirati GeoIP pravila vatrozida na Linux poslužitelju za ograničavanje pristupa po zemljama pomoću iptables s modulom xtables-geoip ili nftables s IP skupovima (IP sets) te automatizirati ažuriranja kako bi popisi ostali aktualni.

Uvod

Ako su vaše usluge namijenjene određenoj regiji, nema razloga prihvaćati promet iz ostatka svijeta. Geoblokiranje na Linux vatrozidu omogućuje odbacivanje paketa prema zemlji podrijetla prije nego što stignu do vaše aplikacije – čime se smanjuje šum napada grubom silom (brute-force) i površina napada. U ovom ćete vodiču blokirati promet po zemljama na Linux vatrozidu pomoću GeoIP pravila: najprije s iptables i xtables-addons, zatim s nftables i IP skupovima temeljenima na CIDR-u, uključujući automatska ažuriranja baze podataka kako bi vaše blokiranje IP adresa po zemljama ostalo točno.

Preduvjeti

Prije početka provjerite jesu li ispunjeni sljedeći uvjeti:

  • Operacijski sustav: Ubuntu 22.04/24.04 LTS, Debian 12/13, AlmaLinux/RHEL 9/10
  • Pristup: sudo ili root pristup poslužitelju
  • Vatrozid: iptables 1.8+ s xtables-addons ili nftables 1.0+
  • Potrebni paketi: curl, iptables, linux-headers-$(uname -r) (Debian/Ubuntu); omogućen EPEL repozitorij (RHEL/AlmaLinux 9)

Info

Na Debianu 12+, Ubuntuu 22.04+ i RHEL/AlmaLinuxu 9+ naredba iptables je omotač oko nftables pozadinskog sustava (iptables-nft). Podudaranje -m geoip ispravno radi s tim pozadinskim sustavom.

  • Mreža: jasno razumijevanje iz kojih zemalja vaše usluge moraju prihvaćati promet
  • Potrebno znanje: sigurno korištenje Linux naredbenog retka, osnovni pojmovi o vatrozidima i uređivanje datoteka
  • Pričuvni pristup: radna konzola izvan pojasa (out-of-band, IPMI/KVM) ili način spašavanja (rescue mode) pružatelja usluge za slučaj da vas neko pravilo zaključa

Warning

Primjena pravila vatrozida na razini zemalja putem SSH sesije inherentno je rizična. Ako greškom blokirate vlastitu zemlju, gubite pristup. Uvijek imajte spreman pričuvni pristup izvan pojasa i testirajte pravila prije nego što ih učinite trajnima.

Korak 1: Odredite dopuštene i blokirane zemlje

Prije nego što dotaknete vatrozid, odredite svoju politiku. Postoje dva pristupa:

  • Popis dopuštenih (preporučeno): Dopustite samo zemlje koje trebate, sve ostalo odbacite. To je strože i sigurnije.
  • Popis blokiranih: Dopustite sve, odbacite određene zemlje. Jednostavnije, ali ostavlja veću površinu napada.

U ovom ćemo vodiču koristiti pristup s popisom dopuštenih – u skladu je s načelom najmanjih privilegija. Pretpostavimo da vaše usluge opslužuju korisnike samo iz SAD-a, Njemačke i Poljske. Dvoslovni ISO kodovi zemalja su: US, DE, PL.

Info

Kodovi zemalja slijede standard ISO 3166-1 alpha-2. Cjelovit popis pronađite na https://www.iso.org/obp/ui/#search/code/. Budite precizni – tipfeler ovdje neprimjetno blokira legitiman promet.

Korak 2: Postavljanje GeoIP-a s iptables (xtables-addons)

Ova metoda koristi modul xt_geoip iz xtables-addons, koji iptables-u dodaje podudaranje -m geoip. To je jedan od najuhodanijih načina za blokiranje raspona IP adresa po zemljama na Linuxu.

2.1 Instalirajte xtables-addons i ovisnosti

Debian/Ubuntu:

sudo apt install -y linux-headers-$(uname -r) sudo apt update && sudo apt install -y \ xtables-addons-common libtext-csv-xs-perl unzip iptables curl

Warning

xtables-addons nije dostupan u repozitorijima AlmaLinuxa 10. Umjesto toga koristite nftables metodu (Korak 3) ili izgradite xtables-addons iz izvornog koda.

Nakon instalacije provjerite je li modul dostupan:

modinfo xt_geoip

Očekivani izlaz sadrži redak poput:

filename: /lib/modules/.../xt_geoip.ko description: Xtables: country matching via GeoIP

Ako modinfo vrati pogrešku, modul nije ispravno instaliran. Provjerite podudaraju li se zaglavlja jezgre s verzijom pokrenute jezgre.

2.2 Preuzmite i izgradite GeoIP bazu podataka

Modul xt_geoip zahtijeva lokalnu bazu podataka preslikavanja zemalja u IP adrese. One se isporučuju kao CSV datoteke i moraju se pretvoriti u binarni format.

Izradite radni direktorij i direktorij baze podataka:

sudo mkdir -p /usr/share/xt_geoip

Preuzmite najnovije GeoIP CSV podatke. Izvorni izvor pruža podatke putem alata xtables-addons:

cd /tmp /usr/libexec/xtables-addons/xt_geoip_dl

Pretvorite preuzeti CSV u binarni format:

/usr/libexec/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv

Očekivani izlaz – popis kodova zemalja koji se obrađuju:

4540 IPv4 ranges for ZA 1071 IPv6 ranges for ZA 147 IPv4 ranges for ZW 94 IPv6 ranges for ZW ...

2.3 Primijenite iptables pravila s GeoIP podudaranjem

Sada izradite stvarna GeoIP pravila vatrozida. Sljedeća skripta dopušta promet iz odabranih zemalja i odbacuje sve ostalo u lancu INPUT.

Najprije napravite sigurnosnu kopiju trenutačnih pravila:

sudo iptables-save > /tmp/iptables-backup-$(date +%Y%m%d).rules

Primijenite popis dopuštenih zemalja:

# Allow loopback sudo iptables -A INPUT -i lo -j ACCEPT # Allow established and related connections sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Allow traffic from US, DE, PL only sudo iptables -A INPUT -m geoip --src-cc US,DE,PL -j ACCEPT # Log dropped packets sudo iptables -A INPUT -j LOG --log-prefix "GEOIP-DROP: " --log-level 4 # Drop everything else sudo iptables -A INPUT -j DROP

Warning

Završno pravilo DROP blokira sav promet koji ne odgovara popisu dopuštenih. Provjerite je li zemlja podrijetla vaše SSH veze uključena, inače ćete odmah izgubiti pristup. Ako niste sigurni, prije DROP dodajte privremeno pravilo ACCEPT za svoju IP adresu: sudo iptables -I INPUT -s <YOUR_IP_ADDRESS> -j ACCEPT.

Provjerite jesu li pravila aktivna:

sudo iptables -L INPUT -v --line-numbers

Očekivani izlaz:

Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere /* loopback */ 2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 3 ACCEPT all -- anywhere anywhere -m geoip --source-country US,DE,PL 4 LOG all -- anywhere anywhere LOG level warning prefix "GEOIP-DROP: " 5 DROP all -- anywhere anywhere

2.4 Učinite iptables pravila postojanima nakon ponovnog pokretanja

Pravila primijenjena pomoću iptables gube se pri ponovnom pokretanju. Spremite ih:

Debian/Ubuntu:

sudo apt install iptables-persistent -y sudo netfilter-persistent save

AlmaLinux/RHEL:

sudo service iptables save

Korak 3: Postavljanje GeoIP-a s nftables (IP skupovi)

Ako vaš sustav koristi nftables (zadano na Debianu 11+, Ubuntuu 22.04+ i RHEL-u 9+), isti rezultat možete postići pomoću IP skupova (IP sets) popunjenih CIDR blokovima na razini zemalja. Ovaj pristup ne zahtijeva module jezgre osim onih koje nftables već pruža.

3.1 Pribavite raspone IP adresa zemalja

Preuzmite CIDR popise za zemlje koje želite dopustiti. Nekoliko javnih izvora nudi ih, primjerice ipdeny.com:

sudo mkdir -p /etc/nftables/geoip cd /etc/nftables/geoip # Download CIDR blocks for US, DE, PL for CC in us de pl; do sudo curl -sS -o /etc/nftables/geoip/${CC}.zone \ "https://www.ipdeny.com/ipblocks/data/aggregated/${CC}-aggregated.zone"; done

Provjerite sadrže li datoteke CIDR raspone:

head -5 /etc/nftables/geoip/us.zone

Očekivani izlaz (CIDR rasponi, jedan po retku):

1.178.0.0/23 1.178.4.0/22 1.178.8.0/21 ...

3.2 Izgradite i učitajte nftables konfiguraciju

Izradite skriptu koja čita CIDR datoteke i generira nftables skup. Spremite je kao /etc/nftables/geoip-update.sh:

sudo nano /etc/nftables/geoip-update.sh

Zalijepite sljedeće:

#!/bin/bash # Generate nftables set from country CIDR files set -euo pipefail GEOIP_DIR="/etc/nftables/geoip" OUTPUT="/etc/nftables/geoip-sets.nft" echo "define ALLOWED_COUNTRIES = {" > "$OUTPUT" for zone_file in "$GEOIP_DIR"/*.zone; do while IFS= read -r cidr; do && continue echo " ${cidr}," >> "$OUTPUT" done < "$zone_file" done echo "}" >> "$OUTPUT" echo "GeoIP set generated: $(wc -l < "$OUTPUT") lines"

Učinite je izvršnom:

sudo chmod +x /etc/nftables/geoip-update.sh

Pokrenite skriptu:

sudo /etc/nftables/geoip-update.sh

Sada se na taj skup pozovite u svojoj nftables konfiguraciji:

# Debian/Ubuntu: sudo nano /etc/nftables.conf # AlmaLinux/RHEL: sudo nano /etc/sysconfig/nftables.conf

Dodajte include i koristite skup u svojem input lancu:

#!/usr/sbin/nft -f flush ruleset include "/etc/nftables/geoip-sets.nft" table inet filter { chain input { type filter hook input priority 0; policy drop; ct state invalid drop iif lo accept ct state established,related accept # Allow ICMP ip protocol icmp accept ip6 nexthdr icmpv6 accept # GeoIP: allow only listed countries ip saddr $ALLOWED_COUNTRIES accept # Log dropped packets log prefix "geoip-drop: " level info # Everything else is dropped by policy } chain forward { type filter hook forward priority 0; policy drop; } chain output { type filter hook output priority 0; policy accept; } }

Provjerite sintaksu prije primjene:

sudo nft -c -f /etc/nftables.conf

Ako nema pogrešaka, primijenite i provjerite:

sudo nft -f /etc/nftables.conf sudo systemctl enable --now nftables sudo nft list ruleset | head -20

Tip

Za vrlo velike IP skupove (100 tisuća+ unosa) nftables radi znatno bolje od iptables. Podudaranje temeljeno na skupovima u nftables interno koristi hash tablice, pa performanse pretraživanja ostaju konstantne bez obzira na veličinu skupa.

Korak 4: Automatizirajte ažuriranja GeoIP baze podataka

Preslikavanja IP adresa u zemlje stalno se mijenjaju. Baza podataka od prošlog mjeseca imat će praznine. Zakažite automatska ažuriranja pomoću crona.

4.1 Izradite skriptu za ažuriranje

Izradite /usr/local/sbin/geoip-refresh.sh:

sudo nano /usr/local/sbin/geoip-refresh.sh

Za iptables (xtables-addons):

#!/bin/bash set -euo pipefail cd /tmp /usr/libexec/xtables-addons/xt_geoip_dl /usr/libexec/xtables-addons/xt_geoip_build \ -D /usr/share/xt_geoip *.csv rm -f /tmp/*.csv /tmp/*.zip logger "GeoIP database updated successfully"

Za nftables:

#!/bin/bash set -euo pipefail GEOIP_DIR="/etc/nftables/geoip" for CC in us de pl; do curl -sS -o "${GEOIP_DIR}/${CC}.zone" \ "https://www.ipdeny.com/ipblocks/data/aggregated/${CC}-aggregated.zone" done /etc/nftables/geoip-update.sh systemctl reload nftables logger "GeoIP nftables sets updated and reloaded"

Učinite je izvršnom:

sudo chmod +x /usr/local/sbin/geoip-refresh.sh

4.2 Zakazivanje pomoću crona

Prije zakazivanja cron zadatka provjerite je li usluga nftables omogućena i pokrenuta (ako koristite nftables metodu):

sudo systemctl enable --now nftables

Ažuriranje pokrećite tjedno:

sudo crontab -e

Dodajte:

0 3 * * 0 /usr/local/sbin/geoip-refresh.sh >> /var/log/geoip-update.log 2>&1

Ovo se izvršava svake nedjelje u 3:00. Nakon prvog zakazanog pokretanja provjerite je li uspjelo:

cat /var/log/geoip-update.log

Korak 5: Provjera i testiranje

5.1 Test iz dopuštene zemlje

Sa stroja u jednoj od dopuštenih zemalja povežite se putem SSH-a ili pošaljite HTTP zahtjev:

curl -v http://<YOUR_SERVER_IP>

Veza bi trebala uspjeti bez problema.

5.2 Simulacija blokirane zemlje

Upotrijebite curl s poznatom IP adresom iz blokirane zemlje preko proxyja ili testirajte lokalno tako da privremeno uklonite vlastitu zemlju s popisa dopuštenih i pokušate se povezati iz drugog terminala.

Info

Online usluge poput https://ipinfo.io omogućuju provjeru u kojoj je zemlji registrirana određena IP adresa. Za potvrdu upotrijebite curl https://ipinfo.io/<YOUR_IP_ADDRESS>.

5.3 Provjerite brojače vatrozida

iptables:

sudo iptables -L INPUT -v -n

Pogledajte brojače paketa na pravilu DROP – trebali bi rasti kako stiže blokirani promet.

nftables:

sudo nft list chain inet filter input

5.4 Praćenje sistemskih zapisnika

Provjerite odbačene pakete u sistemskom zapisniku:

sudo journalctl -k --since "1 hour ago" | grep -i "geoip-drop"

Warning

Ako primijetite veliku količinu poruka u zapisniku jezgre o odbačenim paketima i sustav prestane reagirati, uzrok može biti poplava zapisivanja. U najgorem slučaju to može izazvati kernel panic. Ako ste konfigurirali parametar crashkernel i uslugu kdump, kernel panic će stvoriti ispis rušenja (vmcore) u /var/crash koji možete analizirati kasnije. Bez kdump-a dobivate samo ponovno pokretanje i nikakvu dijagnostiku. Kratak pregled pogledajte u odjeljku u nastavku.

Korak 6: Zaštita od kernel panica tijekom izmjena vatrozida

Agresivne izmjene vatrozida na opterećenom produkcijskom poslužitelju – posebno one koje uzrokuju nagle skokove prometa ili poplavu zapisivanja – u rijetkim slučajevima mogu dovesti do kernel panica. Ako se to dogodi, a niste se pripremili, ne dobivate ništa: samo ponovno pokretanje i nikakve podatke o tome što je pošlo po zlu.

Kdump je standardni Linux mehanizam za bilježenje ispisa rušenja kada se dogodi kernel panic. Koristi kexec za pokretanje sekundarne jezgre za bilježenje (capture kernel), koja prije ponovnog pokretanja sustava zapisuje sliku memorije (vmcore) na disk.

Kako biste osigurali dostupnost dijagnostike:

  1. Provjerite je li kdump instaliran i omogućen. Na RHEL/AlmaLinuxu obično je unaprijed instaliran. Na Debianu/Ubuntuu:

    sudo apt install kdump-tools kexec-tools -y

  2. Provjerite je li parametar crashkernel postavljen u konfiguraciji vašeg boot loadera:

    cat /proc/cmdline | grep crashkernel

    Trebali biste vidjeti nešto poput crashkernel=256M. Ako nedostaje, u GRUB-u morate konfigurirati parametar crashkernel i ponovno pokrenuti sustav. Točna količina memorije koju treba rezervirati za kdump na Linuxu ovisi o ukupnoj RAM memoriji – 256M je sigurna zadana vrijednost za poslužitelje s 4 GB ili više.

  3. Provjerite je li usluga kdump aktivna:

    sudo systemctl status kdump

Info

Ako se kernel panic ipak dogodi, sustav će pomoću kexec-a pokrenuti jezgru za bilježenje, zapisati vmcore u /var/crash i zatim se normalno ponovno pokrenuti. Zatim možete provesti analizu vmcore-a na Linuxu pomoću alata crash kako biste utvrdili uzrok. To je standardni dio otklanjanja poteškoća s kernel panicom na Linuxu na produkcijskim sustavima. Cjeloviti vodič o tome kako omogućiti kdump na Linuxu i o konfiguraciji kexec kdump na Linuxu potražite u zasebnom vodiču za kdump.

Otklanjanje poteškoća

  • Gubitak pristupa putem SSH-a: Koristite konzolu izvan pojasa (out-of-band) / način spašavanja (rescue mode).
  • modinfo xt_geoip: not found: Instalirajte linux-headers-$(uname -r).
  • iptables: command not found (Debian 13): Instalirajte iptables naredbom sudo apt install iptables.
  • nftables.service is not active: Pokrenite sudo systemctl enable --now nftables.
  • Prazna datoteka /etc/sysconfig/nftables.conf na AlmaLinuxu: Za konfiguriranje pravila koristite ovu putanju umjesto /etc/nftables.conf.

Poništavanje promjena (Rollback)

Za poništavanje blokiranja po zemljama i vraćanje otvorenog pristupa:

iptables – vraćanje iz sigurnosne kopije:

sudo iptables-restore < /tmp/iptables-backup-*.rules

Info

Ako ste GeoIP pravila primijenili na poslužitelju bez prethodne konfiguracije vatrozida, datoteka sigurnosne kopije bit će prazna. U tom slučaju umjesto iptables-restore upotrijebite dolje navedene naredbe za brisanje pravila i postavljanje politike.

Ili obrišite sva pravila:

sudo iptables -F INPUT sudo iptables -P INPUT ACCEPT

Warning

Brisanje uz politiku ACCEPT uklanja svu zaštitu vatrozida. Odmah nakon toga primijenite svoj standardni skup sigurnosnih pravila.

nftables – vraćanje zadanog stanja:

sudo nft flush ruleset

Zatim vratite svoju osnovnu nftables konfiguraciju (bez GeoIP-a):

sudo nft -f /etc/nftables.conf.backup

Za potpuno uklanjanje GeoIP komponenti:

sudo rm -rf /etc/nftables/geoip sudo rm -f /etc/nftables/geoip-sets.nft /etc/nftables/geoip-update.sh sudo crontab -l | grep -v geoip-refresh | sudo crontab -

Uklonite xtables-addons (ako je instaliran):

Debian/Ubuntu:

sudo apt remove xtables-addons-common -y

AlmaLinux/RHEL:

sudo dnf remove xtables-addons -y

Zaključak

Vaš poslužitelj sada koristi GeoIP pravila vatrozida za blokiranje prometa po zemljama na Linuxu – bilo putem iptables s xt_geoip, bilo putem nftables s IP skupovima temeljenima na CIDR-u. Baza podataka ažurira se automatski, imate plan poništavanja promjena, a uz kdump konfiguriran za bilježenje ispisa rušenja u slučaju kernel panica vaše je produkcijsko okruženje zaštićeno i od rutinskih prijetnji i od najgorih scenarija.

Verzija dokumenta: 1.0
Posljednje ažuriranje: svibanj 2026.
Vlasnik: Tim za tehničku dokumentaciju

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA