Otin käyttöön tor-selaimen. Ihan siksi, että kävin vilkaisemassa langattomien mac-layoutin näppäimistöjen hintaa. iPad on tuskaa kirjoittaa pidempiä tekstejä virtuaalinäppäimistöllä ruutua takoen, enkä suostu Applen hintoja maksamaan. Sen seurauksena jokainen nippelikauppias koki tarpeelliseksi mainostaa televisioitaan jokaisella mahdollisella kanavalla. Tuo oli seurausta seurannasta ja vakoilusta, jota yritykset tekevät Googlen ja Facebookin piikkiin. Sen estämisessä tor-selain on tehokas.
Samalla asensin itselleni bridgen. Se on vähemmän julkinen reitti tor-verkkoon. Hieman kuin oma VPN, vaikkakin monella tapaa ihan eri asia. Lopputulos on kuitenkin jonkun verrankin samankaltainen.
En olisi tarvinnut bridgeä, mutta olin utelias miten se tehdään.
Sisällön saavutettavuutta
Kun oivalsin, että torin kautta käytettävä onion-verkko on jotain muuta kuin lehtien lööpit rikoksista ja Silkkitiestä, niin tuli hassu olo. Keneltä olisi poissa, jos peilaan WordPress-sivustoni myös onionin puolelle.
Ei blogien ja artikkelien laittaminen darknetin puolelle tuo mitään lisäarvoa yksityisyyttään arvostavalle käyttäjälle verrattuna siihen, että samat sivustot ovat vain clearnetin (tai clearwebin; sama asia, eri nimi) puolella. Sivustoni eivät harrasta seurantaa – paitsi että harrastavat.
Juoruaminen ei tule kävijätilastoinnista. Sen teen omin voimin Matomon avulla ja ne tiedot pysyvät minulla. Mutta esitän Googlen mainoksia, ja ne juoruavat eteenpäin aika paljon. Laajemmassa merkityksessä jokainen pyyntö, joka sivuilleni tehdään, rekisteröidään myös nimipalvelinpyynnöillä.
Tekemällä mirrorin onion-verkkoon mahdollistaisin sivustojen lukemisen ilman, että siitä jää merkkejä. Omalla tavallaan kyse on saavutettavuudesta, aivan kuin tehdä sivustot niin, että niitä voi käyttää ruutulukjoilla. Mutta yksityisyys huomioiden.
Myönnetään, tuo vertailu oli huono. Melkoisen huono. Aidosti saavutettavuudessa on kyse siitä, että pystyykö ylipäätään käyttämään verkon sisältöä erilaisten vajeiden ja puutteiden takia. Jos silmät eivät näe tai sormet eivät toimi, niin ei paljoa lohduta minkä netin puolella sisältö on. Tor-verkon käytössä Suomessa kyse on enemmänkin valinnasta ja – anteeksi – vainoharhan asteesta. Tai mukavuudesta ja ärsytyskynnyksestä, kuten minulla.
Tiedän, että tor-verkko on perusvaatimuksia Venäjällä, Iranissa, Kiinassa tai Turkmenistanissa, sekä nykyään jo jopa USA:ssa, ja jos Tanskan junailema vaatimus yhteiskunnan vakoilusta ja kontrollista menee läpi, niin myös EU:ssa. Meillä yksityisyyden tarve on erilainen, mutta muun maailman pahuus ei silti tee siitä tarpeesta turhaa 1st world probleemaa.
Yksi tarkennus. Ei ole olemassa kuin yksi verkko. Niillä on omat nimensä sen mukaan miten sisältöön pääsee käsiksi. Onion-verkon tekniikka on erilainen kuin tavallisessa webissä. Silti samoilla servereillä ollaan, ja sama valokuitu tai satelliiitti serverit yhdistää toisiinsa. Ero on siinä, että darknetiä kuunteleva USA, Venäjä ja Kiina eivät tiedä kuka tulee mistä, on menossa mihin ja miksi.
Oma tuska
Minulla on tor-verkon suhteen vahva viha/rakkaus-suhde ylläpitäjänä ja jossain määrin sisällöntuottajana. Se tulee rahasta.
Minulla sivustoni ja niiden tarpeet maksavat luokkaa 100 euroa kuukaudessa. Itseasiassa taitaa olla jo yli, mutta en ole uskaltanut laskea. Ja tuota rahaa ei ole ilman, että se on poissa muusta peruselämisestä. Ei, en liioittele.
Sellaista tilannetta, jossa kävijät maksaisivat sisällöstä, ei tule. Ja jos nostan maksumuurin, niin samalla tipahtaa – käyntimäärien romahtamisen myötä – myös Google, ja Googlen hakukonenäkyvyys on minulle elinehto. Bingillä ja siltä hakuindeksejä ostavilla muilla hakukoneilla, kuten Duckduckgo, Brave jne, ei ole minulle minkäänlaista merkitystä. Mutta jonkun täytyy maksaa se tekniikka, jota käytetään esittämään sisältöä 2000+ yksittäiselle ihmiskäyttäjälle joka päivä.
Se maksetaan mainoksilla – joita jokainen inhoaa, myös minä, ja jotka ovat mukana hakukoneiden harrastamassa vakoilussa, koska tuotteitaan myyvät yritykset niin haluavat.
Kyllä. 75 maksukertaa kuussa á 2 euroa poistaisi mainokset. Silloin ne kuukauden 60 000+ näyttökertaa olisivat ilman mainoksia. Ei Adsense ole mikään kultakaivos näillä käyntimäärillä ja enemmän Google niistä tienaa, paljon enemmän. Sama ongelma siis kuin Youtubessa.
Joten eräällä tavalla kaivan itselleni kuoppaa sillä, että teen mainoksettoman version – niitä ei esitetä onion-sivustoilla – ja samalla teen tekstejä, joissa neuvotaan miten se onnistuu.
Mutta realismiakin saa käyttää. Minun sivustoillani tor-käyttäjät ovat niin mikroskooppinen osuus kävijämäärissä, että se ei näy lompakossa. Joten onion-mirror ei ole taloudellinen kysymys. Enemmän minuun sattuu adblocker-käyttäjät.
Tor on minulle pelkkä kuluerä. Maksan 15 euroa kuussa siitä, että tarjoan kaksi entry relettä tor-käyttäjille. Ei, tuo ei ole mukana kululaskennassa, koska se on idealistisempi harrastuskulu. Poissa muusta päivittäiskäytöstä se kuitenkin on. Mutta siirtymä tupakasta nikotiinipusseihin kuittaa sen.
Tor: asennus serverille
Jos haluat tietää miten bridge otetaan käyttöön, niin siitä on oma ohjeensa. Sama tekniikka ja ero on vain siinä mitä asetuksissa kerrotaan. Nyt oletetaan, että halutaan vain esittää WordPress-sivuston sisältö tor-netin kautta.
Onion ja Tor ovat oikeastaan sama asia. Mutta minä käytän niitä enemmänkin merkityksessä, jossa Tor on verkon nimi ja onion on mikä tahansa palvelu, joka on saatavilla .onion-osoitteen kautta. Oikein tai väärin, niin noin teen.
Ympäristönä on Ubuntu. Tarkemmin ottaen versio 24.04, mutta tämä ei taida olla versiosidonnainen asia ja linux vaikuttaa enemmänkin ehkä polkuihin ja miten servicet käynnistetään.
Minä käytän Varnishia reverse proxyna, joten ohjeet ovat sen mukaiset. Mutta ohjeet toimivat vahvasti samalla tavalla merkityksessä, että samat asiat täytyy laittaa perinteisemmässä asennuksessa web-serverin vconffiin.
Minulla backend on Apachella, joten se osa ei suoraan copy&pasteennu Nginxiin. Mutta vastaavat asiat tehdään, syntaksi on vain hieman eri. Aika helpolla se kääntyy.
AI on iso ongelma nykyään, eikä todellakaan niin osaava kuin hype antaa ymmärtää, mutta yleensä ne onnistuvat tehtävissä malliin tämä on Apachelle, mutta miten sama tehdään Nginxissä. Tai menet perinteiseen tapaan hakemalla itse. Se ei muuten ole sen luotettavampi tapa kuin AI, koska maailma on täynnä paskoja ja toimimattomia neuvoja, ohjeita ja vinkkejä – ja niitähän myös AI käyttää, ainoastaan nopeammin.
Teen itse töitä rootin roolissa, joten joko muistan tai en muista lisätä sudon ohjeisiin.
Tor
Asennetaan ensimmäiseksi tor:
sudo nano apt update
sudo apt install tor nyx -y
Nyt luotiin kaksi hakemistoa ja niiden tiedostot: /etc/tor/ja /var/lib/tor/
Tor-verkossa ei käytetä SSL-salausta, joten selailussa ei anneta https://vaan pelkkä http://. Tuo ei tarkoita, että salausta ei olisi. Kyllä on, ja vahva, mutta se tehdään eri tavalla. Myöskään IP-osoitteita ei, eikä nimipalvelimia tunneta. Sekin tehdään eri tavalla.
Molemmat tiedot ovat hostin nimessä itsessään. Joten url hoitaa salauksen sekä tietää mihin ollaan menossa.
Muokataan /etc/tor/torrc. Poista koko muu sisältö ja lisää tämä:
# tor
RunAsDaemon 0
DataDirectory /var/lib/tor
SocksPort 9052
# Palvelut
HiddenServiceDir /var/lib/onion/eksis/
HiddenServicePort 80 127.0.0.1:8080
Tuo olettaa, että mitään muuta palvelua, kuten bridgeä, ei ole. Jos on, niin tietänet miten hommat toimivat. Kunhan muistat, että HiddenService ei saa olla samassa torrc tiedostosss bridgen kanssa. Joten silloin teet uuden onionille, tässä WordPress peilaukselle, esimerkiksi nimellä torrc.onion. Myöskään workdir ei saa olla sama.
Tuo esimerkki ei toimi suoraan. Minulla on käytössä Nginx – Varnish – Apache2, joten minä ohjaan liikenteen Varnishiin. Torin portti 80 juttelee tässä Varnishin käyttämän 8080 kanssa.
Voisin olettaa, että perinteisemmässä tapauksessa laitettaisiin vhostiin uusi server-blokki kuuntelemaan esimerkiksi porttia 81 ja sinne sitten laitettaisiin WordPressin tarvitsemat asiat – hyvin pitkälle tismalleen samat kuin mitä lohkossa 443 on kerrottu, paitsi että domain on onion-osoitteen mukainen.
Mutta harkitse Varnishin käyttöä. Se mahdollistaa paljon asioita ja nopeuttaa WordPressiä aidosti, päinvastoin kuin mikään muu kokeilemasi.
Lopuksi tehdään normaalit uuden servicen vaatimat taiat. Sekä katsotaan mikä on tulevan onion-osoitteen url ja host.
sudo systemctl enable --now tor
sudo cat /var/lib/tor/onion/eksis/hostname
Se on tämän kaltainen nimihirviö:
eksiszkream6iqtwr5ci3vdhorkonagudym25anokjvmcbayqozg77yd.onion
Tuo yhdessä torrc:n kanssa on se kuunteleva web-serveri. Hostin hash ohjaa oikealla serverille ja kertoo missä portissa tor ja onion kuuntelee. Siksi mitään Nginx/Apache2 säätöjä ei tarvita saapuvalle liikenteelle. Tor tekee serverillä proxyn ja sitä varten tarvitaan se sisäinen palvelu kuuntelemassa web-serverillä, dockerissa tai miten sitten mikäkin on toteutettu.
Varnish
Varnish vaatii omat kikkansa. Jos käytät yhtä default.vcl tiedostoa, niin määrittelet uuden backendin ja sitten laitat tarpeen mukaisesti aika paljon if-lauseita. Aidosti ollaan samassa tilanteessa kuin jos muutoinkin käyttäisi useampaa hostia.
Mutta jos on alkujaan yksi host, niin luovalla includejen käytöllä saa hiukan helpotettua if-helvettiä. Helpommalla, selvemmällä ja vähemmän riskialttiilla tavalla pääsee, kun samalla tuskalla vaihtaisi suoraan useamman hostin systeemiin.
Minun on tässä turha selittää mitä vcl:ään on lisättävä. Vilkaise github-repostani mitä siellä on niin clearnetin kuin onionin suhteen. Tämä kiinnostaa vain, jos on Varnish käytössä ja siinä tapauksessa tiedät jo ainakin perusteet. Osa onion-kohdista liittyy xkey-banneihin ja jos et käytä sitä, niin… ohitat.
Tämä on web-sivustojen default.vcl:ää vastaava:
https://github.com/eksiscloud/Varnish_7.x-multiple_sites/blob/main/sites/shared_wp.vcl
Ja tämä on onion-mirroreille:
https://github.com/eksiscloud/Varnish_7.x-multiple_sites/blob/main/sites/onion.vcl
Web-puolella kannattaa kiinnittää erityishuomiota tähän headeriin: Onion-Location. Esimerkki on useamman hostin setupista, joten yhdellä hostilla voi jättää if (bereq.http.host)... tekemättä.
if (bereq.method == "GET" && beresp.status == 200 && beresp.http.Content-Type ~ "(?i)text/html") {
            if (bereq.http.host ~ "(?i)^www\.eksis\.one$") {
                set beresp.http.Onion-Location =
                "http://eksiszkream6iqtwr5ci3vdhorkonagudym25anokjvmcbayqozg77yd.onion" + bereq.url;
            }
Kun pyyntö on GET, joka saa 200 OK ja sisältö on html:ää, niin asetetaan header Onion-Location = eksis...yd.onion
Kun se näkyy, niin tor-selaimet osaavat tavallisen clearwebin puolella https-osoitteessa tarjota heti mahdollisuutta siirtyä onion-linkille. Applen Onion Browser tekee siirron heti ja automaattisesti (silloin kun se on sillä päällä, ikkiriikkisen buginen tuo selain).
Webservereillä taasen tuo header asetetaan siinä lohkossa, joka hoitaa html:n, kuten Nginxillä lohkossa location /.
Backendin Apache2
Minulla kävijä kulkee reittiä:
- onion-osoite vie Toriin, joka proxyaa Varnishiin
- Varnish tekee cachen ja pari muuta ihmeellistä asiaa ja siirtää Apachelle (joten seuraava samaa asiaa pyytävä saa sisällön Varnishista; nopeaa ja tehokasta)
- Apache tekee sen mitä web-server tekee, ja pyytää sisällön WordPressiltä
Nyt laitetaan backendin Apache2 kuntoon – ja tavanomaisemmissa asennuksissahan tämä on se jotain sisäistä porttia, kuten vaikka 81, kuunteleva lohko, joka tekee saman kuin 443, mutta ilman SSL-osaa.
Laitan näkyviin vain olennaisen osan vhostista, koska suurin osa on aina ihan samaa ja riippuu paljon jokaisen omasta setupista – käytetäänko kuville EWWW:tä tai jotain, asetetaanko cachea-aikoja jne.
Tämän voi toki tehdä web-hostin conffiin omana server-lohkonaan, mutta minä tein onion-liikenteelle oman konffinsa per host, kuten onion.eksis.one.conf. Tuo valinta on ihan makuasia ja kannattaa tehdä se mitä sopii omaan tapaan ja makuun.
<VirtualHost 127.0.0.1:8282>
        ServerAdmin jakke.lehtonen@gmail.com
        ServerName eksiszkream6iqtwr5ci3vdhorkonagudym25anokjvmcbayqozg77yd.onion
        DocumentRoot /var/www/eksis.one/public_html
        DirectoryIndex index.php
...
        # Luota proxyyn: jos Varnish/Nginx sanoo "https", merkitään se Apachessa päälle
        SetEnvIfNoCase X-Forwarded-Proto "^https$" HTTPS=on
        <Directory /var/www/eksis.one/public_html/>
                Options -Indexes +FollowSymLinks -MultiViews
                AllowOverride none
                Require all granted
                Allow from all
...
              <IfModule mod_headers.c>
                        Header append Vary Accept env=REDIRECT_accept
                        Header append Vary User-Agent env=!dont-vary
                        Header append Vary: Accept-Encoding
                        Header always set Access-Control-Allow-Origin "*"
                        # Ei käytössä onionissa
                        Header always unset Strict-Transport-Security
                        # Luota Varnishiin
                        Header always set X-From-Onion "1" "expr=%{req:HTTP_HOST} =~ /\\.onion$/"
                </IfModule>
Loppu normaalisti, kuten WordPressin redirectit jne.
WordPressin sisäiset linkit
Edellä oleva ei ihan riitä. WordPressin sisäiset linkit täytyy myös käsitellä, jos aikaa näyttää mm. kuvia. Https-pakotus täytyy kampittaa, koska onion toimii http:llä. Siihen tarvitaan mu-plugin. Tai voi se olla tavallinenkin, mutta kun se pitää olla koko ajan päällä, niin must use on turvallisempi valinta.
Tässä vaiheessa minulta loppui osaaminen ja nakitin tekoälyn töihin. Se jopa sai aikaiseksi toimivan version.
nano wp-content/mu-plugins/onion-mode.php
<?php
/*
Plugin Name: Onion Mode
Description: Korjaa WP-URLit onion-hostille (http, ei https) ja estää https-pakotukset onionissa.
*/
if (preg_match('/\.onion$/', $_SERVER['HTTP_HOST'] ?? '')) {
  $onion = 'http://' . $_SERVER['HTTP_HOST'];
  add_filter('pre_option_home',    fn() => $onion);
  add_filter('pre_option_siteurl', fn() => $onion);
  $to_http = fn($u) => preg_replace('#^https:#i','http:', $u);
  add_filter('set_url_scheme', $to_http, 99, 1);
  foreach (['home_url','site_url','content_url','plugins_url','includes_url','network_home_url','network_site_url'] as $f) {
    add_filter($f, function($u) use ($onion){ 
      $u = preg_replace('#^https?://(www\.)?eksis\.one#i', $onion, $u);
      return preg_replace('#^https:#i','http:', $u);
    }, 99);
  }
  add_filter('wp_get_attachment_url', function($u) use ($onion){
    $u = preg_replace('#^https?://(www\.)?eksis\.one#i', $onion, $u);
    return preg_replace('#^https:#i','http:', $u);
  }, 99);
  add_filter('wp_calculate_image_srcset', function($srcs) use ($onion){
    if (!is_array($srcs)) return $srcs;
    foreach ($srcs as &$s) {
      $s['url'] = preg_replace('#^https?://(www\.)?eksis\.one#i', $onion, $s['url']);
      $s['url'] = preg_replace('#^https:#i','http:',$s['url']);
    }
    return $srcs;
  }, 99);
  add_filter('redirect_canonical', '__return_false', 10, 2);
}
Toimiiko kaikki?
Kun kaikki mahdollinen on käynnistetty uudelleen, noin tilanteen pitäisi olla
- webissä https-liikenne toimii normaalisti
- onionissa host näkyy onion-muodossa ja muu polusta selväkielisenä
Jos ei toimi, niin alkaa normaali debug, jossa yritetään selvittää mihin asti pyynnöt ylipäätään tulevat. Vaihtoehtoja on liikaa, että niitä voisi tai kannattaisi tässä alkaa erikseen menemään läpi.
Mirror on tehty kävijöille, ei adminille. Minulla Varnish pakottaa kirjautumiset ja muut admin-asiat clearnetin puolelle. Syy on se, että onion-selain saattaa sallia tai olla sallimatta javascriptiä ja cookiet, ja ne ovat välttämättömiä WordPressin hallinnalle.
Ylipäätään kävijöiden rekisteröinnin salliminen on sarjaa huonot ideat. Joten hoida kommentointi, jos sellaista kaipaat, jollain toisella tavalla. Hyödynnä vaikka Mastodonia, sen saa onioniin myös. Ja pieni ylimääräinen kierros jäähdyttää tehokkaasti kiihkeimmän reaktiiviset vierailijat.
Jos on tarve tehdä CMS/blogi, johon myös admin pääsee tor-verkon kautta, niin etsi jokin toinen ratkaisu kuin WordPress. Se on liian riippuvainen clearnetistä ja sen ominaisuuksista. WriteFreely on karsitumpi, ja siksi toimii myös onionissa. Muitakin vaihtoehtoja on.
Onionin haitat
Jos jotain voi käyttää häirintään, niin sitä taatusti käytetään häirintään. Murphyn lain yksi muunnos. Tämä valitettavasti pitää paikkaansa myös tor-verkon suhteen. Minä jouduin aikoinaan jatkuvien koputusten, murtoyritysten ja DDoS-hyökkäysten takia estämään jokaisen tapaamani tor exitin. Nyttemmin tilanne on rauhoittunut tuolta osin, mutta siinä saattaa geo-blokkauksellakin olla roolinsa. Estin ongelmallisimmat maat. Kun estää puolen tusinaa maata, niin haitat tipahtavat 80 prosenttia.
Geoip ei vaan toimi Tor-maailmassa. Tarkoittaa sitä, että moista työkalua ei ole käytettävissä. Ei pysty myöskään estämään yrittelijöitä, koska ei ole IP-pohjaista palomuuria. Tuo on jonkinlainen ongelma juurikin WordPressin kanssa.
Minulla lisääntyi hieman liikenne, joka ei ole sisältöä lukevaa. Mutta ei huolestuttavasti. Luultavasti siksi, että script grand-kiddiet eivät osaa eivätkä tiedä onion-osoitteistani. Osaksi siksi, että iso osa heidän yrityksistään kääntyy clearnetin puolelle, ja siellä on vastassa geoip ja fail2ban.
Tuosta ei kannata tehdä hysteriaa, koska haittaliikenne on paljon isompaa clearnetissä ihan perinteisillä tavoilla. Mutta asia kannattaa tiedostaa ja jos tulee sellainen olo, että onion-osa saa DDoS-tyyppistä huomiota, niin joko ajaa sen hetkeksi alas tai pakottaa kaiken liikenteen web-puolelle, jossa on työkalut.
Mutta kaiken kaikkiaan, minulla onion-mirror on saanut olla hyvin rauhassa. Varmasti siksi, ettö tyypillinen sivustojeni käyttäjä ei edes tiedä tor-verkon ja onion-selaimien olemassaolosta.


 
 
							 
							 
							
Keskustele foorumilla Katiskan foorumi