SSD Nodes Learn 🎉 VPS kutoka $5.50/mwezi
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-08-13

Jinsi ya kuweka tovuti ya .onion kwenye VPS

Jifunze kusakinisha huduma ya v3 onion kwenye Ubuntu kwa kutumia Tor na Nginx. Mwongozo huu unaelezea jinsi ya kuzuia uvujaji wa IP ili kulinda utambulisho wa seva yako.

Unachojenga

Tovuti ya onion ni seva ya kawaida ya wavuti inayojibu maombi kupitia mtandao wa Tor pekee. Sakinisha tor, ongeza mistari miwili kwenye /etc/tor/torrc, soma anwani ambayo tor inakuandikia, kisha unganisha nginx kwenye 127.0.0.1 ili kusiwe na kitu kinachojibu kwenye IP ya umma. Sehemu ya usakinishaji inachukua dakika kumi. Sehemu iliyobaki ya mwongozo huu ni orodha ya uvujaji, kwa sababu njia ya kawaida ambayo tovuti ya onion hushindwa ni usanidi wake wenyewe kuelekeza moja kwa moja kwa mwendeshaji.

Tor ilianza kama "the onion router", na huduma ya onion ni huduma unayoweza kuifikia kupitia mtandao huo pekee. Anwani ya toleo la 3 ina vibambo 56 ikifuatiwa na .onion, na vibambo hivyo ni ufunguo wa umma wa ed25519 wa huduma hiyo pamoja na checksum na baiti ya toleo, iliyosimbwa kwa base32. Anwani za toleo la 2 (vibambo 16) ziliondolewa kwenye mtandao mwaka 2021, kwa hivyo chochote unachozalisha leo ni v3. Anwani ndiyo ufunguo, jambo ambalo lina matokeo mawili. Muunganisho umesimbwa na kuthibitishwa kutoka mwisho hadi mwisho bila kuhusisha mamlaka ya cheti (certificate authority), na kupoteza faili ya ufunguo kunamaanisha kupoteza anwani hiyo kabisa.

Seva yako haikubali muunganisho wowote wa ndani (inbound). Tor huchagua relays chache kama sehemu za utangulizi (introduction points), hupakia descriptor iliyotiwa saini kwenye seva za saraka (directory servers), na kukutana na kila mgeni kwenye relay ya mkutano (rendezvous relay) iliyochaguliwa na mgeni huyo. Kila moja ya miunganisho hiyo ni ya kutoka (outbound) kutoka kwenye seva yako. Hakuna port ya kufungua na hakuna DNS record ya kuchapisha.

Sakinisha tor kutoka kwenye hazina ya Tor Project

Ubuntu inatoa kifurushi cha tor katika hazina ya universe, lakini kinabaki katika toleo lililokuwa la sasa wakati wa kufungia toleo hilo (release freeze). Hazina ya Tor Project yenyewe hufuata toleo thabiti la sasa, ambalo ndilo unalohitaji kwa programu inayotegemewa kuamua kama anwani yako inabaki kuwa yako.

sudo apt update
sudo apt install -y apt-transport-https gnupg wget
KEYURL=https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc
wget -qO- "$KEYURL" | gpg --dearmor | sudo tee /usr/share/keyrings/deb.torproject.org-keyring.gpg >/dev/null

Ingizo la hazina hutumia umbizo la deb822, na Suites lazima iwe jina la msimbo (codename) la Ubuntu yako. Lisome kutoka /etc/os-release badala ya kuliandika, kwa sababu jina la msimbo lisilo sahihi litakupa hazina inayotatuliwa vizuri lakini isiyo na vifurushi vya toleo lako.

. /etc/os-release
sudo tee /etc/apt/sources.list.d/tor.sources >/dev/null <<EOF
Types: deb deb-src
URIs: https://deb.torproject.org/torproject.org/
Suites: $VERSION_CODENAME
Components: main
Signed-By: /usr/share/keyrings/deb.torproject.org-keyring.gpg
EOF
sudo apt update
sudo apt install -y tor deb.torproject.org-keyring

Kifurushi cha deb.torproject.org-keyring huweka ufunguo wa kusaini (signing key) ukiwa wa sasa, ili mzunguko wa ufunguo usivunje apt update mwaka mmoja kuanzia sasa. Hakikisha kuwa tor imeanza na kufikia mtandao:

