geoip alternativa: libloc

Nekem meg ujdonsag volt ez az ipfire-fele libloc/location nevu maxmind-geoip alternativa. Hat egy probat meger!

Csomag csak debianra van, minden mas igyjart... 'pip3 location' felrak valamit de nem azt, szoval ez se nyert...

Forrasbol vegul felszenvedtem ubi22-re, de eleg sok buktatoja van:

1. a letoltheto forras targizibol kifelejtettek a ./configure scriptet, szoval lehet felpakolni az autoconf/libtool bloatwaret hozza :(

$ sudo apt install libtool intltool libltdl-dev
$ ./autogen.sh
$ ./configure

2. configure: error: Required program 'asciidoc' not found

hat az asciidoc-ot inkabb nem rakom fel, mert ugy saccra 200 csomagot dependel magaval :)
inkabb kap egy --disable-man-pages parametert.

3. vegul igy sikerult:

$ ./configure CFLAGS='-g -O0' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --disable-man-pages --disable-perl
$ make
$ make install

4. hat persze, hogy nem mukodik!

location -h
Traceback (most recent call last):
  File "/usr/bin/location", line 32, in <module>
    import location
ModuleNotFoundError: No module named 'location'

mivel nyilvan rossz helyre masolta a python libeket...

/usr/lib/python3.10/site-packages/location helyett /usr/local/lib/python3.10/dist-packages konyvtarba kellene...

5. mar majdnem jo! elindul! :)

$ location version
location: Could not open database /var/lib/location/database.db: [Errno 2] No such file or directory

pedig ott a db is de nyilvan azt se masolta a helyere, de meg csak a konyvtarat se hozta letre...

libloc-0.9.16/data/database.db -> /var/lib/location/database.db

$ location version
Thu, 20 Oct 2022 06:27:23 GMT

$ location verify
Database successfully verified

6. hat frissitsunk egyet!

$ location update

azota eltelt ugy 20 perc de meg semmi se tortent...  tcpdump szerint 0 adatforgalom van. kezdem feladni!

es a weboldalon sincs sehol info arrol, honnan lehetne manualisan letolteni a db-t, ha mar a sajat update-je nem muxik :(

szerk: a forraskodban megtalaltam, itten vala:  https://location.ipfire.org/databases/1/location.db.xz

Hozzászólások

Csomag csak debianra van, minden mas igyjart

 Ez ebben a formában nem igaz. :)

cat /etc/system-release
Fedora release 38 (Thirty Eight)
========================= Name Exactly Matched: libloc =========================
libloc.i686 : Library to determine a location of an IP address in the Internet
libloc.x86_64 : Library to determine a location of an IP address in the Internet
======================== Name & Summary Matched: libloc ========================
libloc-devel.i686 : Developmental files for libloc C library
libloc-devel.x86_64 : Developmental files for libloc C library
liblockfile-devel.i686 : Development files for liblockfile
liblockfile-devel.x86_64 : Development files for liblockfile
perl-libloc.x86_64 : Perl interface to libloc library
python3-libloc.x86_64 : Python interface to libloc library
============================= Name Matched: libloc =============================
libloc-tools.noarch : Tools for downloading and querying IPFire Location
                    : database
liblockfile.x86_64 : This implements a number of functions found in -lmail on
                   : SysV systems
liblockfile.i686 : This implements a number of functions found in -lmail on SysV
                 : systems

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

megneztem ugy 20 ip cimmel (reszben fejbol reszben log fieokbol). a nagy reszenel nem volt lenyeges elteres, ahol igen:

195.133.13.79

maxminddb:  Czechia (JSC RetnNet)

location:
  Country                 : Russian Federation
  Autonomous System       : AS29470 - JSC "RetnNet"

a whois alapjan egyebkent orosz az ip tartomany, tehat itt a maxmind teved vszinu...

 

52.156.253.34

maxminddb: Ireland (Microsoft Azure)

location:
  Country                 : United States of America
  Autonomous System       : AS8075 - MICROSOFT-CORP-MSN-AS-BLOCK

probaltam whois-el es traceroute-al is igazsagot tenni, de nem jutottam eredmenyre :(

Szerkesztve: 2023. 07. 01., szo – 20:44

hirtelen felindulasbol megirtam pure pythonban, nagyjabol mar muxik is (IPv6-ra jot ir ki, v4-re valamiert nem talalja, meg ra kell jonnom hogy forditja at a v4 cimeket v6-ra az eredeti libloc):

https://github.com/gereoffy/pylibloc/

szerk: mostmar mukodik mindenre :)

Szerkesztve: 2023. 07. 02., v – 14:17

poenbol megirtam C-ben is, 100 sor az egesz (nem mintha nem elferne 50-ben is kicsit zsufoltabban)

https://github.com/gereoffy/ipstat46/blob/main/nanolibloc.c

# gcc -g3 -Wall nanolibloc.c && ./a.out
Result: net=270606  asn=1955  CC=HU/EU 'Hungary'  ORG='KIFU (Governmental Info Tech Development Agency)'

szerintem aki az eredetit irta azt programsoronkent fizettek... kulon func van arra hogy megnezze egy szam negativ-e, meg ilyenek... az if(version==1) helyett switch-case van vagy 10 sorban elnyujtva { }-ekkel, minden egyes helyen.

