GeoIP: Varnish ja VMOD (MaxMind)

Jos tarvitsee serverilleen geo-tietojen perusteella suodatuksen (eli geo-blokkauksen, geo-eston tai GeoIP-suodatuksen), niin serverin palomuuri on sitä varten. Kun eston rakentaa parivaljakolle UFW/iptables, niin saa suojattua koko järjestelmän. Joskus saattaa riittää maatiedon mukaan estäminen Nginxissä – tai uudelleenohjaus, sekin onnistuu – jolloin asioita tehdään vain webserverillä. Mutta jos tarve on laajempi, kuten ohjaukset erilaisiin maaversioihin, niin ohjaksiin hyppää reverse proxy ja vaikka Nginx hoitaa ihan mallikkaasti cachen työt, niin tehokkuudessa ja monipuolisuudessa Varnish on ykkönen. Varnsihiinkin saa geo-tiedot, mutta ei suoraan pakasta vedettynä. Mutta mihinkään ei saa, vaan aina joutuu säätämään.

Ennenkuin innostuu suunnattomasti geo-ohjauksen ja -blokkauksen mahdollisuuksista, niin kannattaa pitää kirkkaana mielessä, että IP-osoitteen maantieteellinen sijainti ei ole läheskään aina sama kävijän maa. Useimmiten toki on, mutta poikkeuksia on lukuisia. VPN-palvelut myyvät itseään vauhdilla, kun ihmisiä peloitellaan IP-osoitteen julkisuudesta. Tai kävijä tulee globaalin yrityksen sisäverkosta/proxystä ja Helsingissä oleva näyttääkin tulevan Los Angelesista tai Lontoosta.

Oma epävarmuutensa tulee digitaalisista nomadeista. keikkatyöläisistä ja muusta siirtolaisuudesta, matkailijoista puhumattakaan. Vaikka IP-osoitteen maakohdennus menisikin oikein, niin kävijä kuitenkin edustaa aivan muuta maatarvetta. Itse töpeksi tuossa aikoinaan urakalla, kun estin koputtelijoiden takia Espanjan. Samalla estin Aurinkorannikolla ja muualla etelän auringossa oleskelevien ulkosuomalaisten pääsyn suomenkieliselle sivustolleni.

Jos pyörittää globaalia sivustoa, niin maaestoja ei voi tehdä. Se on niin yksinkertaista. Tai voi. Harva suomalainen sivusto, vaikka olisi kuinka globaali, saa hyödyllistä liikennettä Kiinasta, Intiasta, Iranista, Irakista tai Afrikan valtioista, Etelä-Amerikasta puhumattakaan. Ne webmasterit, jotka EksisOnen tapaisilta sivustoilta hakevat neuvoja ja ideoita, eivät oikeastaan koskaan ole globaaleja. He haluaisivat sitä, mutta totuus on toinen. Yleensä operoidaan Pohjoismaiden tasolla, jonkun verran EU-markkinoilla ja osa suuntaa myös Venäjälle.

Silloin täytyy käyttää muita keinoja, kuten taistella user agenttien perusteella tai estää pääsy urleihin, joita ei ole tai jonne ei ole asiaa.

Jos estot ovat mallia hyvin suoraviivaisia, kuten että Kiinaa ei tarvita, niin palomuuri on järkevin sekä energia- ja kustannustehokkain tapa. Mutta jos tarvitsee ehdollisuuksia, kuten estetään, jos maa JA selaimen kieli ei ole haluttu, tai että ei bannata Fail2banin toimesta, jos maa JA selaimen kieli on suomi, niin paras tapa on toimia Varnishissa.

Mikäli lähestymistapa on positiivisempi, eli sisältöä kohdennetaan maan kautta, niin silloin valinta häälyy webserverin, kuten Nginxin, ja Varnishin välillä – ja Varnish antaa enemmän työkaluja, koska voidaan säätää cookieita, headereitä jne.

GeoIP2 ei ole paketoitu valinta