tor --version
sudo journalctl -u tor@default -n 20

Jarida (journal) linapaswa kuishia na Bootstrapped 100% (done): Done. Tor iliyokwama kwenye Bootstrapped 10% haina njia ya kutoka, kwa hivyo kagua firewall ya mtandao ya mtoa huduma wako na sheria zako za kutoka (egress rules): sudo ufw status verbose inapaswa kuonyesha allow (outgoing) kama chaguo-msingi.

Majina mawili ni muhimu kuanzia hapa. Kifurushi huendesha tor kama mtumiaji debian-tor, na kitengo kinachoendesha ni tor@default.service, kwa sababu tor.service kwenye Debian na Ubuntu ni kanga (wrapper) inayozunguka mfano huo (instance). Ulizia hali na majarida kwa jina la mfano huo na utapata mchakato halisi kila wakati.

Sanidi huduma ya onion katika torrc

Ongeza mistari miwili ifuatayo kwenye /etc/tor/torrc:

HiddenServiceDir /var/lib/tor/onion_site/
HiddenServicePort 80 127.0.0.1:8080

HiddenServiceDir ni mahali ambapo Tor huhifadhi funguo na anwani ya huduma hii. Usiitengeneze mwenyewe. Tor huitengeneza wakati wa kuanza ikiwa na mmiliki na ruhusa (mode) inayohitajika; saraka uliyotengeneza kama root itasababisha hitilafu ya kwanza katika orodha ya hitilafu hapa chini.

HiddenServicePort ina sehemu mbili, na kuzichanganya ni kosa la kwanza la kawaida. Nambari ya kwanza ni port ambayo mgeni huunganishia ndani ya tunnel, kwa hivyo 80 ndiyo inayotarajiwa na hakuna sababu ya kuibadilisha. Sehemu ya pili ni anwani ya ndani ambayo Tor hupeleka trafiki hiyo. HiddenServicePort 80 tupu hupeleka trafiki kwenye 127.0.0.1:80, kwa hivyo kuandika anwani kamili na kutumia port ya juu huweka onion vhost ikiwa imetengwa na huduma yoyote inayoweza kuwa inasikiliza kwenye 80.

sudo systemctl restart tor@default
sudo ls -l /var/lib/tor/onion_site/

Orodha hiyo inapaswa kuwa na hostname, hs_ed25519_public_key, hs_ed25519_secret_key na saraka tupu ya authorized_clients.

Soma anwani yako ya .onion

sudo cat /var/lib/tor/onion_site/hostname

Mstari mmoja utarejeshwa: herufi 56 za base32 na .onion. Mfululizo huo wa herufi ndio utambulisho kamili wa tovuti hiyo. Hakuna anayeikabidhi, hakuna anayeweza kuihamisha, na hakuna anayeweza kuiondoa ukiwa unashikilia faili ya ufunguo (key file). Nakili sasa, kwa sababu kila usanidi hapa chini unaihitaji. Sehemu iliyobaki ya mwongozo huu inaiandika kama <your-address>.onion.

Hudumia tovuti kutoka nginx iliyofungwa kwenye 127.0.0.1

sudo apt install -y nginx
sudo install -d -m 755 /srv/onion

Andika /etc/nginx/sites-available/onion:

server {
    listen 127.0.0.1:8080;
    server_name <your-address>.onion;

    root /srv/onion;
    index index.html;

    server_tokens off;
    etag off;
    access_log off;
    error_log /var/log/nginx/onion.error.log error;
}
echo '<h1>hello from the onion</h1>' | sudo tee /srv/onion/index.html
sudo ln -s /etc/nginx/sites-available/onion /etc/nginx/sites-enabled/onion
sudo nginx -t
sudo systemctl reload nginx

Sasa thibitisha mambo mawili kutoka kwa seva. La kwanza ni kwamba nginx inajibu kwa jina la onion, ambalo ndilo header kamili ya Host ambayo tor itatuma:

curl -s -H 'Host: <your-address>.onion' http://127.0.0.1:8080/

La pili ni kwamba inajibu hapo na si mahali pengine popote:

sudo ss -tlnp | grep 8080