Szerkesztve: 2023. 07. 03., h – 08:32

Elég fiatal projekt még, a csomagolási hiányosságokat remélem idővel megoldják. Bízom benne, hogy a TOR hátterével megmarad a db frissessége és a  hozzáférés is.

Nekem működik a Debian-ban lévő csomag egyébként nem áll meg az update. A "man location" doksija szerint valami DNS rekordot is ellenőriz? mielőtt letöltené a db-t. A debug mondjuk semmi ilyesmit nem mond, az If-modified-since alapján szedi le tippre...., forrásból kiderülne gondolom van-e valami extra dns lookup.

 sudo location --debug update
HTTP GET Request to location.ipfire.org
        URL: https://location.ipfire.org/databases/1/location.db.xz
        Headers:
                If-modified-since: Mon, 03 Jul 2023 05:03:48 GMT
                User-agent: location/0.9.16
HTTP Response: 200
        Headers:
                date: Mon, 03 Jul 2023 06:07:14 GMT
                last-modified: Mon, 03 Jul 2023 05:06:03 GMT
                etag: "5353a0-5ff8e1f96af46"
                accept-ranges: bytes
                content-length: 5460896
                x-content-type-options: nosniff
                x-frame-options: deny
                referrer-policy: strict-origin
                x-xss-protection: 1; mode=block
                content-type: application/x-xz
                strict-transport-security: max-age=31536000; includeSubDomains; preload
                connection: close
Opening downloaded database at /var/lib/location/tmp2b9fnp8n
Downloaded new database from Mon, 03 Jul 2023 05:03:48 GMT

 location version
Mon, 03 Jul 2023 05:03:48 GMT

Ha esetleg valaki gondolkodna, hogy melyiket valassza mass lookupra mmdb(geoip) vagy libloc(ipfire), akkor egyertelmuen mmdb.

Benchmark eredeti altaluk adott libek mmdb vs libloc (gcc7):

db entryk: 8 252 820 (kb friss geoip2bol buildeltem uj libloc es mmdb dbt is)

10 000 000 lekeresre, random ipk, de ugyan az a random ip mind2 lib eseten.

[libloc] Finished in 9.570 seconds
[libmaxminddb] Finished in 2.913 seconds

Szoval ugyan azzal a dbvel geoip/mmdb gyorsabb.

kiprobalhatnad az en verziomat is, szerintem legalabb 5x gyorsabb a C libloc-nal (nincs benne rekurzio es felesleges v4->v6 forditgatas):

https://github.com/gereoffy/ipstat46/blob/main/nanolibloc.c

ha nem eleg gyors, vannak meg otleteim ra (a py-be megcsinalt v4 optimalizlat lookup c-ben is gyors lenne, meg leheten a country code-okhoz csinalni egy 64k-s 1:1 mapping tablat akkor nem kene a 254 entryt vegigkeresni...)

szerk: becommiteltem par optimalizalast meg :)

ez 10.000.000 db random ipv4 cimet 2.028 sec alatt keresett ki (stringbol).

igen, es valaszoltam is az emailre akkor. szerintem csak az volt a baj, hogy en 31-es netmaskig mentem le a faban, a te hibas peldadhoz meg /32 kellett volna (bar ez szerintem nem eletszeru, de mind1), igy a for ciklust kellett mask<32-rol mask<=32-re atirni, de ezt mar be is commiteltem a hithubra. ettol sokkal lassabb nem lesz, max 2-3%-al.

le tudnad ujra tesztelni? :)

Sorry spambe kerult.

15M     test.db       (ipfire)
2.9M    test.mmdb (maxmind)

Mostmar jo eredmenyt ad.

[loc]       Finished in: 11.741 seconds (found: 8750000, not_found: 1250000, speed: 851699/s)
 - io(in=0, out=0), ctx_switch(v=0, iv=550), time(user=11.701s, system=0.020s)
[maxminddb] Finished in: 2.562 seconds (found: 8750000, not_found: 1250000, speed: 3902826/s)
 - io(in=0, out=0), ctx_switch(v=0, iv=14), time(user=2.562s, system=0.000s)
[nanoloc]   Finished in: 0.781 seconds (found: 8750000, not_found: 1250000, speed: 12795919/s)
 - io(in=0, out=0), ctx_switch(v=0, iv=8), time(user=0.779s, system=0.002s)
 

koszi! a sebessegek megleptek, nem szamitottam ekkora kulonbsegre, max ugy 5x-re. es meg mindig vannak otleteim, hogy lehetne 25-50% gyorsitani rajta...

kivancsisagbol ma megneztem a maxminddb felepiteset. a binaris fa resze lenyegeben ugyanolyan mint a libloc-nal, a metadata van maskepp tarolva de ugyse az a lassu. a binaris fa bejarasnal kb ugyanazokat a trukkoket alkalmazzak ok is (a C libjukben) mint en, rekurzio nelkuli ciklus, ipv4 root node elore kikeresve stb. ehhez kepest nem is ertem, hogy lehet 3x lassabb az enyemnel, ha kb ugyanugy mukodik, es meg a db-juk is kisebb...