SSD Nodes Learn 🎉 VPS mulai $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-13

Cara Host Situs .onion di VPS dengan Tor dan Nginx

Pelajari cara menjalankan onion service v3 di Ubuntu dengan Tor dan nginx pada loopback, lalu menutup kebocoran yang dapat mengaitkan alamat .onion ke IP publik VPS.

Yang Anda bangun

Situs onion adalah server web biasa yang hanya menerima permintaan melalui jaringan Tor. Instal tor, tambahkan dua baris ke /etc/tor/torrc, baca alamat yang ditulis Tor untuk Anda, lalu konfigurasikan nginx agar listen pada 127.0.0.1 sehingga tidak ada layanan yang merespons pada IP publik. Proses instalasi memerlukan waktu sepuluh menit. Bagian lainnya dalam panduan ini berisi daftar potensi kebocoran, karena situs onion biasanya gagal ketika konfigurasinya sendiri menunjuk langsung kembali ke operator.

Tor pada awalnya disebut "the onion router", dan onion service adalah layanan yang hanya dapat diakses melaluinya. Alamat versi 3 terdiri atas 56 karakter yang diikuti .onion. Karakter tersebut berisi public key ed25519 layanan, checksum, dan byte versi yang dienkode dalam base32. Alamat versi 2 yang terdiri atas 16 karakter dihapus dari jaringan pada 2021, sehingga apa pun yang Anda buat saat ini adalah v3. Alamat tersebut adalah key, dan hal ini memiliki dua konsekuensi. Koneksi dienkripsi dan diautentikasi secara end-to-end tanpa melibatkan certificate authority. Jika file key hilang, alamat tersebut juga hilang untuk selamanya.

Server Anda tidak pernah menerima koneksi masuk. Tor memilih beberapa relay sebagai introduction point, mengunggah descriptor yang ditandatangani ke directory server, lalu bertemu dengan setiap pengunjung melalui rendezvous relay yang dipilih pengunjung. Semua koneksi tersebut keluar dari server Anda. Tidak ada port yang perlu dibuka dan tidak ada DNS record yang perlu dipublikasikan.

Instal tor dari repositori Tor Project

Ubuntu menyediakan paket tor di universe, tetapi versinya biasanya tetap mendekati versi yang tersedia saat rilis dibekukan. Repositori milik Tor Project sendiri mengikuti rilis stabil terbaru. Versi ini diperlukan untuk komponen yang menentukan apakah alamat Anda tetap menjadi milik Anda.

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

Entri repositori menggunakan format deb822, dan Suites harus berupa codename Ubuntu Anda. Baca nilainya dari /etc/os-release, bukan dengan mengetiknya, karena codename yang salah dapat menghasilkan repositori yang berhasil diakses tetapi tidak menyediakan paket untuk rilis Anda.

. /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

Paket deb.torproject.org-keyring menjaga signing key tetap terbaru, sehingga rotasi key tidak membuat apt update gagal setahun kemudian. Pastikan tor telah dimulai dan terhubung ke jaringan:

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

Journal seharusnya diakhiri dengan Bootstrapped 100% (done): Done. tor yang terhenti pada Bootstrapped 10% tidak memiliki jalur keluar, jadi periksa firewall jaringan dari provider Anda dan aturan egress Anda sendiri: sudo ufw status verbose seharusnya menampilkan allow (outgoing) sebagai default.

Mulai dari sini, ada dua nama yang penting. Paket menjalankan tor sebagai user debian-tor, sedangkan unit yang berjalan adalah tor@default.service, karena tor.service pada Debian dan Ubuntu merupakan wrapper untuk instance tersebut. Minta status dan log berdasarkan nama instance agar Anda selalu mendapatkan proses yang sebenarnya.

Konfigurasikan layanan onion di torrc

Tambahkan dua baris ke /etc/tor/torrc:

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

HiddenServiceDir adalah lokasi tor menyimpan kunci dan alamat untuk layanan ini. Jangan membuatnya sendiri. Tor membuatnya saat dijalankan, dengan pemilik dan mode yang diperlukan. Direktori yang dibuat sebagai root menyebabkan kegagalan pertama dalam daftar kegagalan di bawah.

