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

SSH lewat Tor onion tanpa membuka port masuk

Pelajari cara menempatkan sshd di balik layanan onion Tor, menyiapkan otorisasi klien v3, dan mengikuti urutan perubahan agar VPS tidak terkunci.

Perubahan yang terjadi saat menggunakan SSH melalui layanan onion Tor

SSH melalui layanan onion Tor memungkinkan Anda mengelola VPS yang tidak menerima koneksi masuk pada port apa pun. Server terhubung ke jaringan Tor melalui koneksi keluar dan mempertahankan koneksi tersebut. Sesi SSH Anda masuk kembali melalui koneksi itu, sehingga tidak ada proses yang perlu listen pada alamat IP publik.

Dampaknya langsung terlihat pada log. Server dengan port SSH publik menerima ribuan upaya kata sandi yang gagal setiap hari dari pemindai. Pindahkan sshd ke balik layanan onion, lalu blokir trafik masuk pada firewall. Setelah itu, /var/log/auth.log hanya mencatat sesi yang Anda mulai.

Konsekuensinya, tor berada di jalur setiap sesi administrasi. Ini adalah daemon userspace yang harus dijalankan dan melakukan bootstrap setiap kali reboot sebelum Anda dapat login. Rencanakan hal ini sebelum menutup port, karena kegagalannya dapat menyebabkan Anda kehilangan akses ke mesin yang tidak dapat dijangkau secara fisik.

Siapkan jalur akses kembali sebelum mengubah apa pun

Jangan mulai sebelum Anda memiliki jalur pemulihan yang tidak menggunakan SSH.

Buka konsol penyedia Anda sekarang, yaitu konsol VNC atau serial di panel kontrol, lalu masuk menggunakan konsol tersebut. Jika kata sandi root tidak diketahui, atur ulang kata sandi root dari panel terlebih dahulu dan pastikan kata sandi tersebut berfungsi. Konsol yang belum pernah diuji bukan jalur pemulihan.

Urutan di bawah ini penting. Setiap langkah harus berhasil sebelum langkah berikutnya dijalankan, dan port 22 tetap terbuka sampai rute onion berfungsi.

  1. Instal tor dan pastikan proses bootstrap berhasil.
  2. Tentukan onion service dan baca alamatnya.
  3. Hubungkan melalui onion saat port 22 masih terbuka.
  4. Tambahkan otorisasi klien, lalu hubungkan kembali.
  5. Bind sshd ke loopback dan tutup port 22.
  6. Reboot, lalu hubungkan kembali melalui onion.

Biarkan sesi SSH Anda saat ini tetap terbuka selama seluruh proses. Sesi yang sudah terhubung tetap bertahan meskipun perubahan firewall memblokir koneksi baru, sehingga sesi tersebut menjadi jalur penyelamatan pertama Anda.

Instal tor di server

Ubuntu merilis tor dalam repositorinya sendiri, tetapi build tersebut sering kali tertinggal. Repositori Tor Project menyediakan versi yang dijelaskan dalam dokumentasinya. Tambahkan repositori tersebut menggunakan perintah dari panduan repositori apt.

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

Tulis /etc/apt/sources.list.d/tor.sources. Suites mengambil nama kode rilis Anda, yang ditampilkan oleh lsb_release -cs (noble pada Ubuntu 24.04).

Types: deb deb-src
URIs: https://deb.torproject.org/torproject.org/
Suites: noble
Components: main
Signed-By: /usr/share/keyrings/deb.torproject.org-keyring.gpg
sudo apt update
sudo apt install -y tor deb.torproject.org-keyring
sudo journalctl -u tor@default -n 20 --no-pager

Log harus diakhiri dengan Bootstrapped 100% (done). Jika log berhenti sebelum bagian tersebut, tor tidak dapat menjangkau jaringan. Penyebabnya hampir selalu aturan firewall keluar atau waktu sistem yang jauh tidak akurat.

Nama unit dapat menyesatkan. systemctl status tor melaporkan Active: active (exited) meskipun semuanya berjalan normal, karena Debian dan Ubuntu mengemas tor sebagai unit master multi-instance yang hanya bertugas memanggil instance sebenarnya. Daemon tersebut berjalan sebagai tor@default.service. Gunakan nama tersebut untuk status dan journalctl. Perintah start, stop, dan reload pada tor tetap diteruskan ke instance tersebut, sehingga sudo systemctl reload tor berfungsi seperti yang diharapkan.

