Kebanyakan sysadmin menggunakan SSH setiap hari โ tetapi nombor yang mengejutkan hanya menggunakannya untuk log masuk ke dalam kotak dan menjalankan arahan. Itu seperti memiliki pisau Swiss Army dan hanya menggunakan pencungkil gigi. SSH mempunyai kuasa besar kedua yang hampir tiada siapa menggunakan potensi penuhnya: port forwarding. Ia boleh menukar sambungan SSH menjadi terowong rangkaian atas permintaan yang disulitkan sepenuhnya yang membolehkan anda mencapai perkhidmatan yang tidak sepatutnya anda capai secara langsung.
Mari kita pecahkan tiga perisa terowong SSH, masa untuk menggunakan setiap satu, dan helah konfigurasi kecil yang membuatnya melekat.
Idea Besar: SSH Adalah Paip Universal
Terowong SSH ialah cara untuk membungkus sebarang trafik TCP di dalam sesi SSH anda yang disulitkan. Fikirkannya sebagai hos yang tegang dan selamat: satu hujung terletak pada mesin anda, hujung satu lagi terletak pada pelayan jauh atau tempat yang boleh dicapai oleh pelayan jauh, dan semua yang mengalir melalui hos disulitkan oleh SSH.
Mengapa perkara ini penting dalam amalan? Kerana dalam persekitaran yang dibina dengan baik, kebanyakan perkhidmatan tidak terdedah kepada internet โ dan ia tidak sepatutnya. Pangkalan data MySQL anda, papan pemuka Grafana dalaman anda, cache Redis anda, konsol VNC anda, panel pentadbir warisan itu: tiada satu pun daripada ini harus mempunyai port awam. Tetapi kadangkala anda, pengendali yang dipercayai, perlu menghubungi mereka dari komputer riba anda. Itulah masalah yang diselesaikan oleh terowong SSH.
Model mental utama yang perlu diingat: SSH sentiasa memberi anda satu sambungan yang disahkan dan disulitkan. Terowong hanya menentukan tempat untuk membuat lubang pada tembok api pada setiap hujung sambungan itu.
Pemajuan Setempat (`-L`): Capai Perkara yang Boleh Dicapai Pelayan
Pemajuan tempatan ialah bentuk yang paling biasa dan yang anda akan gunakan 90% sepanjang masa. Anda ingin mencapai perkhidmatan yang hidup pada rangkaian jauh โ tetapi daripada mesin tempatan anda. Sintaks:
Seorang ke hadapan tempatan (-L):
```bash
ssh -L 8080:localhost:3000 user@server.example.com
```
Baca itu sebagai: "Buka port 8080 pada mesin tempatan saya, dan majukan semua yang menyentuhnya ke port 3000 pada hos jauh, merentas sesi SSH ini."
Silap mata yang mengelirukan pemula ialah alamat tengah. Ia diselesaikan dari sudut pandangan pelayan jauh, bukan milik anda. Jadi dalam contoh di atas, `localhost:3000` bermaksud "port 3000 pada pelayan jauh itu sendiri." Tetapi anda boleh menunjukkannya ke tempat yang lebih dalam:
```bash
ssh -L 5432:db.internal:5432 user@bastion.example.com
```
Kini anda mempunyai port Postgres tempatan yang sebenarnya mendarat pada pangkalan data dalaman yang boleh dicapai oleh benteng itu. Anda tidak pernah membuka peraturan tembok api, anda tidak pernah mendedahkan pangkalan data, dan semuanya disulitkan. Kes penggunaan klasik:
- Grafana / Prometheus: `ssh -L 3000:localhost:3000 user@monitoring-host` kemudian semak imbas `http://localhost:3000`
- MySQL: `ssh -L 3306:localhost:3306 user@db-host` kemudian halakan klien anda ke localhost
- Apl web pada hos peribadi: maju ke `http://localhost:8080`
Satu gotcha: secara lalai, port tempatan hanya terikat kepada `127.0.0.1`. Jika anda mahu mesin lain pada LAN anda menggunakan terowong anda (jarang idea yang bagus), tambahkan `-g`. Jangan buat begitu sahaja โ anda akan mendedahkan semula perkhidmatan yang anda cuba sembunyikan.
Pemajuan Jauh (`-R`): Biarkan Bahagian Luar Masuk
Pemajuan jauh ialah imej cermin, dan ialah yang membuka kunci masalah "Saya di belakang NAT". Di sini anda mahu perkhidmatan pada mesin tempatan anda (atau rangkaian tempatan anda) boleh dicapai dari pelayan jauh. Jadi lubang itu ditebuk di hujung terpencil.
Ke hadapan jauh (-R):
```bash
ssh -R 9000:localhost:3000 user@server.example.com
```
Bacanya sebagai: "Buka port 9000 pada pelayan jauh, dan majukan semua yang menyentuhnya kembali ke terowong ke port 3000 pada mesin tempatan saya."
Kes penggunaan pembunuh sedang sampai ke makmal rumah anda atau mesin pembangun di belakang NAT gred pembawa. Anda tidak boleh membuka port pada penghala rumah anda, tetapi anda boleh membuat sambungan SSH keluar ke pelayan dengan IP awam. Setelah sambungan itu selesai, pelayan awam boleh mencapai kembali ke rangkaian anda:
Dari kotak di belakang NAT, ke hadapan supaya port pelayan awam 2222 mendarat pada port SSH mesin tempatan 22:
```bash
ssh -R 2222:localhost:22 user@public.example.com
```
Kini sesiapa sahaja di pelayan awam boleh `ssh -p 2222 localhost` dan mendarat pada mesin belakang-NAT anda. Ia adalah proksi terbalik orang miskin, saluran sokongan ke dalam rangkaian pelanggan dan cara untuk menunjukkan binaan tempatan kepada rakan sekerja โ semuanya tidak lebih daripada arahan SSH. Pertimbangan `-g` yang berkaitan juga digunakan di sini: sama ada port jauh yang dimajukan terikat kepada gelung balik atau semua antara muka bergantung pada tetapan `GatewayPorts` pelayan.
Pemajuan Dinamik (`-D`): Proksi SOCKS Peribadi Anda
Ke hadapan tempatan dan jauh adalah titik ke titik: satu pelabuhan tempatan, satu destinasi. Pemajuan dinamik adalah berbeza โ ia menukar sambungan SSH anda menjadi proksi SOCKS5. Anda memberikannya satu port tempatan dan mana-mana aplikasi yang bercakap SOCKS boleh menghalakan trafik *sewenang-wenangnya melalui terowong, dengan destinasi diselesaikan dan didail dari bahagian terpencil.
Ke hadapan dinamik (-D):
```bash
ssh -D 1080 user@server.example.com
```
Kemudian halakan penyemak imbas atau alat anda ke `socks5://localhost:1080`. Tiba-tiba setiap permintaan keluar dari kedudukan rangkaian hos jauh. Ini adalah cara anda:
- Semak imbas wiki dalaman seolah-olah anda berada di rangkaian korporat
- Laluan alat ujian `curl` atau API melalui lokasi keluar tertentu
- Jangkau berpuluh-puluh hos dalaman tanpa menyediakan satu peraturan `-L`
Untuk contoh CLI pantas, curl menyokong SOCKS secara langsung:
```bash
curl --socks5-hostname localhost:1080 https://internal-wiki.example.com
```
Varian `--socks5-hostname` adalah penting: ia menyerahkan resolusi nama hos ke bahagian jauh, jadi nama DNS dalaman sahaja sebenarnya diselesaikan. Ini adalah satu-satunya sumber terbesar kekeliruan "mengapa terowong dinamik saya tidak berfungsi".
Lompat Hos: Melompat Melalui Benteng
Dalam persekitaran yang keras, anda selalunya tidak dapat mencapai pelayan sasaran secara langsung โ anda perlu melalui benteng atau hos lompat. Ramai orang merantai arahan SSH dengan tangan, yang kikuk dan menghalang pengurusan kunci yang betul. Jawapan moden ialah `ProxyJump`:
```bash
ssh -J jumpuser@bastion.example.com pengguna@pelayan-dalam
```
Ini membuka terowong ke benteng, kemudian sesi SSH kedua melaluinya ke pelayan dalaman. Kunci, ejen dan kunci hos semuanya berkelakuan dengan betul. Anda juga boleh merangkai berbilang lompatan dengan koma:
```bash
ssh -J pengguna@bastion1,pengguna@bastion2 pengguna@target-akhir
```
Di bawah tudung, `ProxyJump` melakukan muslihat pemajuan port yang sama yang baru anda pelajari โ ia adalah pemaju tempatan ke port SSH sasaran melalui benteng. Ini bermakna sebaik sahaja anda memahami `-L`, `ProxyJump` berhenti menjadi sihir dan menjadi jelas.
Menjadikannya Kekal: Fail `~/.ssh/config`
Tiada siapa yang mahu menaip perintah SSH enam bahagian setiap pagi. Fail `~/.ssh/config` membolehkan anda menamakan terowong anda dan mendapatkannya dengan satu perkataan. Berikut ialah blok yang realistik:
Entri konfigurasi SSH dengan terowong automatik:
```
Tuan rumah grafana-terowong
HostName monitoring.example.com
Pentadbir pengguna
LocalForward 3000 localhost:3000
ServerAliveInterval 60
ServerAliveCountMax 3
```
Sekarang `ssh grafana-tunnel` membuka terowong dan menjatuhkan anda ke dalam cangkerang. Tambah `-N` untuk menekan cangkerang dan `-f` untuk menolaknya ke latar belakang jika anda hanya mahu terowong:
```bash
ssh -f -N grafana-terowong
```
Kedua-dua bendera itu โ `-N` (tiada perintah/shell) dan `-f` (latar belakang selepas pengesahan) โ ialah roti dan mentega aliran kerja "berikan saya terowong sahaja". Tetapan `ServerAliveInterval` ialah wira senyap: mereka mengekalkan terowong daripada mati secara senyap apabila peranti NAT atau pengimbang beban memutuskan sambungan terbiar boleh guna. Jika terowong anda berhenti berfungsi secara misteri selepas beberapa minit, inilah sebabnya.
Perangkap & Nota Keselamatan Biasa
Terowong SSH berkuasa, bermakna ia patut dihormati. Beberapa pelajaran yang sukar diperoleh:
- Port konflik. Jika port 8080 sudah digunakan secara tempatan, terowong gagal secara senyap-ish dengan mesej "bind: Address already in use". Pilih pelabuhan tempatan lain atau cari apa yang mencangkung di atasnya dengan `ss -lntp`.
- Alamat tengah adalah relatif jauh. Ulangi ini sehingga ia refleks. `-L 5432:localhost:5432` ialah bukan 5432 tempatan anda; ia adalah alat kawalan jauh.
- Terowong bukan pintasan keselamatan. Anda masih memerlukan bukti kelayakan yang sah untuk sebarang perkhidmatan yang anda capai. Terowong menggerakkan trafik, ia tidak memberikan akses.
- Tonton siapa yang boleh menggunakan terowong anda. Lebih suka ikatan loopback. Hanya tambah `-g` atau dayakan `GatewayPorts` apabila anda benar-benar memerlukan akses seluruh LAN, dan fahami bahawa anda kemudiannya mendedahkan perkhidmatan itu kepada semua orang yang boleh mencapai mesin anda.
- Terowong tidak kekal. Ia hidup hanya selagi sesi SSH. Untuk apa-apa yang kekal, gunakan perkhidmatan sebenar (WireGuard, proksi terbalik, VPN) dan bukannya timbunan bendera `-L`.
Bayaran
Pemajuan port ialah salah satu kemahiran yang secara senyap-senyap mengubah cara anda bekerja. Sebaik sahaja ia mengklik, anda berhenti meminta pasukan rangkaian untuk "buka sahaja port itu", berhenti mendedahkan papan pemuka ke Internet hanya untuk menyemak graf dan berhenti disekat oleh benteng. Anda mencapai apa yang anda perlukan, tepat apabila anda memerlukannya, dan keseluruhan laluan disulitkan hujung ke hujung.
Ketahui tiga mod โ `-L`, `-R` dan `-D` โ hafal `-N` dan `-f`, kemudian alihkan terowong pengeluaran anda ke `~/.ssh/config`. Itulah keseluruhan kit alat, dan ia akan membantu anda sepanjang kerjaya anda.
Pengendali pintar tidak meluaskan permukaan serangan. Pengendali pintar membina terowong selamat sebaliknya.

Infografik: SSH Tunneling Demystified
💬 0 Comments