HiddenServicePort memiliki dua bagian. Kesalahan pertama yang umum adalah menukar kedua bagian tersebut. Angka pertama adalah port yang digunakan pengunjung untuk terhubung di dalam tunnel. Karena itu, 80 adalah nilai yang diharapkan dan tidak ada alasan untuk mengubahnya. Bagian kedua adalah alamat lokal yang menerima penerusan trafik oleh tor. Nilai HiddenServicePort 80 tanpa alamat meneruskan ke 127.0.0.1:80. Jadi, menuliskan alamat secara eksplisit dan menggunakan port tinggi membuat vhost onion tidak bertabrakan dengan layanan yang sudah mendengarkan pada port 80.

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

Daftar tersebut harus memuat hostname, hs_ed25519_public_key, hs_ed25519_secret_key, serta direktori authorized_clients yang kosong.

Baca alamat .onion Anda

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

Satu baris ditampilkan: 56 karakter base32 dan .onion. String tersebut merupakan seluruh identitas situs. Tidak ada pihak yang menetapkannya, memindahkannya, atau dapat mengambilnya selama Anda memegang file key. Salin sekarang, karena semua konfigurasi di bawah memerlukannya. Bagian selanjutnya dalam panduan ini menuliskannya sebagai <your-address>.onion.

Sajikan situs dari nginx yang terikat ke 127.0.0.1

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

Tulis /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

Sekarang buktikan dua hal dari server. Pertama, nginx merespons nama onion, yaitu header Host persis yang akan dikirim tor:

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

Kedua, nginx hanya merespons di alamat tersebut dan tidak di alamat lain:

sudo ss -tlnp | grep 8080

Kolom alamat harus berisi 127.0.0.1:8080. Jika berisi 0.0.0.0:8080 atau *:8080, situs onion Anda juga tersedia di Internet publik. Ini adalah item pertama dalam daftar kebocoran. Baris listen 8080; tanpa alamat akan mengikat semua interface, dan itulah perilaku default.

Buka alamat tersebut di Tor Browser. Pemuatan pertama memerlukan beberapa detik saat klien mengambil descriptor Anda dan membangun sirkuit rendezvous.

Dokumentasi resmi Tor Project lebih menyarankan unix socket daripada port loopback: HiddenServicePort 80 unix:/var/run/tor/onion_site.sock, dengan nginx yang mendengarkan pada path tersebut. Socket tidak dapat dijangkau dari host lain, bahkan jika server nantinya memiliki interface kedua. Konsekuensinya adalah pengaturan izin file, karena nginx membuat socket tersebut dan tor terhubung sebagai debian-tor. Jadi, kedua pengguna harus memiliki izin yang sesuai pada direktori tersebut. Loopback dengan output ss yang telah diverifikasi lebih mudah dikonfigurasi dengan benar, dan itulah yang diasumsikan dalam panduan ini.

Jika situs berjalan pada loopback, server sama sekali tidak memerlukan aturan inbound untuk situs tersebut. Biarkan port 22 tetap terbuka untuk Anda dan tolak port lainnya (default ufw yang sebaiknya diatur pada VPS). Ingat bahwa firewall tidak membatalkan service yang terikat ke 0.0.0.0. Firewall hanya memfilter paket yang mencapai firewall. Container membuat hal ini lebih penting karena mempublikasikan port Docker menulis aturan iptables sebelum ufw, sehingga -p 8080:80 menempatkan backend onion Anda pada IP publik, sementara ufw tetap melaporkan port tersebut sebagai ditolak. Publikasikan port container sebagai -p 127.0.0.1:8080:80.

Kebocoran yang menghilangkan anonimitas situs onion

Tor menyembunyikan lokasi server. Tor tidak menyembunyikan informasi yang dikirim server. Setiap item di bawah ini adalah informasi yang dipublikasikan oleh stack Anda sendiri.

Situs yang sama merespons pada IP publik Anda

Ini adalah hal yang sering tidak disadari. Scanner terus-menerus mengindeks respons HTTP dari setiap alamat yang dapat dirutekan, dan hasilnya dapat diakses serta dicari secara publik. Sajikan halaman yang sama pada IP publik dan alamat onion Anda, maka keduanya dapat dihubungkan dengan satu kueri: judul yang sama, hash favicon yang sama, ETag yang sama, dan urutan header yang sama. Baris listen 127.0.0.1:8080; di atas adalah solusinya. Verifikasi dari mesin lain, bukan dari server:

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

