SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-29

SSH lewat Tor Onion Tanpa Membuka Port

Pelajari cara menaruh sshd di balik layanan onion Tor, mengaktifkan otorisasi klien v3, dan menghindari lockout dengan urutan konfigurasi yang benar.

Perubahan yang terjadi saat SSH menggunakan layanan onion Tor

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

Dampaknya langsung terlihat pada log. Server dengan port SSH publik dapat menerima ribuan percobaan 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 dimulai dan melakukan bootstrap setiap kali reboot sebelum Anda dapat login. Rencanakan hal ini sebelum menutup port, karena kegagalan dalam skenario ini dapat menyebabkan Anda kehilangan akses ke mesin yang tidak dapat Anda jangkau secara fisik.

Siapkan akses pemulihan sebelum mengubah apa pun

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

Buka konsol dari provider Anda sekarang, yaitu konsol VNC atau serial di control panel, lalu login melalui konsol tersebut. Jika Anda tidak mengetahui password root, reset password root dari panel terlebih dahulu dan pastikan password 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. Install tor dan pastikan proses bootstrap berhasil.
  2. Definisikan onion service dan baca alamatnya.
  3. Connect melalui onion saat port 22 masih terbuka.
  4. Tambahkan client authorisation, lalu connect kembali.
  5. Bind sshd ke loopback dan tutup port 22.
  6. Reboot, lalu connect kembali melalui onion.

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

Instal tor di server

Ubuntu menyediakan tor di repositorinya sendiri, tetapi build tersebut sering kali tertinggal. Repositori Tor Project menyediakan versi yang dijelaskan dalam dokumentasi mereka. Tambahkan repositori tersebut dengan 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 codename 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 proses berhenti sebelum itu, tor tidak dapat menjangkau jaringan. Penyebabnya hampir selalu aturan firewall outbound atau waktu sistem yang jauh meleset.

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 tugasnya hanya 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 menjangkau instance tersebut, sehingga sudo systemctl reload tor berfungsi seperti yang diharapkan.

Tentukan 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 menghubungkannya ke 127.0.0.1:22 pada server. Tor mengakses sshd melalui loopback. Karena itu, sshd nantinya dapat berhenti mendengarkan pada alamat publik. Arahkan baris kedua tersebut ke web server pada 127.0.0.1:80. Kedua direktif yang sama akan mempublikasikan situs pada alamat onion, yang merupakan layanan kedua yang berguna untuk dijalankan setelah tor terpasang.

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

Perintah tersebut mencetak 56 karakter base32, diikuti .onion. Karakter tersebut adalah public key layanan dalam bentuk terenkode. Tidak ada certificate authority dan tidak ada registrasi nama dalam proses ini.

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

Sambungkan dari workstation

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

OpenSSH tidak memiliki klien SOCKS sendiri, sehingga 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 mengarah ke tor lokal. %h meneruskan nama onion ke tor sebagai nama, sehingga tor melakukan resolusi di dalam jaringan. Anda harus menggunakan OpenBSD netcat untuk ini. GNU netcat tidak memiliki opsi -X dan berhenti dengan pesan nc: invalid option -- 'X'.

ssh myvps

Koneksi pertama berlangsung lebih lambat karena tor membangun circuit sebelum proses lain dimulai. Terima fingerprint kunci host seperti pada koneksi lainnya. Setelah itu, penanganan kunci SSH yang biasa tetap berlaku tanpa perubahan. Transportasinya yang berubah. Autentikasinya tidak.

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 melakukan percobaan tebakan. Alamat onion tidak dapat dicantumkan dari sistem direktori, sehingga alamat tersebut berfungsi seperti rahasia. Namun, alamat itu dapat bocor melalui cara biasa, seperti riwayat shell dan file konfigurasi yang di-commit ke repositori git. Otorisasi klien menutup celah tersebut. Service menerbitkan descriptor-nya dalam bentuk terenkripsi untuk kunci klien, sehingga orang yang hanya memiliki alamat tanpa kunci bahkan tidak dapat menemukan service tersebut.

Buat pasangan kunci 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 base64 -d sebagai gantinya.

Pada server, pasang kunci 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 mengabaikannya tanpa mencetak error, dan service tetap terbuka secara diam-diam bagi siapa pun yang memiliki alamat tersebut.

