Komence, vorto de averto. Tiu ĉi artikoleto koncernos teĥnikajn detalojn, kaj mi faras ĝin pleje por ke mi mem ne forgesu, kion mi faris, okaze se mi volos malfari ĝin. 😉 Eble aliaj teĥnikemuloj trovos ĝin interesa, mi ne scias, sed tiuj, kiuj ne havas specialan intereson pri agordado de retservoj ĉe OpenBSD, sentiĝu liberaj ignori ĝin.
Jen mallonga sumigo. Nenio (espereble) ŝanĝiĝis pri jam ekzistantaj servoj, sed kelkaj el ili nun atingeblas per Tor, nome:
Mi ankaŭ aldonis gopher’an servilon:
Mi profundiĝos en ĉiujn la enuigajn detalojn nun.
La dio de tondro
Estas nenia speciala kialo por ke mi havu urĝan bezonon ekuzi Tor nun, sed nu, cenzorado plifortiĝas en mia lando, kaj ĉar mi havas propran servilon nun, tio donas al mi la eblon lerni pri agordado de kontraŭcenzuraj iloj servilflanke. Eble mi bezonos ilin en la estonteco. Eble atendu artikoleton pri I2P, ĉu?
Krome, mi vere ŝatus vidi pli da (relative) “ordinaraj” homoj uzi la teĥnologion por ĉiutagaj aferoj. Tor estas se ne la plej bona ilo por protekti sin kontraŭ kaŝobservado kaj cenzurado, do almenaŭ la plej vaste uzata kaj do provita kaj bone komprenata koncerne ĝiajn fortajn kaj malfortajn flankojn. Sed samtempe ĝi daŭre asociiĝas plejparte kun krimuloj kaj friponuloj, kaj tia asociiĝo ne estas senbaza: ja estas multe da krimuloj, malica programaro kaj ĉiaspecaj frenezuloj en la “malluma reto”. Kaj mi ja pensas, ke la teĥnologio mem estas mojosa kaj meritas esti uzata de ne nur aĉuloj. Do jen, mia tute ne malica retejo, plilumiganta la tutan aferon. 😂
Nu, ni komenu do. Instalado de Tor mem ĉe OpenBSD ne speciale malsamas de instalado de Tor ie ajn.
# pkg_add tor
Mia VPS-provizoro ne suferas de cenzorado, do mi ne bezonas instali aldonaĵojn kaj agordi pontojn por konekti al la torreto, malkiel en mia hejma komputilo. Ĵus instalita, tor jam povus servi kiel klienta prokurilo sen aldonaj agordoj, sed mi volas aldoni miajn proprajn kaŝitajn servojn, do mi okupiĝu pri tio.
Mallongaj cepadresoj laŭ la dua versio jam ne plu estas subtenataj en nova tora programaro, do mi ne zorgu pri krei unu, mi havu nur longan laŭ la tria versio.
Tor estus feliĉa krei tute hazardan adreson por mia servo, sed mi volas esploreti, kiel oni kreas tiujn “fanfaron-adresojn”. Ne estas malfacile trovi ilojn por tio, kvankam oni atentu, ke ĝi kreu v3-adresojn, ne v2. Mi uzis mkp224o.
Post instali kaj kompili ĝin ĉe mia linukso, mi lanĉas ion kiel
> ./mkp224o autuno senkalson novembro folio -d senkals
kaj nun mi devas atendi ĝis ĝi produktos multajn belajn nomojn.
Krom ke mi fakte ne havas sufiĉan paciencon por longe atendi. 😂 Do jen, vidu:
> ls -1 senkals/
autunoii343cjzpvy5jw2huodgtro5fwtgsfxwuw2vcnfjtkngvkwoid.onion
autunoq527kp6buoc3ytzpw65u4yrzknsopx23ycma7pdojdz6ydkkqd.onion
autunox273lljlctm3gtco3na5kget2xix5mxq7r2ej3a4cq5sulv7qd.onion
Tiu kun q, ĉu ĝi ne estas sufiĉe bona? Ĝi eĉ havas “knso” kaj tio certe pensigas pri kalsonoj. Nu, se oni jam emas pensi pri kalsonoj, almenaŭ. Mi prenos ĝin.
# cp -r autunoq527kp6buoc3ytzpw65u4yrzknsopx23ycma7pdojdz6ydkkqd.onion /var/tor/tor-mirror
# chown -R _tor:_tor /var/tor/tor-mirror
# chmod 600 /var/tor/tor-mirror/*
# chmod 400 /var/tor/tor-mirror/*secret*
Do mi havas nomon kaj ŝlosilojn por mia nova cepobuldo, kaj ĉion
mankantan Tor kreos dum lanĉo. Mi bezonas aldoni nur priskribon de la
servo al la konfig-dosiero. En /etc/tor/torrc
:
HiddenServiceDir /var/tor/tor-mirror
HiddenServicePort 80 127.0.0.1:443
HiddenServicePort 70 127.0.0.1:7070
HiddenServicePort 1965 127.0.0.1:1966
Mi klarigos elekton de la pordoj poste, sed unu afero menciindas. Dum mi konsilis ekzemplojn rete, mi foje vidis homojn agordi la pordojn, kvazaŭ ili provus eviti uzi la saman pordon por tora kaj maltora servoj. Tio ne estas bezonata, kaŝitaj servoj en Tor fakte aŭskultas je neniu interfaco. Kliento kaj servilo renkontiĝas pere de “rendevua punkto” ie en la tor-reto kaj tiuj pordoj en la konfig-dosiero estas pure virtualaj.
Nu, mi jam povas startigi la aferon, kvankam la servoj mem ankoraŭ ne pretas.
# rcctl enable tor
# rcctl start tor
La TTT-ejo
Nu, tiu jam povas funkcii tiel. La pordo 443 en la konfig-dosiero
aspektas kvazaŭ temus pri TLS, sed fakte ĝi estas nudteksta. La afero
estas, ke mi havas httpd
kiu servas paĝojn kaj relayd
kiu zorgas
pri TLS, sekuraj kapoj kaj aliaj tiaĵoj. Relayd
aŭskultas ĉe la
pordo 443 de la publika interfaco, kaj httpd
– ĉe la pordo 443 de
lo0
. Ĉe lo0
ĉio jam estas elĉifrita, kaj ĉar tora reto per si mem
jam faras ĉion la saman, por kio oni uzas TLS, lo0:443
estas kien mi
direktas la kaŝitan servon. Tian uzon de la sama pordo por iom
malsamaj aferoj ĉe malsamaj interfacoj mi pruntis de iu ekzemplo
rete. Tiutempe ĝi ŝajnas eleganta ideo, sed nun mi pensas ke ĝi povas
esti konfuza, do eble mi ŝanĝos ĝin unu tagon.
Do, httpd
ne bezonis pluan agordon. Mi aldonis la cepadreson kiel
unu el kromnomoj por la retejo, sed mi dubas, ke httpd
fakte zorgas
pri tio.
La blogo mem, tamen, bezonis iom da korektado. Se la retejo estus pli malsimpla, mi eble bezonus du malsamajn versiojn. Kiel ĝi estas, mi (espereble) sukcesis ŝanĝi ĉiujn absolutajn ligilojn al relativaj, do ili montras al la ĝusta reto sendepende de kie oni vizitas la retejon. Nu, mi ankoraŭ ne kontrolis per wireshark, do eble iom da trafiko forkuras klarreten, sed eĉ la propra blogo de projekto Tor suferas pro tio, do mi estus en bona kompanio.
Unu neatendita malfacilaĵo estis tiu pri Onion-Location. Mi volis
aldoni la kapon al mia maltora retejo, sed mi ne trovis la
manieron. Ĝi devas enhavi plenan URL de la paĝo, sed jen, httpd
konas ĝin, sed ne scipovas aldoni HTTP-kapojn. Aliflanke, relayd
povas aldoni kapojn sed ĝi ne havas variablon, similan al
$REQUEST_URI
, kiun mi povus uzi en la kapo. Eble mi preteratentis
ian manieron solvi tion, sed ŝajne ĝi ja ne fareblas tiel. La ĉefa
avantaĝo de httpd
estas ĝia brutala simpleco, kaj se mi volas fari
pli malsimplajn aferojn, mi pli bone uzu nginx
anstataŭe.
Eble mi ja ekuzos nginx
unu tagon, sed portempe mi uzis tiun
alternativan manieron indiki Onion-Location
per meta
deklaro en la
dosieroj mem. Ĝi estas malpli eleganta, sed nu, ĝi funkcias.
Do jen, unu servo farita.
Gemini
Kiel mi jam menciis, TLS estas superflua en la tora reto, sed la
gemini protokolo postulas ĝin, do kion fari. Almenaŭ, ĝi ne estas
malsimpla afero. Por servi gemini mi uzas Vger, kiu ne traktas TLS per
si mem, sed atendas ke relayd
aŭ alia renversa prokurilo faru tion
por ĝi. Do mi jam havas relajson konfigurita, mi bezonas nur unu
plian.
Kaj, kompreneble, unu plian mem-subskribitan atestilon.
# cd /etc/ssl
# openssl genrsa -out private/gemtor.key 4096
Generating RSA private key, 4096 bit long modulus
.............++++
...........++++
e is 65537 (0x10001)
# openssl req -new -key private/gemtor.key -out gemtor.csr
[…]
Common Name (eg, fully qualified host name) []:autunoq527kp6buoc3ytzpw65u4yrzknsopx23ycma7pdojdz6ydkkqd.onion
[…]
# openssl x509 -sha256 -req -days 36500 -enddate -in gemtor.csr -signkey private/gemtor.key -out gemtor.crt
Signature ok
subject=/CN=autunoq527kp6buoc3ytzpw65u4yrzknsopx23ycma7pdojdz6ydkkqd.onion
Kaj /etc/relayd-gemini.conf
fariĝas do
protocol "gemini" {
tls keypair $host
}
protocol "gemtor" {
tls keypair "gemtor"
}
relay "gemini" {
listen on $ipv4 port 1965 tls
protocol gemini
forward to lo0 port 11965
}
relay "gemtor" {
listen on lo port 1966 tls
protocol gemtor
forward to lo0 port 11965
}
Kaj tio estas ĉio.
# relayd -n
configuration OK
# rcctl restart relayd
OpenBSD ne venas kun gnutls-cli
(ĉar ĝi ne estas GNU/OpenBSD 😉),
sed ĝi havas amindan variaĵon de openssl
, kiun oni povas uzi por
testi la konekton:
> openssl s_client -crlf -connect localhost:1966
[… multe da teksto …]
subject=/CN=autunoq527kp6buoc3ytzpw65u4yrzknsopx23ycma7pdojdz6ydkkqd.onion
issuer=/CN=autunoq527kp6buoc3ytzpw65u4yrzknsopx23ycma7pdojdz6ydkkqd.onion
[…]
SSL-Session:
Protocol : TLSv1.3
Cipher : AEAD-CHACHA20-POLY1305-SHA256
[…]
Verify return code: 18 (self signed certificate)
---
Parenteze, kiam vi testas gemini, ĉu per gnutls
, ĉu per openssl
,
oni ne forgesu tiun -crlf
opcion, la protokolo postulas tiun finaĵon
ĉe la petoj, kaj sen ĝi strangaj aferoj okazas, se io okazas entute.
Gopher
Mi ne estas tre entuziasma pri la protokolo, ĝi certe montras sian aĝon. Mi eble malŝaltos mian mustruon poste, sed ŝajnis al mi sufiĉe interesa defio aldoni ĝin kaj mi ja lernis kelkajn aferojn dum mi faris tion.
Do jen, unu el la problemoj pri gopher estas ke ĝi estas tute nudteksta kaj nenia norma maniero ekzistas por enĉifri la trafikon. La proponoj por ripari ĝin ne mankas. Uloj ĉe bitreich.org, kiuj estas multe pli entuziasmaj pri simplaj protokoloj kiel gopher kaj IRC, listigas kelkajn:
Se vi malemas legi tiom en la angla, mi sumigu.
La propono pri TLS estas, ke ĉar en gopher la interŝanĝon komencas kliento, la kliento povas starti TLS-an sesion. Se ĝi faras tion, la servilo respondas, kaj se ne – ĉio iras nudtekste kiel antaŭe. La avantaĝoj estas, ke la skemo ne bezonas apartan pordon por TLS kaj ke ĝi neniel malhelpas jam ekzistantajn klientojn. La malavantaĝo estas, ke ĝi ebligas senĉifrigajn atakojn.
Kaj la propono pri tor estas simple ke oni uzu cepobulbojn kaj ke la tora reto provizios ĉiujn necesajn defendojn. La avantaĝo estas, ke oni povas ŝanĝi entute nenion pri la programaro, la malavantaĝo – nu, jen, Tor.
Neniu el la proponoj ŝajne gajnis multe da subteno ĝis nun, sed mi pensis, ke estus amuze funkciigi ambaŭ samtempe ĉe mia servilo.
Mi jam eksperimentis antaŭe pri geomyidae, kiun mi iomete scias uzi ĝin dank’ al unu el ~tildoj. Do mi havis ĝin instalita kaj pro tio mi ne mencios en la ĉi-suba, kiel oni kreas la uzanton kaj dosierujon por la demono: la pakadministrilo kreis ilin por mi, sed la afero estas triviala ĉiuokaze.
Malgraŭ ke OpenBSD ja havas pakon kun geomyidae
, estas du problemoj
pri ĝi: ĝi estas kompilita sen subteno por tiu eksperimenta
TLS-kapablo, kaj ankaŭ la rc-dosiero por la demono estas farita tiel,
ke ĝi ne permesas lanĉi du ekzemplerojn samtempe. Kaj mi ne vidas,
kiel oni povas servi kaj la cepan kaj la ordinaran mustruoj per unu
ekzemplero, ĉar respondoj de servilo devas enhavi ties retan nomon,
kaj la demono ne konas ĝin. Nu, mi povas pensi pri kelkaj solvoj, sed
la dua demono ŝajnas pli malpeza ol ili.
Ĉar temas pri tre simpla programo, mi preferis simple kompili ĝin el la fonta kodo, kvankam se, kontraŭ miaj atendoj, mi komencos efektive uzi tiun mustruon por io kaj ne malŝaltos ĝin baldaŭ, mi eble devos ŝanĝi reen al la kunsistema variaĵo kaj esplori, kiel mi povas ĝuste konfiguri ĝin.
> doas pkg_delete geomyidae
> git clone git://bitreich.org/geomyidae/
> cd geomyidae
> make
> doas make install
> doas cp OpenBSD.rc.d /etc/rc.d/geomyidae
> cd /etc/rc.d
> doas chmod +x geomyidae
> doas ln -s geomyidae torgopher
Nu, mi ne faris tion sen legi antaŭe la dosierojn, kompreneble 😉
Mi havas do du identajn demonojn. geomyidae
estas tro simpla por
havi sian propran konfig-dosieron, do mi uzas operaciumajn ilojn por
agordi ĉion.
# rcctl enable geomyidae
# rcctl set geomyidae flags -l /var/log/geomyidae.log -u _geomyidae -g _geomyidae -c \
# -h $host -t /etc/ssl/private/letsencrypt/$host.key /etc/ssl/letsencrypt/$host.fullchain.pem
# rcctl start geomyidae
geomyidae(ok)
# rcctl enable torgopher
# rcctl set torgopher flags -l /var/log/torgopher.log -u _geomyidae -g _geomyidae -c \
# -o 70 -p 7070 -h $onion
# rcctl start torgopher
torgopher(ok)
Kaj jen ĉio. Mi povas uzi la saman openssl
komandon por testi TLS,
aŭ simplan telnet
por testi ordinaran konekton. Nun mi estas fiera
posedanto de mia propra geomustruo, kiun mi, plej verŝajne, tute ne
uzos, sed kiu estas atingebla per ĉiu pripensebla meĥanismo.
Aldonaĝo: kaŝita SSH
Simple por ekzerco, mi kreu apartan kaŝitan servon kun SSH. Ĝi ne estos publika, do ĝi uzos pure hazardan adreson.
En /etc/tor/torrc
, mi aldonas:
HiddenServiceDir /var/tor/tor-login
HiddenServicePort 22 127.0.0.1:22
Post restartigi tor mi povas eltrovi la adreson nova servo:
# rcctl restart tor
tor(ok)
tor(ok)
# cat /var/tor/tor-login/hostname
[longa hazardaĵo].onion
Ĉe mia hejma komputilo, en ~/.ssh/config
mi aldonas:
Host senkalsonion
HostName [la sama hazardaĵo].onion
ProxyCommand /usr/bin/nc -X5 -x 127.0.0.1:9050 %h %p
Post tio mi povas uzi simple
> ssh senkalsonion
por konekti al mia kaŝita-kaŝita ssh.
Se vi legis ĝis tio ĉi, gratulojn, vi estas tre pacienca. 👍
Ĝis la revido. Sekvafoje mi eble revenos fine al tiuj kaprompiloj.