Terminal disambungkan, gesaan muncul, dan semua orang bersetuju bahawa akses SSH berfungsi. Kemudian klien pangkalan data pada komputer riba masih tidak dapat mencapai hos peribadi, dan sesi itu dipersalahkan. Apa yang dibina ialah shell, dan ia salah satu daripada empat antara muka yang agak berbeza yang boleh ditawarkan SSH. Namakan antara muka itu dahulu, kemudian uji bahawa aplikasi benar-benar menggunakannya. Urutan penting, kerana setiap antara muka gagal dengan caranya sendiri.

Namakan antara muka sebelum membandingkan apa-apa

manual klien OpenSSH membezakan empat mekanisme yang mudah dikelirukan. Shell atau arahan jauh dilaksanakan pada hos SSH. Pemajuan setempat membuka soket mendengar pada klien dan membuat sambungan seterusnya dari sisi jauh. Pemajuan jauh melakukan sebaliknya, mendengar di sisi pelayan. Pemajuan dinamik mendedahkan titik akhir SOCKS kepada program yang tahu cara menggunakannya.

  • Shell: program berjalan pada mesin jauh, tiada apa yang mendengar secara setempat.
  • Pemajuan setempat: komputer riba anda mempunyai port, hos jauh membuat sambungan keluar.
  • Pemajuan jauh: sisi jauh mempunyai port, trafik kembali ke arah anda.
  • Dinamik: proksi SOCKS pada klien, hanya digunakan oleh aplikasi yang memahami proksi.

Tiada satu pun daripada ini memasang laluan. Program yang mengabaikan tetapan proksi, atau bercakap UDP, atau menyelesaikan nama sendiri, tidak terjejas oleh sesi SSH yang aktif. Itu bukan pepijat dalam SSH; itu skop antara muka yang anda pilih.

Pemajuan setempat, jauh dan dinamik berbeza dari segi siapa yang mendengar

Perbezaan yang menentukan kebanyakan kes ialah siapa yang memiliki soket mendengar. Dengan pemajuan setempat, klien mendengar dan hujung jauh mendail destinasi, itulah sebabnya alamat destinasi diselesaikan dari sudut pandangan pelayan. Dengan pemajuan jauh, pelayan mendengar dan sambungan dibawa kembali ke sisi anda, dan begitulah anda mendedahkan perkhidmatan setempat tanpa menerbitkannya secara langsung.

ssh -N -L 5432:db.internal.example:5432 [email protected]
ssh -N -D 1080 [email protected]
ss -ltnp | grep -E '5432|1080'

Arahan pertama mengikat port 5432 pada komputer riba dan memajukannya ke pangkalan data seperti yang dilihat dari bastion. Yang kedua mencipta proksi SOCKS pada port 1080. Arahan ketiga mengesahkan proses mana yang benar-benar mendengar, dan itulah satu-satunya bukti bahawa pemajuan itu wujud dan bukan gagal secara senyap kerana konflik port.

Pemajuan dinamik wajar mendapat amaran tersendiri: ia hanya meliputi aplikasi yang menghormati SOCKS. Pelayar boleh dihalakan kepadanya, alat baris arahan boleh diberitahu untuk menggunakannya, tetapi pemacu pangkalan data dengan tindanan sambungannya sendiri biasanya tidak boleh. Menganggap bahawa setiap program pada mesin kini menggunakan terowong ialah kesilapan paling biasa dalam seluruh bidang ini.

Mod peranti terowong ialah satu-satunya pengecualian rangkaian yang sebenar

OpenSSH juga menyokong pemajuan peranti terowong -w, yang menyalurkan antara muka titik ke titik dan bukannya pendengar TCP. Itu terowong rangkaian sebenar, dan ia dikonfigurasikan dengan sengaja, bukan kesan sampingan membuka shell.

sudo ssh -w 0:0 [email protected]
ip addr show tun0

Ia memerlukan nombor antara muka yang sepadan tersedia pada kedua-dua hujung, konfigurasi yang betul pada pelayan, dan keistimewaan yang cukup pada klien untuk mencipta peranti itu. Ia juga memerlukan pelan pengalamatan dan penghalaan, kerana antara muka kosong tidak membawa sebarang dasar tentang destinasi mana yang patut menggunakannya.

Walaupun begitu, terowong berakhir pada hos jauh. Apa jua perlindungan yang diberikan oleh pengangkutan SSH berakhir di situ, dan sambungan seterusnya ialah lonjakan berasingan. Get laluan VPN mempunyai bentuk sempadan yang sama, itulah sebabnya perbandingan haruslah tentang skop dan penamatan dan bukannya tentang alat mana yang lebih kuat. Menyebut sempadan itu dengan lantang juga menyelesaikan perdebatan sama ada terowong «menyulitkan segala-galanya», kerana jelas ia tidak.

Uji bahawa aplikasi anda menggunakan antara muka yang anda bina

Pengesahan adalah bagi setiap aplikasi, bukan setiap sesi. Pemajuan yang berfungsi membuktikan port terikat dan sisi jauh boleh mendail; ia tidak membuktikan bahawa program yang anda pedulikan disambungkan melaluinya.

curl -sS --socks5-hostname 127.0.0.1:1080 -o /dev/null -w '%{http_code}\n' https://app.internal.example/health
psql "host=127.0.0.1 port=5432 dbname=app sslmode=require" -c 'select 1'

Arahan pertama menghantar permintaan melalui titik akhir SOCKS dengan nama hos diselesaikan dari jauh, dan yang kedua menguji port pangkalan data yang dimajukan dengan TLS masih diperlukan. Jalankan ujian yang sama dengan pemajuan dihentikan untuk mengesahkan ia gagal, kerana ujian yang lulus kedua-dua cara tidak pernah menggunakan terowong.

Kemudian bandingkan dengan VPN berpenghala hanya pada dimensi yang penting: destinasi mana yang diliputi, protokol mana yang berfungsi, di mana perlindungan berakhir, dan siapa yang mesti meluluskan akses. Pemajuan bagi satu perkhidmatan boleh menjadi jawapan yang lebih sempit dan lebih baik, manakala VPN ialah bentuk yang betul apabila banyak aplikasi memerlukan laluan rangkaian yang sama. Kedua-duanya tidak memberikan segala yang boleh dicapai dari titik akhir jauhnya.

Artikel berkaitan