Safu ya anwani lazima isomeke 127.0.0.1:8080. Ikiwa inasomeka 0.0.0.0:8080 au *:8080, tovuti yako ya onion pia iko kwenye mtandao wa umma, jambo ambalo ni kipengee cha kwanza katika orodha ya uvujaji. Mstari wa listen 8080; usio na anwani hufunga kila interface, na hiyo ndiyo hali chaguo-msingi.

Fungua anwani hiyo katika Tor Browser. Upakiaji wa kwanza huchukua sekunde chache wakati mteja anapopakua descriptor yako na kujenga rendezvous circuit.

Nyaraka za Tor Project zenyewe hupendelea unix socket badala ya loopback port: HiddenServicePort 80 unix:/var/run/tor/onion_site.sock, huku nginx ikisikiliza kwenye njia hiyo. Socket haiwezi kufikiwa kutoka kwa host nyingine yoyote, hata kama seva itapata interface ya pili baadaye. Gharama yake ni ruhusa za faili, kwa sababu nginx hutengeneza socket na tor huunganishwa nayo kama debian-tor, kwa hivyo watumiaji wote wawili lazima wakubaliane kuhusu saraka hiyo. Loopback yenye matokeo yaliyothibitishwa ya ss ni rahisi zaidi kuweka sawa, na ndiyo inayotumiwa katika mwongozo huu wote.

Tovuti ikiwa kwenye loopback, seva haihitaji sheria yoyote ya inbound kwa ajili yake. Weka 22 wazi kwa ajili yako na kataa nyingine zote (ufw defaults worth setting on a VPS). Kumbuka kwamba firewall haibatilishi huduma inayofunga 0.0.0.0, inachuja tu pakiti zinazofika kwenye firewall. Containers hufanya hili kuwa gumu zaidi, kwa sababu publishing a Docker port writes iptables rules ahead of ufw, kwa hivyo -p 8080:80 huweka backend yako ya onion kwenye IP ya umma wakati ufw bado inaripoti port hiyo kama iliyokataliwa. Chapisha port za container kama -p 127.0.0.1:8080:80.

Uvujaji unaoondoa utambulisho wa siri wa onion site

Tor huficha mahali seva ilipo. Hakuna kitu ndani ya Tor kinachoficha kile seva inachosema. Kila kipengele hapa chini ni kitu ambacho stack yako inachapisha.

Tovuti hiyo hiyo ikijibu kwenye IP yako ya umma

Hili ndilo kosa linalowakamata watu wengi. Skana hufuatilia majibu ya HTTP ya kila anwani inayoweza kufikika kila mara, na matokeo hayo ni ya umma na yanaweza kutafutwa. Ukitoa ukurasa uleule kwenye IP yako ya umma na kwenye anwani yako ya onion, kuviunganisha ni swali moja tu: kichwa cha habari kilekile, favicon hash ileile, ETag ileile, na mpangilio wa header uleule. Mstari wa listen 127.0.0.1:8080; hapo juu ndio suluhisho. Ithibitishe kutoka kwa mashine nyingine, si kutoka kwenye seva yenyewe:

curl -sv --max-time 5 http://<your-public-ip>:8080/

Connection refused au muda kuisha (timeout) ndio matokeo sahihi. HTML yoyote inamaanisha tovuti ni ya umma. Ikiwa seva hiyo hiyo inaendesha tovuti ya clearnet, ipe vhost hiyo root yake yenyewe na uweke block ya default_server iliyo wazi kwenye listener ya umma, ili header ya Host isiyolingana isije ikaangukia kwenye vhost ya onion.

Mabango ya toleo (Version banners)

curl -sI http://127.0.0.1:8080/ | grep -i '^server'

Nginx ya kawaida hujibu Server: nginx/1.24.0. Mstari huo wa toleo, pamoja na mpangilio kamili wa header nyingine, ni alama ya vidole (fingerprint) inayolinganisha onion yako na host yako ya clearnet. server_tokens off; hupunguza hilo hadi Server: nginx. Haiondoi header hiyo, na nginx haina directive ya ndani inayofanya hivyo, kwa hiyo moduli ya headers-more ndiyo jibu la kawaida ikiwa unataka iondoke. PHP huongeza X-Powered-By hadi utakapoweka expose_php = Off. etag off; ni ya orodha hiyo hiyo, kwa sababu nginx hujenga ETag kutoka kwa muda wa marekebisho ya faili na ukubwa wake, kwa hiyo faili zilezile zikinakiliwa kwenye seva mbili hutoa ETag ileile kwenye zote mbili.