Connection refused atau timeout adalah hasil yang benar. HTML apa pun berarti situs tersebut dapat diakses secara publik. Jika mesin tersebut juga menjalankan situs clearnet, berikan root tersendiri untuk vhost itu dan pertahankan blok default_server eksplisit pada listener publik, sehingga header Host yang tidak cocok tidak pernah diteruskan ke vhost onion.

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

nginx default merespons Server: nginx/1.24.0. String versi tersebut, bersama urutan persis header lainnya, menjadi fingerprint yang dapat mencocokkan situs onion Anda dengan host clearnet. server_tokens off; menguranginya menjadi Server: nginx. Directive tersebut tidak menghapus header, dan nginx tidak memiliki directive bawaan untuk melakukannya. Karena itu, modul headers-more biasanya digunakan jika Anda ingin menghapusnya. PHP menambahkan X-Powered-By sampai Anda menetapkan expose_php = Off. etag off; juga harus dimasukkan ke daftar yang sama, karena nginx membuat ETag dari waktu modifikasi dan ukuran file. Dengan demikian, file yang sama dan disalin ke dua server akan menghasilkan ETag yang sama pada keduanya.

URL absolut yang mengarah ke domain clearnet Anda

Tag rel="canonical", og:url Open Graph, RSS feed, sitemap, email pengaturan ulang kata sandi, atau URL logo yang ditulis secara hardcode. Salah satu saja dapat mencantumkan situs clearnet di dalam halaman yang disajikan melalui onion. Gunakan path relatif terhadap root seperti /static/logo.svg, dan biarkan aplikasi membaca base URL dari host pada request, bukan dari nilai konstan. Redirect juga merupakan bug yang sama di tempat lain: return 301 https://example.com$request_uri; dalam blok catch-all mengarahkan pengunjung onion ke domain asli Anda, sedangkan header Location memberikan jawaban tersebut secara langsung.

Sertifikat TLS yang digunakan bersama situs clearnet

Alamat onion mengautentikasi dirinya sendiri karena alamat tersebut merupakan public key. Oleh karena itu, http:// melalui koneksi onion sudah dienkripsi end-to-end, dan Tor Browser memperlakukannya sebagai secure context. Memasang sertifikat yang sudah ada pada vhost onion memublikasikan hubungan antara keduanya, karena setiap sertifikat yang dipercaya publik dicatat dalam log Certificate Transparency, dan log tersebut bersifat publik, permanen, serta dapat dicari berdasarkan nama. Simpan sertifikat Let's Encrypt pada vhost clearnet dan biarkan vhost onion menggunakan HTTP biasa.

Font dan analitik pihak ketiga

Font dari CDN (content delivery network), atau script analitik. Browser pengunjung mengambil masing-masing secara langsung. Dengan demikian, pihak ketiga mengetahui bahwa seseorang memuat halaman Anda dan biasanya juga mengetahui halaman yang dimuat. Selain itu, tingkat keamanan Tor Browser yang lebih ketat memblokir request tersebut, sehingga tata letak menjadi rusak. Host sendiri setiap aset yang diperlukan halaman.

Ketidakcocokan header Host

Jika server_name tidak cocok dengan header Host yang dikirim Tor, nginx akan kembali ke server default untuk alamat listen tersebut. Pada mesin dengan satu vhost, hal ini tidak terlihat karena satu-satunya server block juga merupakan default. Jika Anda kemudian menambahkan vhost clearnet, request onion dapat mulai masuk ke vhost tersebut, termasuk canonical tag dan redirect-nya. Jalankan kembali pemeriksaan curl -H 'Host: ...' setelah setiap perubahan nginx, lalu gunakan grep untuk mencari domain asli Anda:

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

Mengetahui proses yang memiliki setiap socket mencakup sebagian besar pekerjaan ini (cara kerja port dan socket listening di Linux).

Informasi yang masih tersisa dalam log