Geo-tietoja ei saa käyttöön millään apt install komennolla. Tietokannat täytyy erikseen hakea, mutta lähes aina päivitykset sentään onnistuvat cronin kautta. GeoIP2 tietokannat ovat liiketoimintaa ja jos haluaa tarkkuutta, niin joutuu maksamaan. Melkoisen paljonkin. Mutta jokainen tarjoaa myös lite-version, joka on maksuton, mutta pakollisen rekisteröitymisen takana. Tietokantojen tarkkuus on luokkaa 98 %, joka riittänee useimmille, ja tietokannat päivittyvät maksimissaan kerran viikossa – joka sekin on useimmille riittävää.

Ehdottomasti suurin geo-tiedon tarjoajista on MaxMind. Toinen paljon käytetty on IP2Location. Aidosti niiden ero on lähinnä siinä, että kuinka helposti löytää ohjeita, tietokanta kun tarjoaa vain tiedon. Jollain tapaa tietoa on haettava ja käsiteltävä, ja se ympäristö vaatii käsitöitä sekä mielellään kattavan dokumentoinnin. MaxMindille löytyy ohjeet suunnilleen jokaiseen ympäristöön. Valitettavasti vain suurin osa on vanhentuneita, tai vaativat poikkeuksellisen paljon (maallikkotasoon verrattuna) dev-tietoja. IP2Locationille löytyy suppeammin tietoa, mutta useimmat ovat toki tuoreemmille versioille.

On hieman makuasia kumman valitsee – koska valinta ratkaisee mitä on asennettava ja miten. Minulla on tunne, että MaxMind on ollut einen luotettavampi, enkä saanut koskaan IP2Locationia toimimaan iptablesin kanssa. Joten minulle MaxMind on loogisempi vaihtoehto, koska tietokannat löytyvät jo järjestelmästä. Mutta IP2Locationin kautta saa proxy-tunnistuksen, ainakin jonkinlaisen, ja se saattaa olla osalle oleellisen tärkeää (ainakin globaalissa verkkokaupassa).

Ainahan voi tietysti asentaa kaikki, ja säätää loppuviritykset joko yhdelle tai päällekkäin niin, että eivät riitele toistensa kanssa.

Alkuvaroitukset

Olen asentanut kaiken esittelemäni ja saanut ne toimimaan. Ja jos/kun jonkin on hakannut vastaan, niin olen kertonut senkin. Kun jaan muualta kopioitua esimerkkejä, joita en ole itse testannut, niin kerron senkin. Mutta mikään noista ei takaa sitä, että mikään toimisi juuri sinulla. Järjestelmät ovat erilaisia ja jokin on saattanut onnistua minulla siksi, että saatavilla on ollut jokin muutama vuosi sitten asennettu kirjasto, jonka olemassaolosta minulla ei ole ollut hajuakaan – mutta se puuttuu sinulta. Nimittäin näissä joudutaan kääntelemään lähdekoodista ja se voi olla yhtä tuskaa.

Lisäksi asiat ja versiot muuttuvat ajan myötä. Vanha ei enää toimikaan (noin kävi MaxMindin ohjeiden kanssa 2020 paikkeilla).

Oma ympäristö on tätä kirjoitettaessa:

  • DigitalOceanilla oleva VPS (8 vcpu/16 Gb RAM)
  • Ubuntu 20.04 LTS
  • Nginx proxyna hoitamassa mm. SSL:n ja HTTP/2:den
  • Varnish 6.2.1 reverse proxyna/cachena
  • Apache2 backendissä sivustojen kanssa

Jos/kun sinulla on jotain muuta, niin homma muuttuu tai kaatuu sen mukaan.

Teen itse kaiken aina rootina. Joten jos sinulla on yleisempi toimintatapa olla SSH:ssa omalla tunnuksellasi, niin arvo sopiviin kohtiin sudo tai su.

Oikopolku VMOD:iin