URL kamili zinazoelekeza kwenye domain yako ya clearnet

Tag ya rel="canonical", Open Graph og:url, RSS feed, sitemap, barua pepe ya kuweka upya nenosiri, au URL ya nembo iliyoandikwa moja kwa moja (hardcoded). Yoyote kati ya hayo hutaja tovuti ya clearnet ndani ya ukurasa unaotolewa kupitia onion. Tumia njia za root-relative kama /static/logo.svg, na uiruhusu programu isome base URL yake kutoka kwa request host badala ya thamani isiyobadilika (constant). Redirects ni hitilafu hiyo hiyo mahali pengine: return 301 https://example.com$request_uri; katika block ya catch-all humtuma mgeni wa onion kwenye domain yako halisi, na header ya Location huwapa jibu moja kwa moja.

Cheti cha TLS kinachoshirikiwa na tovuti ya clearnet

Anwani ya onion hujithibitisha yenyewe, kwa sababu anwani hiyo ndiyo ufunguo wa umma (public key), kwa hiyo http:// kupitia muunganisho wa onion tayari imesimbwa mwisho hadi mwisho na Tor Browser huichukulia kama mazingira salama. Kusakinisha cheti chako kilichopo kwenye vhost ya onion huchapisha kiungo kati ya hizo mbili, kwa sababu kila cheti kinachoaminika hadharani hurekodiwa kwenye logi za Certificate Transparency, na logi hizo ni za umma, za kudumu, na zinaweza kutafutwa kwa jina. Weka cheti cha Let's Encrypt kwenye vhost ya clearnet na uache vhost ya onion kwenye HTTP ya kawaida.

Fonti na analytics za watu wengine

Fonti kutoka kwa CDN (content delivery network), au script ya analytics. Kivinjari cha mgeni huchota kila moja moja kwa moja, kwa hiyo mtu wa tatu hujua kuwa kuna mtu alipakia ukurasa wako na kwa kawaida ni ukurasa upi, na viwango vikali vya usalama vya Tor Browser huzuia ombi hilo hata hivyo, na kusababisha mpangilio wa ukurasa kuvurugika. Host kila rasilimali inayohitajika na ukurasa wako mwenyewe.

Kutolingana kwa Host header

Ikiwa server_name hailingani na header ya Host inayotumwa na tor, nginx hurudi kwenye seva ya msingi (default server) kwa anwani hiyo ya kusikiliza. Kwenye seva yenye vhost moja hili halionekani, kwa sababu block pekee ya seva ndiyo pia ya msingi. Ukiongeza vhost ya clearnet baadaye, maombi ya onion yanaweza kuanza kuangukia huko, pamoja na canonical tags zake na redirects zake. Fanya tena ukaguzi wa curl -H 'Host: ...' baada ya kila mabadiliko ya nginx, na utumie grep kwenye matokeo ili kutafuta domain yako halisi:

curl -s -H 'Host: <your-address>.onion' http://127.0.0.1:8080/ | grep -o 'https\?://[^"]*' | sort -u

Kujua ni mchakato upi unaomiliki socket ipi ni sehemu kubwa ya kazi hii (jinsi ports na listening sockets zinavyofanya kazi kwenye Linux).

Nini kinabaki kwenye logi

Kila ombi hufika kutoka 127.0.0.1, kwa hiyo nginx haina anwani ya mgeni ya kurekodi na access_log off; haikugharimu chochote. Programu iliyo juu yake ni suala tofauti, kwa kuwa agizo, anwani ya barua pepe, au metadata ya faili iliyopakiwa ni yako ya kushughulikia. Tabia zako mwenyewe pia huhesabika: kusimamia seva kupitia login isiyoimarishwa (unhardened) iko nje ya chochote kinacholindwa na Tor, kwa hiyo chukulia kuimarisha SSH kwenye VPS hiyo hiyo kama sehemu ya ujenzi huu.