Setiap request berasal dari 127.0.0.1, sehingga nginx tidak memiliki alamat pengunjung untuk dicatat dan access_log off; tidak membebani Anda. Namun, aplikasi di atasnya merupakan hal yang berbeda karena order, alamat email, atau metadata file yang diunggah harus Anda tangani. Kebiasaan Anda sendiri juga berpengaruh: mengelola mesin melalui login yang belum diamankan berada di luar perlindungan Tor. Karena itu, anggap pengamanan SSH pada VPS yang sama sebagai bagian dari build ini.

Cadangkan private key karena key tersebut merupakan alamat

/var/lib/tor/onion_site/hs_ed25519_secret_key adalah service. Tidak ada registrar dan tidak ada mekanisme pemulihan. Jika key hilang, alamat tersebut juga hilang. Salin key tersebut, dan siapa pun yang memegang salinannya dapat menyajikan konten mereka sendiri pada alamat Anda tanpa cara bagi Anda untuk mencabut akses apa pun.

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

Enkripsi arsip tersebut (gpg -c onion-keys.tgz), lalu pindahkan ke luar server. Untuk memulihkannya pada VPS baru, tor mengharapkan arsip dan kepemilikan berikut:

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

Alamat yang sama akan kembali pada hardware baru satu atau dua menit setelah tor menerbitkan ulang descriptor. Itulah seluruh proses migrasi: tidak perlu mengubah DNS dan tidak perlu menerbitkan ulang sertifikat.

Onion-Location saat situs juga tersedia di clearnet

Jika alamat onion digunakan untuk kemudahan akses, bukan kerahasiaan, umumkan alamat tersebut dari vhost clearnet:

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

Tor Browser kemudian menampilkan tombol .onion available di bilah alamat dan menawarkan perpindahan. Header ini hanya dipatuhi jika halaman clearnet disajikan melalui HTTPS dan nilainya merupakan URL onion yang valid.

Ada satu aturan nginx yang perlu diperhatikan. Direktif add_header diwariskan oleh blok location hanya jika blok tersebut tidak mendeklarasikan direktifnya sendiri. Karena itu, location yang memiliki add_header sendiri akan menghilangkan Onion-Location secara diam-diam. Ulangi direktif tersebut di sana, atau simpan semua header respons di satu tempat. Publikasi header ini secara sengaja menghubungkan kedua situs. Hal itu benar untuk mirror, tetapi keliru untuk situs yang harus tetap tidak terhubung.

Alamat vanity

mkp224o menghasilkan pasangan kunci hingga salah satunya menghasilkan alamat yang diawali dengan prefiks yang Anda minta. Proses ini merupakan pencarian brute force. Tidak ada yang perlu dikonfigurasi selain prefiks dan lamanya waktu yang bersedia Anda tunggu.

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

Setiap alamat yang ditemukan disimpan di onionkeys/<address>.onion/, yang berisi hostname dan hs_ed25519_secret_key. Instal alamat tersebut dengan menghentikan tor, menyalin direktori itu ke HiddenServiceDir, lalu menerapkan chown dan chmod 700 yang sama seperti pada proses pemulihan sebelumnya.

Panjang prefiks menentukan seluruh biaya proses. Alamat tersebut menggunakan base32, sehingga setiap karakter tambahan yang Anda minta meningkatkan jumlah kunci yang diharapkan sebanyak 32 kali lipat. Prefiks pendek dapat selesai di laptop. Prefiks panjang tidak akan selesai pada perangkat apa pun yang Anda miliki. Prefiks vanity juga membiasakan pembaca mengenali beberapa karakter pertama, bukan seluruh alamat. Kebiasaan inilah yang dimanfaatkan oleh salinan situs onion untuk melakukan phishing.

Mode kegagalan dan string yang akan Anda lihat

Tidak ada file hostname setelah restart. Tor tidak berjalan, atau menolak direktori tersebut. sudo journalctl -u tor@default -n 50 menampilkan namanya:

/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?

Seperti itulah tampilan direktori yang dibuat secara manual. Perbaiki ownership dan mode-nya, atau hapus direktori tersebut dan biarkan tor membuatnya.