Hukkasin Varnishin vaatiman VMOD:n rakentamiseen kolme työpäivää ja tolkuttomastí Googlen serveritehoja, enkä koskaan saanut asennusta tehtyä Varnishin versiolle 6.2 kuten ohjeet neuvoivat. Kiertotien kuitenkin löysin. Joten säästän hieman aikaasi.

Jos luotat, että en ole rakentanut mitään pommia, niin voit kopioida tarvittavan VMOD:n suoraan tästä, JOS Varnish on 6.2.x eli LTS-sarjaa:

Lataa “libvmod_geoip2.so”

libvmod_geoip2.so – Ladatty 4 kertaa –

Jos versiot sopivat yhteen, niin sen pitäisi toimia. Siirrä .so loppuinen VMOD FTP:llä hakemistoon /usr/lib/x86_64-linux-gnu/varnish/vmods/ – muista tarkistaa ensin, että siellä on ylipäätään muut Varnishin käyttämät VMOD:t, hakemistorakenteet kun vaihtelevat järjestelmien välillä.

Jos moista hakemistoa ei löydy, niin voit etsiä oikean paikan vaikka tällä:

find / -type f -name "libvmod_std.so"

Sen jälkeen asennat geo-tietokannan, hyppäät käännösjuttujen yli ja siirryt suoraan Varnishin asetuksiin.

GeoIP-tietokanta käyttöön

Ennen VMOD:n kääntämistä MaxMindin geo-kilkkeet on oltava paikallaan.

  • Koska ollaan ylipäätään liikkeellä aika yleishyödyllisen aiheen parissa, niin kannattaa tehdä pieni sivuhyppu ja asentaa GeoIP-tietokanta, joka kertoo maat virtuaaliserverillekin:
apt install geoip-bin geoip-database
  • Voit testata toiminnan komennolla:
geoiplookup 8.8.8.8

Jos saat vastaukseksi, että kyseessä on US, United States niin homma toimii.

Tuota ei sinällään tarvita Varnishin GeoIP-toiminnan kanssa, mutta samalla sen asentaa. Moni muu asia käyttää tai voisi käyttää sitä.

Sitten tarvitset päivitykset tietokantaan, koska IP-maailma muuttuu koko ajan. Tapoja on muutama, mutta käytännössä on käytettävä MaxMindin palvelua. Sinne on pakko rekisteröityä, mutta se on urakkana helpoin ja jos/kun sinulle riittää ilmaiset, kerran viikossa päivitettävät ja vain noin 98 % oikeassa olevat tietokannat, niin rekisteröinti ei maksa mitään.

  • Aloitetaan asentamalla ensimmäiseksi GeoIP2-tietokannan päivitysohjelma:
apt install geoipupdate

geoipupdate tarvitsee oman conf-tiedoston, josta se löytää MaxMindin käyttäjätunnuksen, salasanan sekä mitkä tietokannat ladataan. Sitä varten tarvitset tunnukset. Tili on pakko tehdä, jos aikoo ylipäätään tehdä minkäänlaista geoip-estoa, joten aidosti tässä ei oikein ole valinnanvaraa. Perustietokannat ovat ilmaisia, mutta jos haluat tarkempaa, niin joudut maksamaan.

  • Luo tili MaxMindiin osoitteessa https://www.maxmind.com/en/geolite2/signup. Anna pyydetyt tiedot. Sinun täytyy täyttää myös yrityksen nimi ja jos sellaista ei ole, niin keksi jotain tai laita nimesi.
  • Saat vahvistussähköpostin. Klikkaa salasanan luonti -linkkiä. Anna salasana, päätä haluatko MaxMindin mainospostia ja klikkaa reset password -nappulaa. Kirjaudu sisään sähköpostiosoitteellasi ja luomallasi salasanalla.
  • Klikkaa valikosta My Licence Key. Klikkaa avautuneessa ikkunassa nappulaa Generate new licence key. Anna avaimelle haluamasi kuvaus tai tyydy oletukseen. Laita täppä ruutuun Yes ensimmäisessä kysymyksessä, jossa halutaan tietää tarvitaanko tietoja geoipupdatelle. Laita täppä ensimmäiseen valintaan eli uudemmalle versiolle. Klikkaa Confirm

 

  • Olet luonut uuden avaimen. Talleta Account/User ID sekä License key. Lisenssiavainta ei enää näytetä, joten ehkä se kannattaa varmuuden vuoksi tallentaa johonkin, vaikkakin ne saadaan talteen seuraavassa vaiheessa. Lisäksi, jos on tarve, ja vanha on kadoksissa, niin aina voi luoda uuden. Klikkaa nappulaa Download Config.

  • Sinulle ladattiin GeoIP.conf, joka pitää sisällään tarvitsemasi tietokannat (eli ne mitkä ovat sinulle sallittuja) sekä account ID:n ja license keyn.
  • Siirrä GeoIP.conf hakemistoon /etc tai luo tiedosto ja kopypeistaa sisältö:
nano /etc/GeoIP.conf

Tiedosto vaatii nämä tiedot:

AccountID <numeroita> 
LicenseKey <merkkejä> 
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country
  • Aja SSH:ssa update: geoipupdate -v
    Vipu -v on sama kuin verbose eli kertoo mitä tapahtuu. Pääset näkemään toimiiko se vai tuleeko virheitä.
  • Tarkista cron:
nano /etc/cron.d/geoipupdate

 

Sinulta pitäisi löytyä tällainen sisältö:

  • Klikkaa MaxMindin sivuston valikosta kohtaa Download Files
  • Lataa GeoLite2 Country (.mmdb) kohdasta GZIP-tiedosto ja siirrä se FTP:llä hakemistoon /usr/share/GeoIP
  • Jos haluat, niin voit ladata myös City ja ASN tietokannat, niitäkin voi johonkin hyödyntää, mutta maatietoja kaivataan (tosin cronin ohjaama update taitaa ne siirtää joka tapauksessa)

  • Puretaan ladattu tar-pallo:
tar zxvf /usr/share/GeoIP/GeoLite2-Country_20210507.tar.gz
  • Siirrytään purettuun hakemistoon. Sinulla lienee hakemiston nimen päivämäärämerkintä eri:
cd GeoLite2-Country_20210507/
  • Siirretään kaikki oikeaan hakemistoon:
mv * /usr/share/GeoIP/

Kokeillaan toimiiko GeoIP tätä kautta:

mmdblookup --file /usr/share/GeoIP/GeoLite2-Country.mmdb --ip 8.8.8.8 country names en

Vastauksen pitäisi olla suunnilleen tällainen: "United States" <utf8_string>

Nyt sinulla on tehtynä neljä asiaa:

  • MaxMindin tili, jonka avulla saa tietokannan pidettyä ajantasalla
  • ohjelma, joka tekee tietokannan päivityksen cronin avulla
  • Ubuntulle ns. yleinen työkalu GeoIP-tiedon käyttöön
  • Varnishin kaipaama GeoIP-tietokanta

GeoIP-VMOD:n kääntäminen

Tarvittava VMOD on itse käännettävä eli siitä tehdään lähdekoodista suoritettava tiedosto. Jos olet moisia joskus tehnyt, niin suunnilleen tiedät miten edetä. Eikä temppu ole sen kummallisempi maallikollekaan – paitsi että serverillä täytyy olla liuta dev-kirjastoja asennettuna ja mitä tarvitaan onkin sitten jo paljon sumeampaa logiikkaa.

Ohjeet kertovat yleensä mitä ekstraa tarvitaan juuri sen nimenomainen paketin kääntämiseen. Mutta niiden lisäksi tarvitaan ns. peruskilkkeet, jotka siis kaikilta löytyvät. Paitsi että ei löydy, jos on ensimmäistään tekemässä. Lisäksi osassa ollaan hyvinkin versiokriittisiä ja jos löytyy väärä versio, niin taas homma kaatuu. Urakasta tulee asetetta mielenkiintoisempaa geneerisen virheilmoituksen takia, joka on luokkaa Windowsin virheet: jotain tapahtui, mutta vahingossakaan ei kerrota minkä takia.

  • Ihan ensimmäiseksi on syytä ottaa käyttöön Varnishin oma repo, jos sitä ei ole vielä – eli asennus on aikoinaan tehty Ubuntun omasta.
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish60lts/script.deb.sh | sudo bash