Hifadhi nakala ya private key, kwa sababu ndiyo anwani yenyewe

/var/lib/tor/onion_site/hs_ed25519_secret_key ndiyo huduma husika. Hakuna msajili na hakuna njia ya kurejesha data. Ukiipoteza, anwani hiyo imepotea. Ukiinakili, yeyote anayeshikilia nakala hiyo anaweza kuhudumia maudhui yake mwenyewe kupitia anwani yako, bila wewe kuwa na uwezo wa kubatilisha chochote.

sudo systemctl stop tor@default
sudo tar -C /var/lib/tor -czf onion-keys.tgz onion_site
sudo chmod 600 onion-keys.tgz
sudo systemctl start tor@default

Ficha nakala hiyo (gpg -c onion-keys.tgz) kwa njia ya encryption na uihamishe kutoka kwenye seva. Kurejesha huduma kwenye VPS mpya kunahitaji nakala hiyo pamoja na umiliki ambao tor inatarajia:

sudo systemctl stop tor@default
sudo tar -C /var/lib/tor -xzf onion-keys.tgz
sudo chown -R debian-tor:debian-tor /var/lib/tor/onion_site
sudo chmod 700 /var/lib/tor/onion_site
sudo systemctl start tor@default
sudo cat /var/lib/tor/onion_site/hostname

Anwani ileile itarejea kwenye vifaa vipya, dakika moja au mbili baada ya tor kuchapisha upya descriptor. Hiyo ndiyo hatua nzima ya uhamiaji: hakuna mabadiliko ya DNS na hakuna haja ya kutoa cheti upya.

Onion-Location, wakati tovuti ipo pia kwenye clearnet

Ikiwa onion ni kwa ajili ya urahisi badala ya usiri, itangaze kutoka kwenye vhost ya clearnet:

add_header Onion-Location http://<your-address>.onion$request_uri;

Tor Browser kisha huonyesha kitufe cha .onion available kwenye upau wa anwani na kutoa chaguo la kubadili. Header hii hutekelezwa tu wakati ukurasa wa clearnet unahudumiwa kupitia HTTPS na thamani yake ni URL halali ya onion.

Sheria moja ya nginx huleta changamoto hapa. Maelekezo ya add_header hurithiwa na block ya location pale tu block hiyo inapokuwa haina maelekezo yake yenyewe, kwa hivyo location yenye add_header yake yenyewe huondoa Onion-Location kimyakimya. Iirudie hapo, au weka headers zote za majibu mahali pamoja. Kuchapisha header hii kwa makusudi huunganisha tovuti hizo mbili, jambo ambalo ni sahihi kwa kioo (mirror) na si sahihi kwa kitu chochote kinachokusudiwa kubaki bila kuunganishwa.

Anwani za vanity

mkp224o hutengeneza jozi za funguo (key pairs) hadi pale moja itakapozalisha anwani inayoanza na kiambishi awali (prefix) ulichokiomba. Hii ni mbinu ya brute force, kwa hivyo hakuna cha kusanidi zaidi ya kiambishi awali na muda ambao uko tayari kusubiri.

sudo apt install -y git gcc libc6-dev libsodium-dev make autoconf
git clone https://github.com/cathugger/mkp224o
cd mkp224o
./autogen.sh
./configure --enable-amd64-51-30k
make
./mkp224o -d onionkeys blog

Kila matokeo yanayopatikana huwekwa kwenye onionkeys/<address>.onion/ yakiwa na hostname na hs_ed25519_secret_key. Isakinishe kwa kusimamisha tor, kunakili saraka hiyo juu ya HiddenServiceDir yako, kisha kutumia chown na chmod 700 zilezile kama ilivyoelezwa kwenye urejeshaji hapo juu.

Urefu wa kiambishi awali ndio gharama nzima. Anwani hiyo iko katika mfumo wa base32, kwa hivyo kila herufi ya ziada unayohitaji huzidisha idadi ya funguo zinazotarajiwa kwa 32. Kiambishi awali kifupi hukamilika kwenye kompyuta ya mkononi. Kiambishi awali kirefu hakikamiliki kwenye kifaa chochote unachomiliki. Kiambishi awali cha vanity pia huwafundisha wasomaji kutambua herufi chache za kwanza badala ya anwani nzima, na hiyo ndiyo tabia ambayo tovuti ghushi za onion (phishing sites) hujengwa juu yake.