Definisikan onion service untuk port 22

Tambahkan dua baris ke /etc/tor/torrc.

HiddenServiceDir /var/lib/tor/ssh/
HiddenServicePort 22 127.0.0.1:22

Baris kedua memberi tahu tor untuk menerima virtual port 22 pada alamat onion dan menyambungkannya ke 127.0.0.1:22 di server. Tor mengakses sshd melalui loopback. Inilah alasan sshd nantinya dapat berhenti mendengarkan pada alamat publik.

sudo systemctl reload tor
sudo cat /var/lib/tor/ssh/hostname

Perintah tersebut mencetak 56 karakter base32 yang diikuti oleh .onion. Karakter-karakter itu adalah public key service dalam bentuk terenkode. Tidak ada certificate authority atau pendaftaran nama dalam proses ini.

Biarkan tor membuat /var/lib/tor/ssh/ sendiri. Jika direktori tersebut dibuat secara manual dengan owner yang salah atau mode yang lebih longgar daripada 0700, tor menolak menggunakannya, dan journal melaporkan bahwa direktori memiliki izin yang terlalu longgar. File-file di dalamnya adalah identitas service: hs_ed25519_secret_key adalah alamatnya. Cadangkan direktori tersebut dengan mode 600 dan simpan salinannya di luar server, karena kehilangannya berarti Anda harus menggunakan alamat baru dan mengubah konfigurasi pada setiap client.

Hubungkan dari workstation

Workstation Anda memerlukan klien tor. Klien ini tidak memerlukan konfigurasi apa pun. Pada Debian atau Ubuntu, klien tersebut adalah sudo apt install -y tor netcat-openbsd. Tor kemudian listen pada 127.0.0.1:9050 sebagai proxy SOCKS5. SOCKS adalah protokol proxy generik. Versi 5 dapat membawa hostname, bukan alamat IP. Bagian inilah yang penting di sini.

OpenSSH tidak memiliki klien SOCKS sendiri. Karena itu, program pembantu digunakan untuk membuat koneksi. Tambahkan konfigurasi berikut ke ~/.ssh/config.

Host myvps
  HostName xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion
  User admin
  ProxyCommand /usr/bin/nc -X 5 -x 127.0.0.1:9050 %h %p
  ServerAliveInterval 30

-X 5 memilih SOCKS5, sedangkan -x 127.0.0.1:9050 menunjuk ke tor lokal. %h meneruskan nama onion ke tor sebagai nama, sehingga tor melakukan resolusi di dalam jaringan. Anda harus menggunakan netcat dari OpenBSD. GNU netcat tidak memiliki opsi -X dan berhenti dengan nc: invalid option -- 'X'.

ssh myvps

Koneksi pertama berjalan lambat karena tor membangun sirkuit sebelum proses lain dimulai. Terima fingerprint kunci host seperti pada koneksi lainnya. Setelah itu, pengelolaan kunci SSH seperti biasa tetap berlaku tanpa perubahan. Yang berubah adalah transportasinya. Autentikasinya tidak berubah.

Untuk penggunaan satu kali, Anda dapat melewati entri konfigurasi: torsocks ssh admin@xxxxx.onion melakukan hal yang sama.

Tambahkan otorisasi klien v3

Saat ini, siapa pun yang mengetahui alamat tersebut dapat mencapai banner SSH dan mulai mencoba menebak kredensial. Alamat onion tidak dapat ditemukan melalui enumerasi dari sistem direktori, sehingga alamat tersebut berfungsi seperti rahasia. Namun, alamat dapat bocor melalui cara biasa, seperti riwayat shell dan file konfigurasi yang di-commit ke repositori git. Otorisasi klien menutup celah ini. Service memublikasikan deskriptornya dalam bentuk terenkripsi menggunakan key klien. Dengan demikian, pihak yang hanya memiliki alamat tanpa key bahkan tidak dapat menemukan service tersebut.

Buat pasangan key x25519 pada klien. Berikut pipeline dari panduan otorisasi klien Tor Project, dengan satu perubahan.

openssl genpkey -algorithm x25519 -out /tmp/k1.prv.pem
grep -v " PRIVATE KEY" /tmp/k1.prv.pem | base64 -d | tail --bytes=32 | base32 | sed 's/=//g' > /tmp/k1.prv.key
openssl pkey -in /tmp/k1.prv.pem -pubout | grep -v " PUBLIC KEY" | base64 -d | tail --bytes=32 | base32 | sed 's/=//g' > /tmp/k1.pub.key