Löydät kaikki Varnishin versiot sivustolta packagecloud.io. Voit toki ottaa käyttöön tuoreemmankin version repon, jolloin saat apt dist-upgrade komennolla päivitettyä Varnishin. Mutta siinä on samaa ongelmaa kuin Ubuntun versioinnissa. Muut kuin LTS:t lakkaavat päivittymästä aika nopeasti ja kun nuo nousevat uuteen versionumeroon, niin repo pitäisi muistaa käydä erikseen vaihtamassa. Muuten päivittely loppuu jonkun ajan kuluttua.

Muista kuitenkin, että Varnishin repoversion on oltava Ubuntun versioon sopiva, eli 20.04 vaatii Focalin, esimerkiksi Xenial ei käy.

Jos käytät jotain korkeampaa versiota kuin 6-sarjan LTS:ää (tätä kirjoitettaessa versio on 6.2.1), niin sinulla on jo Varnishin joku repo asennettuna.

Repon käyttöönotto ajoi apt update, joten sitä, ja upgradea, ei vielä tässä vaiheessa tarvita. Mutta saa tehdä.

  • Ja nyt aletaan siirtymään epävarmuusakselille, sillä kolmen päivän riidan aikana asentelin kaikennäköistä, enkä ihan tarkkaan tiedä mikä oli turhaa ja mikä hyödyllistä. Mutta ainakin nämä tarvitaan, ja osa saattaa löytyä jo valmiinakin.
apt install make automake autotools-dev libedit-dev libjemalloc-dev libncurses-dev libpcre3-dev libtool libtool-bin pkg-config python3-docutils python3-sphinx cpio libvarnishapi-dev

Kun missä tahansa vaiheessa itse käännöstä saat ilmoituksen:

make: *** No targets specified and no makefile found. Stop.

niin se tarkoittaa, että jokin oleellinen palikka puuttuu. Siitä sitten arvuuttelemaan mikä se saattaisi olla. Oma suositukseni on, että googletat ubuntu ja virheen, avaat puolen tusinaa osumaa ja asentelet sellaiset, jotka etäisestikin voisivat liittyä asiaan.

Tuon nipun jälkeen on ajettava update ja upgrade (jos vaihdoit Varnishille tuoreemman version, niin se päivittyy nyt):

apt update && apt dist-upgrade -y

VMOD:n kääntäminen

Ensin on ladattava tarvittavat tiedostot Githubista. On se ja sama minne ne lataa, mutta sisäsiisti tapa on käyttää hakemistoa /usr/src. Itse kylläkin olen usein käyttänyt hakemistoa /tmp koska ne häviävät sieltä seuraavassa serverin buutissa – en minä juuri sen määrätyn version lähdekoodia enää mihinkään tarvitse, ja jos tarvitsen, niin Githubistahan sen saa.

  • Siirry haluamaasi hakemistoon ja komenna:
git clone --recursive https://github.com/fgsch/libvmod-geoip2

Sinulle ilmestyy uusi hakemisto libvmod-geiop2. Siirry sinne.

  • Järjestelmälle on kerrottava missä pkgconfig luuraa. Tarkista, että polku on oikein:
export PKG_CONFIG_PATH=/usr/share/pkgconfig

Jotta käännös onnistuisi, niin tarvittaisiin sellainen kummajainen kuin varnishapi.pc. Sen pitäisi asentua, kun asennetaan varnish-dev ja tässä kohtaa minulla pissi urakka. Komento apt install varnish-dev ei nimittäin toimi, jos repona on Ubuntun natiivi tai Varnish6lts. Ihan siksi, että tuota pakettia ei ole tehty. Johtunee siitä, että LTS versiona pitäisi olla stabiili tuotantoon kelpaava, ei dev-versio. Tai syy on jokin ihan muu.

