Paano Mag-host ng .onion Site sa VPS
Magpatakbo ng v3 onion service sa Ubuntu gamit ang tor at nginx sa loopback. Alamin ang eksaktong config para maiwasang maiugnay ang .onion address sa public IP.
Ano ang ginagawa mo
Ang onion site ay isang karaniwang web server na tumatanggap lamang ng request sa Tor network. I-install ang Tor, magdagdag ng dalawang linya sa /etc/tor/torrc, basahin ang address na isinusulat ng Tor para sa iyo, at i-bind ang nginx sa 127.0.0.1 upang walang serbisyong sumagot sa public IP. Sampung minuto ang kailangan para sa installation. Ang natitirang bahagi ng guide na ito ay listahan ng mga posibleng leak, dahil karaniwang pumapalya ang onion site kapag ang sarili nitong configuration ay direktang bumabalik sa operator.
Nagsimula ang Tor bilang "the onion router", at ang onion service ay serbisyong maa-access lamang sa pamamagitan nito. Ang version 3 address ay may 56 na character na sinusundan ng .onion. Ang mga character na ito ay ed25519 public key ng service, kasama ang checksum at version byte, na naka-encode sa base32. Inalis sa network ang version 2 address na may 16 na character noong 2021, kaya v3 ang anumang gagawin mo ngayon. Ang address mismo ang key, at may dalawang mahalagang resulta ito. Naka-encrypt at authenticated end to end ang connection nang walang certificate authority. Kapag nawala ang key file, mawawala na rin nang tuluyan ang address.
Hindi kailanman tumatanggap ang server mo ng inbound connection. Pumipili ang Tor ng ilang relay bilang introduction point, nag-a-upload ng signed descriptor sa directory server, at nakikipag-ugnayan sa bawat visitor sa rendezvous relay na pinili ng visitor. Outbound mula sa server mo ang bawat isa sa mga connection na ito. Walang port na kailangang buksan at walang DNS record na kailangang i-publish.
Mag-install ng tor mula sa repository ng Tor Project
May tor package ang Ubuntu sa universe, pero nananatili ito malapit sa bersyong kasalukuyan noong nag-freeze ang release. Sinusubaybayan ng sariling repository ng Tor Project ang kasalukuyang stable release. Ito ang kailangan mo para sa software na nagpapasya kung mananatiling sa iyo ang iyong address.
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/nullGumagamit ang repository entry ng deb822 format, at dapat na ang Suites ay codename ng Ubuntu mo. Basahin ito mula sa /etc/os-release sa halip na manu-manong i-type, dahil kapag mali ang codename, maaayos na nagre-resolve ang repository pero wala itong packages para sa release mo.
. /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-keyringPinananatiling napapanahon ng deb.torproject.org-keyring package ang signing key, kaya hindi masisira ng key rotation ang apt update paglipas ng isang taon. Tiyaking nagsimula ang tor at nakakonekta ito sa network:
tor --version
sudo journalctl -u tor@default -n 20Dapat magtapos ang journal sa Bootstrapped 100% (done): Done. Kapag natigil ang tor sa Bootstrapped 10%, wala itong outbound path. Suriin ang network firewall ng provider mo at ang sarili mong egress rules: dapat ipakita ng sudo ufw status verbose ang allow (outgoing) bilang default.
Dalawang pangalan ang mahalaga mula rito. Pinapatakbo ng package ang tor bilang user na debian-tor, at ang tumatakbong unit ay tor@default.service, dahil ang tor.service sa Debian at Ubuntu ay wrapper para sa instance. Humingi ng status at logs gamit ang pangalan ng instance para palagi mong makuha ang aktuwal na process.
I-configure ang onion service sa torrc
Idagdag ang dalawang linya sa /etc/tor/torrc:
HiddenServiceDir /var/lib/tor/onion_site/
HiddenServicePort 80 127.0.0.1:8080Ang HiddenServiceDir ang lokasyon kung saan iniimbak ng Tor ang mga key at address para sa service na ito. Huwag mo itong gawin nang mano-mano. Ginagawa ito ng Tor sa pagsisimula, gamit ang kinakailangang owner at mode. Kapag ginawa mo ang directory bilang root, lalabas ang unang failure sa listahan ng mga failure sa ibaba.
May dalawang bahagi ang HiddenServicePort, at ang pagpapalit sa pagkakasunod ng mga ito ang karaniwang unang pagkakamali. Ang unang numero ay ang port na kinokonektahan ng visitor sa loob ng tunnel, kaya ang 80 ang karaniwang inaasahan at wala itong kailangang baguhin. Ang ikalawang bahagi ay ang local address kung saan ipinapasa ng Tor ang traffic. Ang isang simpleng HiddenServicePort 80 ay nagpapasa sa 127.0.0.1:80. Kaya, kapag isinulat nang buo ang address at gumamit ng high port, hindi maaapektuhan ng onion vhost ang anumang kasalukuyang nakikinig sa port 80.
sudo systemctl restart tor@default
sudo ls -l /var/lib/tor/onion_site/Dapat naglalaman ang listing ng hostname, hs_ed25519_public_key, hs_ed25519_secret_key, at isang walang-lamang authorized_clients directory.
Basahin ang iyong .onion address
sudo cat /var/lib/tor/onion_site/hostnameIsang linya ang lalabas: 56 na base32 character at .onion. Ang string na iyon ang buong identity ng site. Walang nagtatalaga nito, walang makapaglilipat nito, at walang makakakuha nito habang nasa iyo ang key file. Kopyahin ito ngayon dahil kailangan ito ng lahat ng configuration sa ibaba. Isinusulat ito ng natitirang bahagi ng gabay na ito bilang <your-address>.onion.
Ihatid ang site mula sa nginx na nakabind sa 127.0.0.1
sudo apt install -y nginx
sudo install -d -m 755 /srv/onionIsulat ang /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 nginxNgayon, patunayan ang dalawang bagay mula sa server. Una, tumutugon ang nginx para sa onion name, na siyang eksaktong Host header na ipapadala ng tor:
curl -s -H 'Host: <your-address>.onion' http://127.0.0.1:8080/Ikalawa, tumutugon ito roon at wala nang iba pa:
sudo ss -tlnp | grep 8080Dapat 127.0.0.1:8080 ang mabasa sa address column. Kung 0.0.0.0:8080 o *:8080 ang mabasa, nasa public internet din ang onion site mo. Ito ang unang item sa listahan ng mga leak. Ang listen 8080; line na walang address ay nagb-bind sa lahat ng interface. Ito ang default.
Buksan ang address sa Tor Browser. Aabutin ng ilang segundo ang unang load habang kinukuha ng client ang descriptor mo at bumubuo ng rendezvous circuit.
Mas pinapaboran ng sariling documentation ng Tor Project ang unix socket kaysa loopback port: HiddenServicePort 80 unix:/var/run/tor/onion_site.sock, kung saan nakikinig ang nginx sa path na iyon. Hindi maaabot mula sa ibang host ang socket, kahit magkaroon pa ang box ng ikalawang interface. Ang kapalit nito ay file permissions, dahil ginagawa ng nginx ang socket at kumokonekta rito ang tor bilang debian-tor. Kaya kailangang magkasundo ang dalawang user sa directory. Mas madaling i-configure nang tama ang loopback kapag na-verify ang output ng ss, at ito ang ipinapalagay ng natitirang bahagi ng guide na ito.
Kapag nasa loopback ang site, hindi na kailangan ng box ng inbound rule para rito. Panatilihing bukas ang 22 para sa sarili mong access at i-deny ang iba (mga ufw default na dapat i-set sa isang VPS). Tandaan na hindi ina-undo ng firewall ang isang service na nagbi-bind sa 0.0.0.0. Sinasala lamang nito ang mga packet na umaabot sa firewall. Mas mahalaga ito sa mga container, dahil ang pag-publish ng Docker port ay nagsusulat ng iptables rules bago ang ufw. Dahil dito, inilalagay ng -p 8080:80 ang onion backend sa public IP kahit iniulat pa rin ng ufw na denied ang port. I-publish ang mga container port bilang -p 127.0.0.1:8080:80.
Mga leak na nag-aalis ng anonymity ng isang onion site
Itinatago ng Tor kung nasaan ang server. Walang itinatago ang Tor sa sinasabi ng server. Ang bawat item sa ibaba ay impormasyong inilalabas ng sarili mong stack.
Ang parehong site na sumasagot sa iyong public IP
Ito ang madalas nakakaligtaan. Patuloy na ini-index ng mga scanner ang HTTP response ng bawat routable address, at public at searchable ang mga resultang iyon. I-serve ang parehong page sa iyong public IP at onion address, at isang query lang ang kailangan para pagdugtungin ang mga ito: parehong title, parehong favicon hash, parehong ETag, at parehong pagkakasunod-sunod ng mga header. Ang listen 127.0.0.1:8080; line sa itaas ang solusyon. I-verify ito mula sa ibang machine, hindi mula sa server:
curl -sv --max-time 5 http://<your-public-ip>:8080/Ang Connection refused o timeout ang tamang resulta. Anumang HTML ay nangangahulugang public ang site. Kung nagpapatakbo rin ang box ng clearnet site, bigyan ang vhost na iyon ng sarili nitong root at magpanatili ng tahasang default_server block sa public listener, upang hindi kailanman mapunta ang hindi tugmang Host header sa onion vhost.
Mga version banner
curl -sI http://127.0.0.1:8080/ | grep -i '^server'Sumasagot ang default na nginx ng Server: nginx/1.24.0. Ang version string na iyon, kasama ang eksaktong pagkakasunod-sunod ng iba pang mga header, ay fingerprint na maaaring magtugma sa iyong onion site at clearnet host. Binabawasan ito ng server_tokens off; sa Server: nginx. Hindi nito inaalis ang header, at walang built-in directive ang nginx para gawin iyon, kaya karaniwang ginagamit ang headers-more module kung gusto mo itong tuluyang alisin. Nagdaragdag ang PHP ng X-Powered-By hanggang itakda mo ang expose_php = Off. Isama rin ang etag off; sa parehong listahan, dahil binubuo ng nginx ang ETag mula sa modification time at size ng file. Dahil dito, parehong ETag ang ibinibigay ng parehong mga file kapag kinopya sa dalawang server.
Mga absolute URL na tumuturo sa iyong clearnet domain
Isang rel="canonical" tag, isang Open Graph og:url, RSS feed, sitemap, password reset email, o hardcoded logo URL. Kahit isa sa mga ito ay naglalagay ng pangalan ng clearnet site sa loob ng page na sine-serve sa onion. Gumamit ng root-relative path gaya ng /static/logo.svg, at hayaang kunin ng application ang base URL mula sa request host sa halip na gumamit ng constant. Pareho lang na bug ang redirects sa ibang bahagi: ipinapadala ng return 301 https://example.com$request_uri; sa catch-all block ang onion visitor sa iyong totoong domain, at direktang ibinibigay sa kanila ng Location header ang sagot.
TLS certificate na kapareho ng ginagamit ng clearnet site
Awtomatikong ina-authenticate ng onion address ang sarili nito dahil ang address ang public key. Kaya ang http:// sa isang onion connection ay naka-encrypt na end to end, at itinuturing ito ng Tor Browser na secure context. Kapag inilagay mo ang dati mong certificate sa onion vhost, inilalantad nito ang ugnayan ng dalawang site. Naitatala kasi ang bawat certificate na pinagkakatiwalaan ng publiko sa Certificate Transparency logs, at public, permanente, at searchable ayon sa pangalan ang mga log na iyon. Panatilihin ang Let’s Encrypt certificates sa clearnet vhost at iwan ang onion vhost sa plain HTTP.
Mga third-party font at analytics
Font mula sa CDN (content delivery network), o analytics script. Direktang kinukuha ng browser ng visitor ang bawat isa, kaya nalalaman ng third party na may nag-load ng iyong page at karaniwan pati kung aling page iyon. Hinaharang din naman ng mas mahigpit na security level ng Tor Browser ang request, kaya maaaring masira ang layout. I-self-host ang lahat ng asset na kailangan ng page.
Hindi nagtutugmang Host header
Kung hindi tumutugma ang server_name sa Host header na ipinapadala ng tor, nagfa-fallback ang nginx sa default server para sa listen address na iyon. Sa isang box na may iisang vhost, hindi ito mapapansin dahil ang tanging server block ang siya ring default. Kapag nagdagdag ka kalaunan ng clearnet vhost, maaaring mapunta rito ang mga onion request, kasama ang canonical tag at mga redirect nito. Ulitin ang curl -H 'Host: ...' check pagkatapos ng bawat pagbabago sa nginx, at gamitin ang grep sa resulta para hanapin ang iyong totoong domain:
curl -s -H 'Host: <your-address>.onion' http://127.0.0.1:8080/ | grep -o 'https\?://[^"]*' | sort -uMalaking bahagi ng gawaing ito ang pagtukoy kung aling process ang may-ari ng bawat socket (kung paano gumagana ang ports at listening sockets sa Linux).
Ang natitira sa mga log
Lahat ng request ay dumarating mula sa 127.0.0.1, kaya walang visitor address na mai-log ang nginx at wala kang kailangang gastusin para sa access_log off;. Ibang usapin ang application sa ibabaw nito, dahil responsibilidad mong pangasiwaan ang order, email address, o metadata ng uploaded file. Mahalaga rin ang sarili mong mga gawi: ang pag-administer ng box gamit ang hindi hardened na login ay hindi saklaw ng anumang proteksiyong ibinibigay ng Tor. Ituring ang SSH hardening sa parehong VPS bilang bahagi ng build na ito.
Mag-backup ng private key, dahil ito ang address
/var/lib/tor/onion_site/hs_ed25519_secret_key ang service. Walang registrar at walang recovery. Kapag nawala ito, mawawala ang address. Kopyahin ito, at maaaring mag-serve ng sarili nilang content sa address mo ang sinumang may hawak ng kopya, nang wala kang paraan para i-revoke ang anuman.
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@defaultI-encrypt ang archive na iyon (gpg -c onion-keys.tgz) at ilipat ito palabas ng server. Ang pag-restore sa bagong VPS ay binubuo ng archive at ng ownership na inaasahan ng tor:
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/hostnameBabalik ang parehong address sa bagong hardware, isa o dalawang minuto matapos muling i-publish ng tor ang descriptor. Iyon lang ang buong migration: walang pagbabago sa DNS at walang muling pag-isyu ng certificate.
Onion-Location kapag nasa clearnet din ang site
Kung convenience lang ang onion address at hindi ito lihim, i-advertise ito mula sa clearnet vhost:
add_header Onion-Location http://<your-address>.onion$request_uri;Ipapakita ng Tor Browser ang .onion available button sa address bar at iaalok ang paglipat. Tinatanggap lang ang header kapag inihahatid ang clearnet page sa HTTPS at valid na onion URL ang value.
May isang mahalagang tuntunin sa nginx. Namamana lang ng isang location block ang mga add_header directive kapag wala itong sarili nitong mga directive, kaya tahimik na inaalis ng location na may sarili nitong add_header ang Onion-Location. Ulitin ang header doon, o ilagay sa iisang lugar ang lahat ng response header. Sinasadyang pinag-uugnay ng pag-publish ng header na ito ang dalawang site. Tama ito para sa mirror, pero mali para sa anumang site na dapat manatiling hindi magkakaugnay.
Mga Vanity Address
Ang mkp224o ay paulit-ulit na gumagawa ng mga key pair hanggang sa may makabuo ng address na nagsisimula sa prefix na hiniling mo. Brute-force search ito, kaya wala nang kailangang i-configure bukod sa prefix at kung gaano katagal kang handang maghintay.
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 blogNapupunta ang bawat nahanap na address sa onionkeys/<address>.onion/ na naglalaman ng hostname at hs_ed25519_secret_key. Para mag-install ng isa, ihinto ang tor, kopyahin ang directory na iyon sa iyong HiddenServiceDir, at pagkatapos ay ilapat ang parehong chown at chmod 700 na ginamit sa restore sa itaas.
Ang haba ng prefix ang pangunahing katumbas na gastos. Base32 ang address, kaya sa bawat karagdagang character na hinihingi mo, namumultiply nang 32 ang inaasahang dami ng key na kailangang subukan. Mabilis matapos ang maikling prefix sa isang laptop. Hindi matatapos ang mahaba sa anumang device na pagmamay-ari mo. Itinuturo rin ng vanity prefix sa mga mambabasa na kilalanin ang unang ilang character sa halip na ang buong address. Ito ang ugaling sinasamantala ng mga phishing copy ng onion site.
Mga failure mode at ang mga string na makikita mo
Walang hostname file pagkatapos ng restart. Hindi nagsimula ang Tor, o hindi nito tinanggap ang directory. Tinutukoy ito ng sudo journalctl -u tor@default -n 50:
/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?Ganito ang hitsura ng directory na manu-manong ginawa. Ayusin ang ownership at mode, o tanggalin ang directory at hayaan ang Tor na gumawa nito.
Ipinapakita ng Tor Browser ang Onionsite Not Found (0xF0). Hindi nakakuha ang client ng descriptor, kaya para sa network ay walang naka-publish sa address na iyon. Tiyaking tumatakbo at naka-bootstrap ang Tor, ihambing character by character ang inilagay mong address sa sudo cat /var/lib/tor/onion_site/hostname, at suriin ang clock. Kailangan ng Tor ng tamang oras para mag-publish at mag-validate ng mga descriptor, at dapat mag-report ang timedatectl ng System clock synchronized: yes.
Naresolba ang address pero hindi kailanman naglo-load ang page. Nakumpleto ng Tor ang rendezvous, pero nabigo ito sa huling hop, mula Tor papunta sa nginx. Local ang hop na iyon kaya walang lumalabas sa Tor log. Patakbuhin ang curl -sI http://127.0.0.1:8080/ sa server. Ibig sabihin ng Connection refused ay naka-down ang nginx o nakikinig ito sa ibang address kaysa sa tinutukoy ng HiddenServicePort.
Naglo-load ang page pero napupunta ang bawat link sa iyong totoong domain. May absolute URL sa mga template. Patakbuhin ang grep -o 'https\?://[^"]*' check sa itaas at ayusin ang inilalabas nito bago mo ibahagi ang address kahit saan.
Gumagana ito, pagkatapos ay humihinto kapag nag-reboot. Sadyang i-reboot nang isang beses ang machine bago mo asahan ang site, pagkatapos ay patakbuhin ang sudo systemctl status tor@default at sudo systemctl status nginx. Magkapareho ang hitsura ng serbisyong manu-manong sinimulan at ng naka-enable na service hanggang sa mag-restart ang machine.
FAQ
Kailangan ko bang magbukas ng port sa firewall para sa isang Tor onion service?
Hindi. Ang tor daemon ay gumagawa lamang ng outbound connections papunta sa directory servers, introduction points nito, at bawat rendezvous relay. Dahil dito, walang inbound rule na kailangan at ang web server mismo ay nakikinig sa 127.0.0.1. Panatilihing default deny ang ufw para sa incoming traffic, at payagan ang SSH. Dahil dito, gumagana ang onion service mula sa machine na nasa likod ng NAT (network address translation), kahit wala itong public IP.
Bakit hindi ko ma-access ang aking .onion address sa Tor Browser?
Magsimula sa server at suriin palabas. Dapat ipakita ng sudo journalctl -u tor@default -n 50 ang Bootstrapped 100% (done): Done. Pagkatapos, dapat magbalik ang curl -sI http://127.0.0.1:8080/ sa server ng isang status line. Ihambing din ang address na inilagay mo sa hostname file, dahil ang isang maling character ay tumutukoy sa ibang service. Ang Onionsite Not Found (0xF0) ay nangangahulugang walang descriptor na natagpuan para sa address. Karaniwan itong nangyayari kapag hindi tumatakbo ang tor o mali ang system clock.
Maaari ko bang ilipat ang aking onion site sa bagong server at panatilihin ang parehong address?
Oo. Ang address ay hinango mula sa hs_ed25519_secret_key. Kaya kopyahin ang buong HiddenServiceDir sa bagong machine, itakda ang ownership nito sa debian-tor at ang mode sa 700, at simulan ang tor. Magiging live muli ang address kapag na-republish na ang descriptor. Walang DNS record na kailangang i-update. Kapag nawala ang file na iyon, hindi na mare-recover ang address. Kaya i-back up ito nang encrypted at itago sa labas ng server sa araw na ginawa mo ito.
Kailangan ba ng HTTPS certificate ang isang onion site?
Hindi. Ang 56-character address ay public key ng service. Dahil dito, encrypted at authenticated na end to end ang connection, at itinuturing ng Tor Browser na secure context ang http:// sa isang .onion name. Mas masama kaysa walang gawin ang muling paggamit ng iyong clearnet certificate sa onion vhost, dahil public ang Certificate Transparency logs at permanente nilang nire-record kung aling mga name ang gumagamit ng parehong certificate. Ang tanging dahilan para bumili ng certificate para sa .onion name ay brand assurance mula sa isang CA na nag-iisyu ng mga ito, at public ang link na iyon ayon sa disenyo.