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)
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
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.
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
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
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
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.
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"
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:
- 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
- Provjerite je li parametar
crashkernelpostavljen u konfiguraciji vašeg boot loadera:
Trebali biste vidjeti nešto poputcat /proc/cmdline | grep crashkernel
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 –256Mje sigurna zadana vrijednost za poslužitelje s 4 GB ili više. - Provjerite je li usluga kdump aktivna:
sudo systemctl status kdump
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: Instalirajtelinux-headers-$(uname -r).iptables: command not found(Debian 13): Instalirajte iptables naredbomsudo apt install iptables.nftables.serviceis not active: Pokrenitesudo systemctl enable --now nftables.- Prazna datoteka
/etc/sysconfig/nftables.confna 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
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
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