Oli syy mikä tahansa, niin lopputulos on sama: VMOD:n kääntäminen ei onnistu, eikä geo-tietoa saa käyttöön. Joten vaihtoehtoja on tasan kolme:

  • ei ota geo-tietoa käyttöön Varnishille ennenkuin joskus
  • tekee kikkailuja
  • päivittää Varnishin tuoreempaan (nyt 6.6) ja toivoo, että se on riittävän vakaa

Koska olin päättänyt, että geotieto tulee, niin se sitten tulee. Mutta jos et ole vielä ottanut serveristäsi snapshottia, niin nyt on sen aika. Helpottaa elämää, kun tuntee pakoreitin, jos hommat menevät peppulleen.

Kikka-ratkaisussa tehdään itse puuttuva varnishapi.pc.  Kopiointi Githubista ei valitettavasti toimi, koska polut eivät aukene käännettäessä. Osaavampi osaisi niitä viritellä, mutta minä valitsin helpomman tien. Googletin toimivan version.

  • Luodaan varnishapi.pc (ja taas, varnista että polku hakemistoon pkgconfig on oikein):
nano /usr/share/pkgconfig/varnishapi.pc
  • Kopioi sinne tämä ja tallenna:
prefix=/usr
exec_prefix=/usr
bindir=/usr/bin
sbindir=/usr/sbin
libdir=/lib/x86_64-linux-gnu
includedir=/usr/include
pkgincludedir=${includedir}/varnish
datarootdir=${prefix}/share
datadir=/usr/share
pkgdatadir=${datadir}/varnish
vmoddir=${libdir}/varnish/vmods
vmodtool=${pkgdatadir}/vmodtool.py

Name: VarnishAPI
Description: Varnish API
Version: @PACKAGE_VERSION@
Cflags: -I${pkgincludedir}
Libs: -L${libdir} -lvarnishapi

Se oli siinä. Ero päivitysvaihtoehtoon tulee siinä, että kun joskus päivität Varnishin uudempaan versioon, ja jos asennat silloin löytyvänvarnish-dev paketin, niin joudut kääntämään geo-palikan uudestaan – mutta silloin se onnistuu. Valitettavasti on vaan muistettava toinenkin asia: poista silloin nyt tekemäsi varnishapi.pc, sillä se jää muuten kummittelemaan. Itseasiassa saattaisi olla hyvä idea poistaa se samantien.

Toinen vaihtoehto on päivittää Varnish. Poista hakemistosta /etc/apt/sources.list.d vanhempaan Varnishin versioon liittyvä(t) tiedosto(t), malliin varnishcache_varnish6olst.list ja asenna packagecloud.io sivustolta sopivan version repo. Esimerkiksi varnish-dev_6.6.0-1~focal_amd64.deb toimii Ubuntu 20.04:ssä.

Jossain kohtaa päivitystä kysytään halutaanko säilyttää oleva /etc/varnish/default.vcl vai otetaanko käyttöön paketin mukana tuleva. Kannattaa vastata N koska muutoin omasi jyrätään.

Kun repo on paikallaan ja apt dist-upgrade on päivittänyt Varnishin ja varnishd -V kertoo halutun version, niin on aika kääntää VMOD – mutta muista, älä käynnistä Varnishia vielä uudestaan; se toimii edelleen vanhalla versiolla.

Tästä eteenpäin kaikki toimii (toivottavasti) samalla tavalla aivan riippumatta menitkö kikka- vai päivityslinjalla.

Jos et ole enää, niin siirry takaisin siihen hakemistoon, johon kloonasit libvmod-geiop2 gitin, esimerkiksi /usr/src/libvmod-geiop2.

Komenna seuraavat peräkkäin:

autoconf
./autogen.sh
./configure
make
make check
make install

