Hlavní navigace

GeoIP firewall na UBUNTU 16.04

3. 10. 2016 19:35 (aktualizováno) | Slavoj Hruska

Pred pad tyzdnami som narazil na problem, kedy som potreboval niektore sluzby na serveri povolit len z urcitych GeoIP lokacii.

Existuju v zasade 3 moznosti:

  1. apache, nginx a iste aj mnohe ine services maju moznost ako obmedzit spojenia podla geoip
  2. ak mate vlastnu serverovnu, riesit to na FW ktory umoznuje firewalling pomocou GeoIP (k tomu snad nabuduce)
  3. pouzit iptables a doplnkove moduly

Ako prve som chcel implementovat prvu moznost, no kedze som primarne potreboval ochranit takto napr SSH pristup, coskoro som moznost 1 zavrhol.

V mojej malej serverovni kde mam server, zakladny FW riesi Mikrotik, na ktorom je prilis komplikovane riesit (nevravim ze nemozne) zlozitejsie FW rules, hlavne ak ide o GeoIP. Samozrejme je mozne definovat address listy atp, ale ich udrzba bola na moj vkus prilis komplikovana, takze krok 2 (v tom okamihu) padal tiez.

Zostala teda moznost riesit to priamo na masine. Dany stroj je UBUNTU server 16.04, takze tu ukazem, ako to riesit na danej platforme:

Ako prve budeme potrebovat dane iptables rules niekte ukladat a restorovat ich:


santa@santa-vyuka-machine:~$ sudo apt-get install iptables-persistent

Dalej budeme potrebovat xtables plugin do itables, a podporne moduly pre pracu s CSV v prele


santa@santa-vyuka-machine:~$ sudo apt-get install xtables-addons-common
santa@santa-vyuka-machine:~$ sudo apt-get install libtext-csv-xs-perl unzip

Dalej si vytvorime script pomocou sudo vi /etc/cron.daily/update_geoip.sh ktory bude obsahovat:


#!/bin/sh
cd /tmp
/usr/lib/xtables-addons/xt_geoip_dl
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv

Nasledne zmenime opravnenia


santa@santa-vyuka-machine:~$ sudo chmod 750 /etc/cron.daily/update_geoip.sh

Ked si dany script prvy krat manualne spustime, aktualizuju sa jednotlive IP ranges v databaze s tym, ktore patria ku ktorej krajine…

santa@santa-vyuka-machine:~$ sudo /etc/cron.daily/update_geoip.sh
--2016-10-03 19:11:38--  http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz
Prevádza sa geolite.maxmind.com (geolite.maxmind.com) na IP adresu... 104.16.38.47, 104.16.37.47, 2400:cb00:2048:1::6810:262f, ...
Pripájanie k geolite.maxmind.com (geolite.maxmind.com)|104.16.38.47|:80... pripojené.
HTTP požiadavka odoslaná, čakám na odpoveď... 200 OK
Dĺžka: 1300354 (1,2M) [application/octet-stream]
Ukladá sa do: „GeoIPv6.csv.gz“

GeoIPv6.csv.gz                                  100%[====================================================================================================>]   1,24M  4,53MB/s    in 0,3s

2016-10-03 19:11:38 (4,53 MB/s) - „GeoIPv6.csv.gz“ uložené [1300354/1300354]

--2016-10-03 19:11:38--  http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Použije sa existujúce spojenie s geolite.maxmind.com:80.
HTTP požiadavka odoslaná, čakám na odpoveď... 200 OK
Dĺžka: 2132864 (2,0M) [application/zip]
Ukladá sa do: „GeoIPCountryCSV.zip“

GeoIPCountryCSV.zip                             100%[====================================================================================================>]   2,03M  5,84MB/s    in 0,3s

2016-10-03 19:11:38 (5,84 MB/s) - „GeoIPCountryCSV.zip“ uložené [2132864/2132864]

UKONČENÉ --2016-10-03 19:11:38--
Celkový čas: 0,7s
Stiahnutých: 2 súborov, 3,3M za 0,6s (5,26 MB/s)
Archive:  GeoIPCountryCSV.zip
  inflating: GeoIPCountryWhois.csv
172010 entries total
    0 IPv6 ranges for A1 Anonymous Proxy
   31 IPv4 ranges for A1 Anonymous Proxy
    0 IPv6 ranges for A2 Satellite Provider
   37 IPv4 ranges for A2 Satellite Provider
........................
   10 IPv6 ranges for ZW Zimbabwe
   63 IPv4 ranges for ZW Zimbabwe
santa@santa-vyuka-machine:~$

A teraz je cas zacat pridavat rules:

santa@santa-vyuka-machine:~$ sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save

santa@santa-vyuka-machine:~$ sudo /etc/iptables/rules.v4

Upravime podla nasledujucich pravidiel, ak chceme povolit napr len SSH z CZ a SK ip ranges… (je tam aj vysledok fail2ban pre ssh…


# Generated by iptables-save v1.6.0 on Mon Oct  3 19:21:49 2016
*filter
:INPUT DROP
:FORWARD ACCEPT
:OUTPUT ACCEPT
:f2b-sshd - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# fail2ban
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
# sem sa vrati fail2ban ak je vsetko ok....
-A f2b-sshd -j RETURN
# povolime SSH z CZ a SK ip ranges...
-A INPUT -d 123.123.123.321/32 -p tcp -m geoip --source-country CZ  -m tcp --dport 22 -j ACCEPT
-A INPUT -d 123.123.123.321/32 -p tcp -m geoip --source-country SK  -m tcp --dport 22 -j ACCEPT
COMMIT
# Completed on Mon Oct  3 19:21:49 2016

Tak toto je cca cesta ako to riesit na UBUNTU 16.04 priamo… Nabuduce si snad ukazeme, ako to riesit na urvoni centralneho FW. Budem rad, ak Vam toto posluzi ako inspiracia, pripadne podnet k diskusii.