Versi yang dipublikasikan dari baris tersebut menggunakan base64pem -d, yang tidak tersedia pada instalasi Ubuntu standar. Perintah tersebut kemudian berhenti dengan base64pem: command not found. GNU base64 -d dapat mendekode body PEM yang sama, jadi gunakan itu sebagai gantinya.

Pada server, instal key publik.

sudo install -d -m 700 -o debian-tor -g debian-tor /var/lib/tor/ssh/authorized_clients
echo "descriptor:x25519:PASTE_PUBLIC_KEY_HERE" | sudo tee /var/lib/tor/ssh/authorized_clients/laptop.auth >/dev/null
sudo chown debian-tor:debian-tor /var/lib/tor/ssh/authorized_clients/laptop.auth
sudo systemctl reload tor

Hanya file yang diakhiri dengan .auth yang dibaca. Simpan file tersebut sebagai laptop.auth.txt. Jika tidak, tor mengabaikan file tersebut tanpa mencetak error, dan service tetap terbuka secara diam-diam bagi siapa pun yang memiliki alamat.

Pada klien, instal key privat. Di Ubuntu, daemon tor berjalan sebagai user debian-tor dan tidak dapat membaca file di direktori home Anda. Jadi, simpan direktori tersebut di lokasi yang dapat diakses oleh user itu.

sudo install -d -m 700 -o debian-tor -g debian-tor /var/lib/tor/onion_auth
echo "ADDRESS_WITHOUT_DOT_ONION:descriptor:x25519:PASTE_PRIVATE_KEY_HERE" | sudo tee /var/lib/tor/onion_auth/myvps.auth_private >/dev/null
sudo chown debian-tor:debian-tor /var/lib/tor/onion_auth/myvps.auth_private
sudo chmod 600 /var/lib/tor/onion_auth/myvps.auth_private

Tambahkan ClientOnionAuthDir /var/lib/tor/onion_auth ke /etc/tor/torrc milik klien, lalu reload tor. Jika Anda menjalankan tor sebagai user Anda sendiri, misalnya build Homebrew pada macOS, arahkan ClientOnionAuthDir ke ~/.tor/onion_auth dengan mode 0700.

Alamat di dalam file tersebut terdiri dari 56 karakter tanpa suffix .onion. Hapus /tmp/k1.prv.pem dan /tmp/k1.prv.key setelah selesai.

Sekarang uji kedua arah. ssh myvps seharusnya tetap dapat terhubung. Dari mesin yang tidak memiliki key, alamat yang sama seharusnya gagal diakses. Kegagalan tersebut membuktikan bahwa otorisasi telah aktif.

Tutup port 22 dalam urutan ini

Buat mekanisme pengaman terlebih dahulu. Satu perintah ini akan membatalkan kedua perubahan di bawah setelah lima belas menit jika Anda terkunci dari server.

sudo systemd-run --on-active=15m --unit=ssh-rescue \
  /bin/sh -c 'ufw allow 22/tcp; rm -f /etc/systemd/system/ssh.socket.d/override.conf; systemctl daemon-reload; systemctl restart ssh.socket'

Batalkan dengan sudo systemctl stop ssh-rescue.timer setelah Anda memastikan rute onion masih berfungsi.

Selanjutnya, hentikan sshd agar tidak mendengarkan pada alamat publik. Ubuntu 24.04 mengaktifkan ssh melalui socket unit, sehingga ListenAddress di sshd_config diabaikan: ssh.socket yang mengelola socket listening, bukan sshd. Periksa kondisi yang berlaku pada sistem Anda.

systemctl is-enabled ssh.socket

Jika perintah tersebut menampilkan enabled, jalankan sudo systemctl edit ssh.socket dan tambahkan ini.

[Socket]
ListenStream=
ListenStream=127.0.0.1:22

ListenStream= yang kosong menghapus nilai yang diwarisi dari unit yang disediakan paket. Jika baris tersebut tidak ada, Anda menambahkan listener kedua sambil mempertahankan listener publik. Inilah penyebab paling umum langkah ini gagal tanpa menampilkan pesan.

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
ss -tlnp | grep ':22'