On mahdollista, että autoconf antaa virheen. En täysin ymmärrä milloin se on annettava ja milloin se jätetään tekemättä. Mutta jos se ei suostu yhteistoimintaan, niin periaattessa sitä ei tarvittaisi. Sen sijaan mikä tahansa virhe muissa komennoissa johtaa vääjäämättömään epäonnistumiseen. Jos erroreita tulee, niin onnea matkaan ja Google auki.

Kun make install on tehty, niin vaaditaan vielä yksi komento. Sillä kerrotaan järjestelmälle missä kirjastot piileskelevät. Minulla yhdessä testissä jopa ystävällisesti muistutettiin asiasta, mutta toisella kerralla se piti itse tajuta ajaa.

  • Tämän pitäisi riittää:
ldconfig
  • Mutta tätäkin pyydettiin:
libtool --finish /usr/lib64/varnish/vmods

Nyt on aika kokeilla onko Varnish elämäänsä tyytyväinen:

varnishd -C -f /etc/varnish/default.vcl

Jos syöte oli tuttua ajatuksenvirtaa ilman virheitä, niin kannattanee käynnistää Varnish uudestaam ja tarkastaa, että sillä puolella kaikki on kuten kuuluukin:

systemctl restart varnish
systemctl status varnish

Vielä yksi testi

Minulla toimi muuten kaikki hyvin, mutta kun yritin ajaa komennon varnishtop -i BereqURL, niin sain virheilmon

Assert error in main(), varnishtop.c line 356:
  Condition((ident) != 0) not true.
Aborted (core dumped)

varnishstat sitten kertoikin missä mättää:

