Aplikasi yang hanya berbicara SOCKS tidak punya lawan bicara pada VPN biasa, karena terowongan membawa paket sedangkan aplikasi menginginkan titik akhir proksi. OpenSSH dapat menyediakan titik akhir itu ketika pemilik akses mengizinkannya, sebab penerusan dinamis mengubah satu sesi SSH menjadi proksi lokal. Setelah itu ada dua lompatan yang harus dijaga terpisah: terowongan yang mencapai host SSH, dan koneksi yang dibuka host itu selanjutnya. Memisahkan keduanya menjelaskan mengapa susunan ini bekerja dan apa yang tidak akan pernah dilakukannya.

Apa yang menjadi dan tidak menjadi pendengar SSH

Penerusan dinamis membuat klien SSH mendengarkan secara lokal dan berbicara SOCKS4 atau SOCKS5 dengan apa pun yang terhubung. Setiap permintaan menyebutkan tujuan dan server SSH membuka koneksi berikutnya, karena itu pencarian tujuan dapat terjadi di sisi jauh. Ini penerusan TCP pada tingkat aplikasi, bukan VPN untuk seluruh perangkat. Ia tidak membawa asosiasi UDP, tidak ICMP, dan tidak apa pun untuk aplikasi yang sama sekali mengabaikan pengaturan proksi. Lompatan dari server SSH ke aplikasi juga tidak berada di dalam terowongan Anda, yang penting ketika tujuan hanya menerima lalu lintas dari jaringan yang dikenal.

Prasyaratnya nyata: rute ke host SSH, akun yang diotorisasi, kunci host server yang terverifikasi, dan izin untuk meneruskan. Tidak satu pun dibuat oleh proksi, dan yang terakhir biasanya yang pertama hilang. Pastikan keempatnya sebelum menelusuri hal lain, karena dari sisi klien kegagalan tampak sama, mana pun yang hilang.

Jalankan di loopback dengan porta eksplisit

Pilih porta lokal yang tidak terpakai dan ikat secara eksplisit ke loopback daripada membiarkan alamatnya kosong. Tiga opsi di bawah ada masing-masing karena satu alasan.

ssh -D 127.0.0.1:1080 -NT -o ControlPath=none -o ExitOnForwardFailure=yes \
  [email protected]

-N melewati perintah jarak jauh dan -T melewati pseudo-terminal, jadi sesi hanya ada untuk meneruskan. ExitOnForwardFailure membuat klien keluar ketika pendengar tidak dapat dibuat, alih-alih berjalan tanpa penerusan yang Anda minta. ControlPath=none menjaga sesi di luar koneksi termultipleks yang ada yang mungkin menambahkan penerusannya sendiri. Loopback menjaga pendengar di luar LAN, tetapi pada mesin bersama itu bukan batas otorisasi, karena proses lokal lain juga dapat mencapainya. Referensi klien OpenSSH mendokumentasikan semua tanda ini, dan peringatan loopback muncul dari apa itu soket yang mendengarkan.

Kirim nama melalui proksi, bukan mengelilinginya

Klien SOCKS5 dapat menyelesaikan tujuan sendiri atau meminta proksi melakukannya, dan pilihan itu menentukan resolver mana yang menjawab. Dengan socks5h, curl mengirim nama host melalui proksi, sehingga pencarian terjadi di server SSH. Dengan socks5 biasa, laptop menyelesaikan lebih dulu dan hanya koneksi yang bepergian, yang diam-diam menggagalkan maksudnya ketika nama bersifat internal. Permintaan di bawah juga mengosongkan daftar tanpa-proksi, sehingga nilai NO_PROXY yang diwarisi tidak dapat mengarahkannya ke sekitar proksi.

curl -sS --noproxy '' --proxy socks5h://127.0.0.1:1080 https://app.corp.example/health

Validasi sertifikat dan login aplikasi sendiri tetap berlaku, karena proksi tidak menggantikan keduanya. Masih ada dua pencarian: laptop harus mencapai host SSH melalui jalur VPN dan DNS yang diizinkan, dan server SSH harus menyelesaikan nama aplikasi sendiri. Yang kedua dapat diuji sendiri sebelum lalu lintas apa pun melewati proksi.

ssh [email protected] getent hosts app.corp.example

Buktikan satu tujuan yang diizinkan, lalu tutup sesinya

Uji tujuan yang diizinkan kebijakan dan yang seharusnya ditolaknya, karena penerusan yang bekerja hanya membuktikan pendengar bekerja dan tidak lebih. Aplikasi melihat alamat sumber yang dipilih server SSH, dan itu bukan alamat terowongan laptop Anda. Di mana ujung jauh mencatat koneksi berdasarkan sumber, perbedaan itulah hal pertama yang harus diperiksa ketika permintaan ditolak.

Hentikan sesi melalui proses yang memilikinya, bukan dengan membunuh shell yang tidak terkait. Lalu pastikan pendengar sudah hilang, karena porta yang masih menjawab adalah sesi yang tidak benar-benar Anda tutup. Hapus hanya pengaturan proksi yang diperkenalkan latihan ini, dan biarkan sisa konfigurasi aplikasi apa adanya. Terminal tanpa pengawasan yang memegang aturan penerusan bukan layanan, dan proksi permanen membutuhkan siklus hidup yang disetujui, bukan jendela yang terlupakan.

ss -ltn | grep 1080

Kegagalan yang tidak dapat diperbaiki susunan ini

Beberapa gejala menunjuk langsung ke batas di atas, dan mengenalinya lebih awal menghemat satu sore penelusuran proksi. Tabel memetakan apa yang Anda lihat ke apa yang biasanya berarti. Apa pun di kolom terakhir adalah pertanyaan desain, bukan kesalahan konfigurasi.

What you seeWhat it usually meansWhere to look
The app connects and nothing followsIt ignores proxy settings entirelyIts own network settings, not the SSH session
A name resolution error for the destinationThe SSH server cannot resolve itServer resolver and search domains
A UDP-only application failsDynamic forwarding carries TCP onlyThis arrangement cannot serve it
curl works, the browser does notThe browser is not using the socks5h endpointBrowser proxy configuration
The listener answers after the session endedAnother process owns port 1080The ss output, then the owning process

Tiga baris pertama adalah yang salah didiagnosis orang, karena masing-masing menghasilkan percobaan koneksi alih-alih galat tentang proksinya sendiri. Nama yang diselesaikan di laptop tidak mengatakan apa pun tentang resolver server, dan kegagalan terbaca sebagai masalah sertifikat atau batas waktu. Aplikasi hanya-UDP berdiri di luar desain, bukan rusak di dalamnya, dan tidak ada opsi ssh tambahan yang mengubahnya. Baris peramban adalah pengingat biasa bahwa pengaturan proksi berlaku per aplikasi. Baris terakhir adalah alasan pemeriksaan penutupan ada: porta yang masih mendengarkan berarti sesuatu yang lain memilikinya sekarang.

Artikel terkait