Tor Browser menampilkan Onionsite Not Found (0xF0). Klien tidak dapat mengambil descriptor. Artinya, dari sudut pandang jaringan, tidak ada yang dipublikasikan pada alamat tersebut. Pastikan tor sedang berjalan dan telah menyelesaikan proses bootstrap. Bandingkan alamat yang Anda masukkan dengan sudo cat /var/lib/tor/onion_site/hostname karakter demi karakter, lalu periksa waktu sistem. Tor memerlukan waktu yang akurat untuk memublikasikan dan memvalidasi descriptor. timedatectl seharusnya melaporkan System clock synchronized: yes.

Alamat berhasil di-resolve, tetapi halaman tidak pernah dimuat. Tor menyelesaikan rendezvous, lalu gagal pada hop terakhir, yaitu dari tor ke nginx. Hop tersebut bersifat lokal, sehingga log tor tetap tidak menampilkan apa pun. Jalankan curl -sI http://127.0.0.1:8080/ pada server. Connection refused berarti nginx tidak berjalan atau mendengarkan pada alamat yang berbeda dari alamat yang dituju HiddenServicePort.

Halaman dimuat, tetapi setiap tautan mengarah ke domain asli Anda. Penyebabnya adalah URL absolut dalam template. Jalankan pemeriksaan grep -o 'https\?://[^"]*' di atas dan perbaiki hasilnya sebelum membagikan alamat tersebut.

Situs berfungsi, lalu berhenti setelah reboot. Lakukan reboot pada server satu kali secara sengaja sebelum mengandalkan situs tersebut, lalu jalankan sudo systemctl status tor@default dan sudo systemctl status nginx. Service yang dijalankan seseorang secara manual terlihat sama seperti service yang diaktifkan sampai mesin direstart.

FAQ

Apakah saya perlu membuka port di firewall untuk layanan onion Tor?

Tidak. Daemon tor hanya membuat koneksi keluar ke server direktori, titik pengantar, dan setiap relay rendezvous. Karena itu, aturan masuk tidak diperlukan dan server web itu sendiri listen pada 127.0.0.1. Pertahankan ufw dengan kebijakan default deny untuk trafik masuk, dan izinkan SSH. Sifat yang sama memungkinkan layanan onion bekerja dari mesin di belakang NAT (network address translation) tanpa alamat IP publik sama sekali.

Mengapa saya tidak dapat mengakses alamat .onion saya di Tor Browser?

Lakukan pemeriksaan dari server ke arah luar. sudo journalctl -u tor@default -n 50 seharusnya menampilkan Bootstrapped 100% (done): Done. Selanjutnya, curl -sI http://127.0.0.1:8080/ pada server seharusnya mengembalikan baris status. Bandingkan alamat yang Anda masukkan dengan file hostname, karena satu karakter yang salah berarti layanan yang berbeda. Onionsite Not Found (0xF0) berarti tidak ada descriptor yang ditemukan untuk alamat tersebut. Biasanya, ini berarti tor tidak berjalan atau jam sistem salah.

Apakah saya dapat memindahkan situs onion ke server baru dan mempertahankan alamat yang sama?

Ya. Alamat tersebut diturunkan dari hs_ed25519_secret_key. Salin seluruh HiddenServiceDir ke mesin baru, tetapkan kepemilikannya ke debian-tor dan mode 700, lalu jalankan tor. Alamat tersebut kembali aktif setelah descriptor diterbitkan ulang. Tidak ada catatan DNS yang perlu diperbarui. Jika file itu hilang, alamat tersebut tidak dapat dipulihkan. Karena itu, buat cadangan terenkripsi di luar server pada hari Anda membuatnya.

Apakah situs onion memerlukan sertifikat HTTPS?

Tidak. Alamat 56 karakter tersebut adalah kunci publik layanan. Karena itu, koneksi sudah dienkripsi dan diautentikasi secara end-to-end, dan Tor Browser memperlakukan http:// pada nama .onion sebagai konteks aman. Menggunakan kembali sertifikat clearnet pada vhost onion lebih buruk daripada tidak melakukan apa pun, karena log Certificate Transparency bersifat publik dan mencatat secara permanen nama-nama yang menggunakan sertifikat yang sama. Satu-satunya alasan membeli sertifikat untuk nama .onion adalah untuk memperoleh jaminan merek dari CA yang menerbitkan sertifikat tersebut. Tautan itu memang dirancang untuk bersifat publik.