Njia za kufeli, pamoja na ujumbe utakaouona

Hakuna faili ya hostname baada ya kuanzisha upya. Tor haikuanza, au ilikataa saraka hiyo. sudo journalctl -u tor@default -n 50 inaitaja hivi:

/var/lib/tor/onion_site/ is not owned by this user (debian-tor, 108) but by root (0). Perhaps you are running Tor as the wrong user?

Hivyo ndivyo saraka iliyoundwa kwa mkono inavyoonekana. Rekebisha umiliki (ownership) na mode, au futa saraka hiyo na uiruhusu Tor iijenge yenyewe.

Tor Browser inaonyesha Onionsite Not Found (0xF0). Mteja hakuweza kupata descriptor, kwa hivyo kwa mtandao, hakuna kitu kilichochapishwa kwenye anwani hiyo. Thibitisha kuwa Tor inafanya kazi na imekamilisha bootstrap, linganisha anwani uliyoiandika na sudo cat /var/lib/tor/onion_site/hostname herufi kwa herufi, kisha angalia saa. Tor inahitaji muda sahihi ili kuchapisha na kuhakiki descriptors, na timedatectl inapaswa kuripoti System clock synchronized: yes.

Anwani inatatuliwa lakini ukurasa haupakii. Tor ilikamilisha rendezvous kisha ikafeli kwenye hop ya mwisho, kutoka Tor kwenda Nginx, na hop hiyo ni ya ndani kwa hivyo log ya Tor inabaki kimya. Endesha curl -sI http://127.0.0.1:8080/ kwenye seva. Connection refused inamaanisha Nginx imezimwa au inasikiliza kwenye anwani tofauti na ile ambayo HiddenServicePort inaelekeza.

Ukurasa unapakia na kila kiungo kinaelekea kwenye domain yako halisi. Hizi ni Absolute URLs kwenye templates. Endesha ukaguzi wa grep -o 'https\?://[^"]*' hapo juu na urekebishe kile inachochapisha kabla ya kushiriki anwani hiyo popote.

Inafanya kazi, kisha inasimama baada ya reboot. Anzisha upya seva (reboot) mara moja kwa makusudi kabla ya kutegemea tovuti hiyo, kisha endesha sudo systemctl status tor@default na sudo systemctl status nginx. Huduma iliyoanzishwa kwa mkono na mtu inaonekana sawa na ile iliyowezeshwa (enabled) hadi mashine itakapowaka upya.

FAQ

Do I need to open a port in my firewall for a Tor onion service?

No. The tor daemon makes only outbound connections, to the directory servers, to its introduction points and to each rendezvous relay, so no inbound rule is needed and the web server itself listens on 127.0.0.1. Keep ufw at default deny for incoming traffic with SSH allowed. The same property means an onion service works from a machine behind NAT (network address translation) with no public IP at all.

Why can I not reach my .onion address in Tor Browser?

Work outward from the server. sudo journalctl -u tor@default -n 50 should show Bootstrapped 100% (done): Done, then curl -sI http://127.0.0.1:8080/ on the server should return a status line, then compare the address you typed against the hostname file, since one wrong character is simply a different service. Onionsite Not Found (0xF0) means no descriptor was found for the address, which usually means tor is not running or the system clock is wrong.

Can I move my onion site to a new server and keep the same address?

Yes. The address is derived from hs_ed25519_secret_key, so copy the whole HiddenServiceDir to the new box, set it to debian-tor ownership and mode 700, and start tor. The address is live again once the descriptor is republished, and there is no DNS record to update. Lose that file and the address is unrecoverable, so back it up encrypted and off the server the day you create it.

Does an onion site need an HTTPS certificate?

No. The 56-character address is the service's public key, so the connection is already encrypted and authenticated end to end, and Tor Browser treats http:// on a .onion name as a secure context. Reusing your clearnet certificate on the onion vhost is worse than doing nothing, because Certificate Transparency logs are public and permanently record which names share a certificate. The only reason to buy a certificate for a .onion name is brand assurance from a CA that issues them, and that link is public by design.