ss harus menampilkan 127.0.0.1:22 dan tidak menampilkan apa pun pada 0.0.0.0:22. Jika ssh.socket dinonaktifkan, masukkan ListenAddress 127.0.0.1 ke dalam /etc/ssh/sshd_config.d/10-onion.conf, jalankan sudo systemctl restart ssh, lalu periksa dengan baris ss yang sama. Output tersebut menjadi bukti pada kedua kondisi.

Selanjutnya, konfigurasikan firewall dengan pengelolaan aturan ufw biasa pada VPS. Jalankan sudo ufw status numbered terlebih dahulu, lalu hapus aturan SSH yang ditampilkan.

sudo ufw status numbered
sudo ufw delete allow OpenSSH
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw status verbose

Biarkan trafik keluar tetap diizinkan. Tor terhubung keluar ke relay pada port seperti 443 dan 9001. Karena itu, kebijakan default-deny untuk trafik keluar menghentikan proses bootstrap Tor dan sekaligus menghapus satu-satunya akses masuk yang masih tersedia. Sebagian besar penyedia juga menjalankan firewall jaringan terpisah pada panel kontrol. Tutup port 22 di sana juga. Jika tidak, port tersebut tetap dapat dijangkau, apa pun laporan ufw.

Jika Docker berjalan pada server ini, periksa port yang dipublikasikannya sebelum menyatakan pekerjaan selesai. Docker menulis aturannya sendiri ke dalam tabel yang sama dan mempublikasikan port container langsung melewati ufw, sehingga kebijakan deny ufw bukan gambaran yang lengkap.

Reboot sebelum mempercayainya

systemctl is-enabled tor@default
sudo reboot

Jika perintah pertama tidak melaporkan bahwa service telah diaktifkan, jalankan sudo systemctl enable tor@default sebelum melakukan reboot. Tunggu dua menit, lalu jalankan ssh myvps. Tor harus melakukan bootstrap setelah boot, sehingga alamat onion mulai merespons beberapa waktu setelah mesin selesai menyala.

Jika service tidak pernah kembali aktif, buka console dan baca sudo journalctl -u tor@default -b. Error sintaks torrc atau masalah permission direktori akan ditampilkan di sana. Anda juga dapat memeriksa perubahan torrc sebelum menerapkannya.

sudo -u debian-tor tor --verify-config

Biaya ini dibandingkan dengan tunnel WireGuard

Dibandingkan dengan VPN WireGuard pada VPS milik Anda sendiri, onion service lebih lambat dan kurang dapat diprediksi. Pahami trade-off ini sebelum menggunakannya.

Latensi. Sirkuit klien terdiri atas tiga relay, dan sisi service menambahkan tiga relay lagi. Artinya, setiap ketikan Anda melewati kira-kira enam mesin yang dipilih secara acak di berbagai lokasi di dunia. Pengetikan interaktif mengalami jeda yang terlihat, dan penyalinan file berlangsung lambat. WireGuard hanya menambahkan satu hop. Ukur kondisi Anda sendiri dengan time ssh myvps 'echo ok', karena hasilnya bergantung pada sirkuit yang dibangun tor dan berubah ketika tor membangun sirkuit lain.

Daemon userspace pada jalur kritis. WireGuard berjalan di kernel dan aktif bersama jaringan. Tor adalah proses yang harus dimulai, melakukan bootstrap, dan terhubung ke relay guard sebelum dapat digunakan. Jika proses ini gagal, Anda harus menggunakan konsol provider.

Akurasi waktu. Deskriptor onion service dipublikasikan berdasarkan periode waktu. Karena itu, jam yang sangat tidak tepat dapat menggagalkan pencarian alamat tanpa pesan yang jelas di mana pun. timedatectl seharusnya melaporkan System clock synchronized: yes.

Sebagai gantinya, Anda mendapatkan paparan jaringan yang tidak lagi bergantung pada aturan firewall yang benar. Tidak ada port untuk dipindai dan tidak ada banner untuk diambil. Alamat tersebut juga merupakan kunci publik, sehingga endpoint membuktikan identitasnya sebelum SSH dimulai.

Jawaban praktisnya biasanya adalah menggunakan keduanya. Jalankan WireGuard sebagai jalur utama sehari-hari, dan pertahankan onion service sebagai jalur yang tetap berfungsi ketika konfigurasi WireGuard salah. Dengan demikian, hanya satu port UDP yang terbuka, bukan port SSH publik. Semua ini tidak menggantikan penguatan sshd itu sendiri: autentikasi khusus kunci dan login non-root tetap penting, karena onion service hanya melindungi jalur jaringan dan tidak melindungi hal lain di luar jalur tersebut.