Pada klien, pasang kunci 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 di 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 harus tetap dapat terhubung. Dari mesin yang tidak memiliki kunci, alamat yang sama harus 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.

Berikutnya, hentikan sshd agar tidak lagi listen pada alamat publik. Ubuntu 24.04 mengaktifkan SSH melalui socket unit, sehingga ListenAddress di sshd_config diabaikan: ssh.socket yang mengelola listening socket, 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 konfigurasi berikut.

[Socket]
ListenStream=
ListenStream=127.0.0.1:22

ListenStream= yang kosong menghapus nilai yang diwarisi dari unit bawaan paket. Jika baris tersebut dihilangkan, Anda menambahkan listener kedua dan listener publik tetap aktif. Inilah penyebab paling umum langkah ini gagal tanpa pesan yang jelas.

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

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

Berikutnya, konfigurasi firewall. Ini adalah 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 membuat koneksi keluar ke relay pada port seperti 443 dan 9001. Karena itu, kebijakan outbound default-deny menghentikan proses bootstrap Tor dan menghapus satu-satunya akses masuk yang tersisa pada saat yang sama. Sebagian besar provider juga menjalankan firewall jaringan terpisah di control panel. Tutup port 22 di sana juga. Jika tidak, port tersebut tetap dapat dijangkau terlepas dari laporan ufw.

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

Reboot sebelum Anda mempercayainya

systemctl is-enabled tor@default
sudo reboot

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

Jika service tidak pernah kembali aktif, buka console dan baca sudo journalctl -u tor@default -b. Error sintaks torrc atau masalah izin 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 dengan jujur sebelum menggunakannya.

Latensi. Sirkuit client terdiri dari tiga relay, dan sisi service menambahkan tiga relay lagi. Artinya, input keyboard Anda melewati sekitar enam mesin yang dipilih secara acak di seluruh dunia. Pengetikan interaktif mengalami jeda yang terlihat, dan penyalinan file berlangsung lambat. WireGuard 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 start, melakukan bootstrap, dan menjangkau guard relay sebelum apa pun dapat berfungsi. Jika proses ini gagal, Anda harus menggunakan console provider.

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

Sebagai gantinya, Anda mendapatkan exposure yang tidak lagi bergantung pada ketepatan firewall rule. Tidak ada port untuk dipindai atau banner untuk diambil, dan alamat tersebut merupakan public key itu sendiri. Dengan demikian, endpoint membuktikan identitasnya sebelum SSH dimulai.

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

Mode kegagalan dan error yang akan Anda lihat

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

systemctl status tor menampilkan active (exited). Hal 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 sedikit waktu setelah reload. Kemungkinan lain, tor pada server tidak berjalan.

F4, "Onion Service Missing Client Authorization". Klien tidak memiliki .auth_private yang cocok dan dapat digunakan oleh 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 masalah ini.

nc: invalid option -- 'X'. GNU netcat terpasang, 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, sehingga ProxyCommand tidak pernah dijalankan. Pola Host di ~/.ssh/config tidak cocok dengan nama yang Anda ketik.

Permission denied (publickey). Tunnel berhasil dan tor telah menyelesaikan tugasnya. Tangani masalah ini sebagai masalah permission denied publickey 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 sebuah 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 control panel. 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 dicantumkan 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, service descriptor dienkripsi menggunakan kunci klien Anda. Dengan demikian, orang yang hanya memiliki alamat tersebut akan menerima error F4 yang diperpanjang dan sama sekali tidak dapat mencapai sshd.

Apa yang terjadi jika tor gagal dijalankan setelah reboot?

Anda kehilangan akses SSH sepenuhnya karena alamat onion kemudian menjadi satu-satunya cara untuk masuk. Karena itu, console 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 console dan baca sudo journalctl -u tor@default -b. Di sana akan tercetak error sintaks torrc atau masalah izin pada /var/lib/tor/ssh.

Apakah SSH melalui Tor lebih lambat daripada WireGuard?

Ya, jauh lebih lambat. 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 berlangsung lebih lama. Konfigurasi yang umum adalah menggunakan WireGuard untuk pekerjaan sehari-hari dan mempertahankan onion service sebagai jalur darurat yang tetap dapat digunakan jika konfigurasi VPN rusak.