Kedua perintah memublikasikan layanan lokal melalui nama HTTPS Tailscale, dan dari mesin yang menjalankannya keduanya tampak hampir identik. Perbedaannya adalah siapa yang dapat menjangkau URL setelahnya, dan perbedaan itu menentukan kontrol apa yang masih dibutuhkan aplikasi Anda. Serve menjaga audiens di dalam tailnet, sedangkan Funnel memindahkannya ke internet terbuka. Pilih audiens lebih dulu, lalu pilih perintah yang cocok dengannya.

Serve menjawab pertanyaan di dalam tailnet Anda

Serve mem-proxy port lokal atau menyajikan konten lokal ke perangkat di tailnet Anda, dan aturan akses tailnet tetap berlaku untuk setiap permintaan. Dasbor pada port 3000 menjadi dapat dijangkau di nama HTTPS yang hanya dapat di-resolve dan dihubungi oleh perangkat Anda. Ini adalah default yang tepat untuk alat internal, karena audiens sudah diautentikasi oleh tailnet dan Anda tidak menambahkan permukaan publik. URL-nya terlihat seperti situs web biasa, dan itulah sebabnya orang menganggapnya sebagai situs biasa.

Serve juga dapat melampirkan header identitas yang menjelaskan pengguna tailnet ke permintaan yang diteruskannya. Jika aplikasi Anda memercayai header tersebut sebagai autentikasi, ikat backend ke localhost agar tidak ada hal lain yang dapat menjangkaunya secara langsung; backend yang mendengarkan pada alamat yang dapat dirutekan dapat menerima permintaan yang tidak pernah melewati proxy.

Funnel mengubah audiens menjadi internet terbuka

Funnel memublikasikan layanan terpilih kepada siapa pun yang memiliki URL, dan pengunjung tidak memerlukan klien, akun, atau keanggotaan di tailnet Anda. Karena itu sumber daya tersebut membutuhkan autentikasi, pembatasan laju, dan patch yang akan Anda terapkan pada layanan publik mana pun. Permintaan publik tidak membawa header identitas tailnet milik Serve, sehingga aplikasi yang mengandalkannya sama sekali tidak memiliki identitas pengguna di bawah Funnel. Memilih perintah publikasi yang berbeda tidak menjawab pertanyaan autentikasi untuk Anda.

Funnel juga memiliki batasan yang mungkin tidak disebutkan tutorial dari rilis lama. Funnel mengakhiri TLS dengan sertifikat yang diperoleh Tailscale untuk nama tersebut, dan hanya mendukung port pendengaran tertentu, seperti yang dijelaskan dokumentasi Funnel. Jika layanan Anda mengharapkan protokol selain HTTPS pada salah satu port itu, Funnel adalah alat yang salah, bukan teka-teki konfigurasi.

Baca mode dari klien, bukan dari port

Periksa status saat ini sebelum membagikan apa pun, karena kedua mode dapat dikonfigurasi untuk port lokal yang sama pada waktu yang berbeda. Perintah status melaporkan apa yang sebenarnya dipublikasikan dan kepada siapa. Jangan menyimpulkan audiens dari fakta bahwa sebuah URL merespons.

tailscale serve status
tailscale funnel status
tailscale status --json | head -40

Sintaks perintah telah berubah antarversi klien, sehingga pemanggilan yang disalin dapat memilih mode yang berbeda dari yang Anda maksud. Utamakan bentuk yang terdokumentasi untuk versi yang Anda jalankan, dan baca konfirmasi yang dicetak klien alih-alih mengasumsikannya. Jika ada konfigurasi Serve dan Funnel sekaligus, yang publik adalah yang penting untuk eksposur. Atur ulang konfigurasi yang tidak Anda maksud alih-alih menumpuk konfigurasi lain di atasnya.

Berhenti dan baca ulang status jika keluaran tidak menyebutkan audiens. URL yang dipublikasikan tanpa audiens yang dinyatakan adalah tebakan, dan tebakan adalah cara dasbor internal berakhir di internet terbuka.

Uji dengan audiens yang benar-benar Anda maksud

Uji dari luar tailnet, bukan dari mesin yang memublikasikan layanan. Permintaan dari perangkat tailnet membuktikan proxy berfungsi; itu tidak membuktikan bahwa orang asing dikecualikan. Gunakan jaringan yang tidak memiliki klien Tailscale dan tidak memiliki rute ke tailnet.

curl -sI https://host.tailnet-name.ts.net
curl -sI https://host.tailnet-name.ts.net --resolve host.tailnet-name.ts.net:443:203.0.113.10

Untuk dasbor internal, permintaan luar seharusnya gagal terhubung atau gagal otorisasi, dan permintaan dalam seharusnya berhasil dengan identitas yang Anda harapkan. Untuk layanan publik, permintaan luar seharusnya berhasil dan aplikasi seharusnya meminta kredensialnya sendiri. Catat mana dari dua hasil itu yang Anda amati, karena URL saja tidak memberi tahu Anda. Jika hasilnya berlawanan dengan maksud, hapus konfigurasi publik lebih dulu lalu selidiki.

Memublikasikan layanan juga bukan keputusan yang sama dengan memilih exit node, yang mengontrol dari mana lalu lintas keluar Anda keluar. Serve dan Funnel menjawab siapa yang dapat menjangkau sesuatu yang Anda jalankan; exit node menjawab dari mana koneksi Anda sendiri tampak datang. Pisahkan kedua pertanyaan itu dan perbandingannya tetap sederhana.

Artikel terkait