varnishstat: /lib/x86_64-linux-gnu/libvarnishapi.so.2: version `LIBVARNISHAPI_2.6' not found (required by varnishstat)

Tiesin, että osa hakemistoista muuttui päivityksessä, mutta ilmeisesti tieto ei ollut levinnyt joka paikkaan. Tein nopean patenttiratkaisun:

cp /lib/libvarnishapi.* /lib/x86_64-linux-gnu/

Ja tv-shop -tyyliin: eikä tässä kaikki. Kun käskin systemctl reload varnish, niin Varnish pyllähti nurin samantien. Status kertoi seuraavaa:

varnish.service: Failed at step EXEC spawning /usr/share/varnish/varnishreload: No such file or directory

Ei löydykään koska varnishreload asuu hakemistossa /usr/sbin. Tein taas purkkakorjauksen ja tein symbolisen linkin siihen hakemistoon, mitä Varnish nyt haikailee:

ln -s /usr/sbin/varnishreload /usr/share/varnish/

Joten testaa, että sinulla nuo toimivat, jos jouduit/halusit päivittää Varnishin uudempaan. Luultavasti minulla tuo oli mennyt jossain vaiheessa rikki, kun sekoilin eri versioiden välillä. Tilanteen saattaisi saada fiksattua pysyvämmin kopioimalla *.vcl tiedostot talteen, poistamalla apt purge varnish && apt purge varnish-dev ja asentamalla kaikki ns. tyhjältä pöydältä uudestaan. Ehkä joskus toiste.

Varnishin säädöt

Kaikki lisäykset laitetaan tiedostoon /etc/varnish/default.vcl – ellet käytä erillisiä vcl-tiedostoja.

  • Ensin täytyy ottaa geoip-VMOD käyttöön:
vcl 4.1;
...
import geoip2;
...
sub vcl_init {
    new country = geoip2.geoip2("/usr/share/GeoIP/GeoLite2-Country.mmdb");
    new city = geoip2.geoip2("/usr/share/GeoIP/GeoLite2-City.mmdb");
    new asn = geoip2.geoip2("/usr/share/GeoIP/GeoLite2-ASN.mmdb");
}

Mahdollistan myös kaupungit ja ASN-tiedon, joka kertoo IP-avaruuden omistavan yhtiön. Kaupungilla ja ASN:llä en suuremmin mitään järkevää tee, kunhan roikkuvat mukana testimielessä.

  • Geo-tietoa täytyy hieman jalostaa, että niiden käyttö olisi helpompaa
sub vcl_recv {
...
    set req.http.x-country-code = country.lookup("country/iso_code", std.ip(req.http.X-Real-IP, "0.0.0.0"));
    set req.http.x-country-code = std.tolower(req.http.X-Country-Code);

    set req.http.x-asn = asn.lookup("autonomous_system_organization", std.ip(req.http.X-Real-IP, "0.0.0.0"));
    set req.http.x-asn = std.tolower(req.http.x-asn);
...
}

Maakoodi, kuin myös ASN, kannattaa viedä omaksi headerikseen. Toki vastaava kannattaisi tehdä kaupungillekin, jos sitä jossain tarvitsee. Komento std.tolower muuttaa merkit pieniksi. Mukavuuskysymys, ei sen enempää. On helpompaa, kun ei tarvitse miettiä isoja ja pieniä kirjaimia, vaan pääsee aina pienillä. Tuon olisi varmasti voinut tehdä samalla rivillä kuin tiedon hakeva lookup, mutta minulle tuo on helpompi hahmottaa – jokaisella rivillä tehdään vain yksi asia.

Usein käytetään käyttäjän IP-osoitteen merkitsemiseen muuttujaa client.ip. Se ei kuitenkaan toimi, jos Varnishin edessä on mikä tahansa proxy. Minulla moinen on mm. SSL:n hoitava Nginx. Silloin IP-osoite on aina 127.0.0.1, eikä siitä ole suurtakaan iloa millekään. Siksi Nginxistä tuodaan aito IP headerissa X-Real-IP. Mutta sekään ei ole sellaisenaan käyttökelpoinen, koska on vain merkkijono, ja tarvittaisiin aitoja numeroita. Se on siis muutettava ymmärrettäväksi IP-osoitteeksi.

Sen tekee std.ip(req.http.X-Real-IP, "0.0.0.0"). IP-osoite 0.0.0.0 on vain fallback, jos X-Real-IP sisältää sellaista tietoa, jota ei saada muutettua. Se voi olla mikä tahansa, mutta ei tietenkään (ehkä) sellainen, jolle asioita on sallittu.

Jos tarvitset lookupin muille tietokannan tiedoille, niin nämä ovat tarjolla:

Maatiedot
maakoodi = country/iso_code
maan nimi = country/names/en

Kaupungit
alue/osavaltio = subdivisions/0/iso_code
kaupunki = city/names/en
pituusaste (GPS) = location/longitude
leveysaste (GPS) = location/latitude

ASN (whois kertoo)
AS numero = autonomous_system_number
AS organisaatio = autonomous_system_organization

Nimissä käytettävät kielivaihtoehdot ovat de (saksa), en (englanti), es (espanja), fr (ranska), pt-BR (Brasilian portugali), ru (venäjä) ja zh-CN (kiina).

Sen jälkeen on taivas auki. Mutta maakoodit kannattaa normalisoida mahdollisuuksien mukaan, jos niitä käytetään cachen kanssa.

Maan estämisen voi tehdä vaikka näin:

sub vcl_recv {
    ...
    if (req.http.x-country-code != "fi|se|no") {
        return (synth(403, "Sorry, only available in Finland, Sweden and Norway"));
    }
    ...
}

 

 

 

Löydät lähes ajantasaisen setupini täältä: https://git.eksis.one/jagster/varnish_6.x

 

Jakke Lehtonen

Teen B2B-markkinoille sisällöntuottoa sekä UX-testauksia. Samaan liittyy myös koulutukset yrityksille ja webmaailman kanssa muutoin painiville. Serverien sielunelämää on joutunut ohessa opettelmaan. Toinen puoli toiminnasta on koirien ravitsemuksen ja ruokinnan suunnittelua sekä varsinkin omistajien kouluttamista hoitamaan koiriaan oikein ja vielä paremmin. Profiili: Jakke Lehtonen

Keskustele foorumilla Meta/KATISKA