Mode kegagalan dan error yang akan Anda lihat

Tor tidak pernah melewati Bootstrapped 0%. Trafik keluar diblokir, atau waktu sistem terlalu melenceng. Periksa kebijakan koneksi keluar dengan sudo ufw status verbose, lalu jalankan timedatectl.

systemctl status tor menampilkan active (exited). Ini normal pada Debian dan Ubuntu. Baca tor@default sebagai gantinya.

Descriptor tidak dapat ditemukan. Tor mengembalikan error SOCKS extended F0, "Onion Service Descriptor Can Not be Found". Descriptor mungkin belum dipublikasikan. Proses ini memerlukan waktu singkat setelah reload. Kemungkinan lain, tor pada server tidak berjalan.

F4, "Onion Service Missing Client Authorization". Client tidak memiliki .auth_private yang sesuai untuk digunakan tor. Pastikan ClientOnionAuthDir ada di torrc, direktori memiliki mode 0700, nama file diakhiri dengan .auth_private, dan debian-tor dapat membacanya.

F5, "Onion Service Wrong Client Authorization". Private key tidak cocok dengan file .auth pada server. = tambahan di akhir atau newline yang tidak semestinya di dalam string base32 dapat menyebabkan hal ini.

nc: invalid option -- 'X'. GNU netcat terinstal, bukan versi OpenBSD. Jalankan sudo apt install -y netcat-openbsd.

Could not resolve hostname. ssh mencoba DNS biasa, tetapi DNS tidak memiliki jawaban untuk .onion. Akibatnya, ProxyCommand tidak pernah dijalankan. Pola Host dalam ~/.ssh/config tidak cocok dengan nama yang Anda ketik.

Permission denied (publickey). Tunnel berhasil dan tor sudah selesai bekerja. Tangani ini sebagai masalah publickey dengan permission denied biasa dan jangan kaitkan dengan tor.

FAQ

Apakah onion service benar-benar berarti tidak ada port yang terbuka pada VPS saya?

Ya, setelah sshd terikat pada 127.0.0.1 dan firewall menolak trafik masuk. Tor membuat koneksi TCP keluar ke relay, lalu sesi Anda melewati relay tersebut saat kembali, sehingga tidak ada proses pada server yang menerima koneksi pada alamat publik. Buktikan dengan ss -tlnp pada server dan pemindaian port dari lokasi lain. Jangan lupa firewall jaringan milik provider pada panel kontrol. Firewall tersebut terpisah dari ufw dan juga harus ditutup.

Apakah alamat .onion saja sudah cukup aman untuk SSH?

Tidak. Alamat tersebut terdiri dari 56 karakter dan tidak dapat ditebak atau dienumerasi melalui sistem direktori, sehingga berfungsi seperti rahasia. Namun, alamat itu dapat bocor melalui riwayat shell dan file konfigurasi. Tambahkan otorisasi klien v3. Dengan fitur ini, deskriptor service dienkripsi menggunakan kunci klien Anda. Jadi, pihak yang hanya memiliki alamat tersebut akan menerima error F4 yang lebih panjang dan tidak pernah mencapai sshd.

Apa yang terjadi jika tor gagal start setelah reboot?

Anda kehilangan akses SSH sepenuhnya karena alamat onion menjadi satu-satunya jalur masuk. Karena itu, konsol provider harus diuji sebelum Anda menutup port 22. Tor juga memerlukan waktu untuk melakukan bootstrap setelah boot, sehingga alamat tersebut merespons lebih lambat daripada mesin merespons ping. Jika alamat itu tidak pernah merespons, login melalui konsol dan baca sudo journalctl -u tor@default -b. Di sana, error sintaks torrc atau masalah permission pada /var/lib/tor/ssh akan tercetak.

Apakah SSH melalui Tor lebih lambat daripada WireGuard?

Ya, dengan selisih yang besar. Koneksi ke onion service melewati sekitar enam relay yang dipilih secara acak, sedangkan WireGuard hanya menggunakan satu hop terenkripsi langsung ke server Anda. Pengetikan terasa lambat dan transfer berjalan lambat. Konfigurasi yang umum adalah menggunakan WireGuard untuk pekerjaan sehari-hari dan mempertahankan onion service sebagai jalur darurat yang tetap tersedia jika konfigurasi VPN rusak.