Tailscale Serve vs Funnel: Pilih yang Mana?
Tailscale serve menyediakan HTTPS untuk URL khusus tailnet, sedangkan funnel membukanya ke Internet. Pahami perbedaan audiens dan kebijakan yang memblokir funnel.
tailscale serve vs funnel: siapa yang dapat mengakses URL
Perbedaan antara tailscale serve dan tailscale funnel hanya terletak pada audiensnya. serve menempatkan front end HTTPS (hypertext transfer protocol secure) pada port lokal dan hanya memublikasikannya ke tailnet Anda. funnel memublikasikan port lokal yang sama ke seluruh Internet publik melalui server relay yang dioperasikan Tailscale. Kedua perintah tersebut menggunakan flag dan target yang sama. Satu kata membedakan dashboard privat dari dashboard yang dapat dijangkau seluruh dunia.
Keduanya menyediakan sertifikat yang sudah dipercaya browser, dengan nama yang diakhiri ts.net. Keduanya juga tidak memerlukan port inbound yang terbuka pada firewall VPS Anda. Daemon tailscaled Anda sudah memiliki koneksi keluar ke tailnet, sehingga trafik masuk melalui koneksi tersebut. Menambahkan server ke tailnet adalah tugas tersendiri. Menjalankan VPS sebagai exit node Tailscale atau Mengiklankan subnet router untuk jaringan privat membahas hal tersebut. Bagian ini membahas cara memublikasikan service yang sudah berada di tailnet.
Hal yang diperlukan sebelum kedua perintah dapat berfungsi
- Tailscale 1.38.3 atau yang lebih baru pada VPS, dan sudah login ke tailnet Anda. Periksa dengan
tailscale versiondantailscale status. - MagicDNS diaktifkan. MagicDNS adalah DNS (domain name system) bawaan Tailscale. Fitur ini memberi mesin nama seperti
blog-vps.your-tailnet.ts.net, bukan hanya alamat100.x. - Sertifikat HTTPS diaktifkan untuk tailnet pada halaman DNS di konsol admin. Tanpa fitur ini, tidak ada sertifikat yang dapat dipasang di depan port Anda.
- Hanya untuk
funnel, atribut nodefunneldalam file kebijakan tailnet. Di sinilah sebagian besar percobaan pertama terhenti. Penjelasannya tersedia di bawah.
Setiap perintah di sini diawali dengan sudo karena CLI berkomunikasi dengan tailscaled melalui socket yang hanya dapat ditulisi oleh root. Berikan satu pengguna hak untuk melewati kebutuhan tersebut:
sudo tailscale set --operator=$USERPublikasikan ke tailnet Anda dengan tailscale serve
Arahkan serve ke port lokal, lalu tailscale menangani sisanya.
sudo tailscale serve 3000Available within your tailnet:
https://amelie-workstation.pango-lin.ts.net
|-- / proxy http://127.0.0.1:3000
Press Ctrl+C to exit.3000 tanpa argumen adalah singkatan dari http://127.0.0.1:3000. Tailscale mendengarkan pada port 443 di alamat tailnet mesin, melakukan terminasi TLS (transport layer security) menggunakan sertifikat ts.net, lalu meneruskan HTTP biasa ke port lokal Anda. Aplikasi Anda tidak perlu mengetahui bahwa ada sertifikat. Inilah alasan utama menggunakan konfigurasi ini di depan panel admin yang jika tidak, harus tetap menggunakan HTTP biasa.
Sekarang, perhatikan baris terakhir: Press Ctrl+C to exit. Perintah tersebut berjalan di foreground, dan pemetaan hanya ada di dalam proses itu. Jika terminal ditutup, URL berhenti berfungsi karena tidak ada konfigurasi yang ditulis ke disk. Tambahkan --bg agar pemetaan disimpan dalam konfigurasi serve node. Konfigurasi ini tetap ada setelah terminal ditutup maupun setelah reboot.
sudo tailscale serve --bg 3000Serve tidak hanya menerima nomor port. --set-path memasang sebuah service pada subpath, sehingga beberapa aplikasi dapat menggunakan satu hostname:
sudo tailscale serve --bg --set-path=/grafana 3000
sudo tailscale serve --bg --set-path=/metrics 9090Target juga dapat berupa direktori berisi file statis atau backend yang sudah menggunakan TLS dengan sertifikat yang tidak ingin Anda verifikasi:
sudo tailscale serve --bg /srv/reports
sudo tailscale serve --bg https+insecure://localhost:8443Konfigurasi ini juga tidak terbatas pada HTTP. --tcp=<port> meneruskan stream TCP (transmission control protocol) mentah, sedangkan --tls-terminated-tcp=<port> melakukan terminasi TLS pada node Anda dan meneruskan teks biasa. Dengan demikian, Anda dapat menempatkan sertifikat tepercaya di depan service yang sama sekali tidak menggunakan HTTP:
sudo tailscale serve --bg --tls-terminated-tcp=443 tcp://127.0.0.1:9899Mengapa funnel menyatakan bahwa atribut node belum ditetapkan?
Funnel dinonaktifkan secara default untuk seluruh tailnet. Proses pertama menampilkan pesan ini lalu berhenti:
Funnel not available; "funnel" node attribute not set. See https://tailscale.com/kb/1223/tailscale-funnel/.Perintahnya sudah benar. Kebijakan tailnet belum memberikan izin kepada node ini untuk melakukan publish. Karena itu, client menolak permintaan sebelum menghubungi relay. Edit file kebijakan tailnet di konsol admin, pada bagian Access Controls, lalu tambahkan atribut berikut:
"nodeAttrs": [
{
"target": ["autogroup:member"],
"attr": ["funnel"],
},
],autogroup:member memberikan izin tersebut kepada setiap anggota tailnet. Jika hanya satu mesin yang boleh melakukan publish, beri tag pada mesin tersebut lalu gunakan tag itu sebagai target, misalnya tag:public. Simpan kebijakan, lalu jalankan kembali perintah funnel.
Jika akun Anda adalah admin tailnet, client versi terbaru menyediakan pintasan. CLI mencetak URL persetujuan pada login.tailscale.com. Buka URL tersebut untuk mengaktifkan sertifikat HTTPS dan menambahkan atribut secara otomatis. Jika Anda bukan admin, URL tersebut tidak akan membantu. Pengguna yang memiliki akses ke kebijakan harus melakukan perubahan itu.
Publikasikan ke Internet dengan tailscale funnel
Setelah atribut ditetapkan, perintahnya sama seperti yang sudah Anda ketahui, tetapi menggunakan kata kerja yang berbeda.
sudo tailscale funnel --bg 3000Available on the internet:
https://amelie-workstation.pango-lin.ts.net
|-- / proxy http://127.0.0.1:3000
Press Ctrl+C to exit.Baca baris pertama itu setiap kali. Available within your tailnet dan Available on the internet adalah satu-satunya perbedaan yang terlihat antara service privat dan service publik, dan perintah untuk membuatnya hanya berbeda satu kata.
Per Agustus 2026, funnel mendengarkan pada port 443, 8443, atau 10000, dan tidak pada port lain. Port defaultnya adalah 443, sedangkan --https=8443 atau --https=10000 adalah alternatifnya. Port lain akan ditolak karena relay funnel hanya menerima koneksi pada port tersebut. Karena itu, URL funnel selalu berupa hostname tanpa tambahan apa pun, atau hostname yang diikuti :8443.
Bagaimana cara melihat apa yang saat ini dipublikasikan?
Menebak adalah cara membuat dashboard tetap terbuka untuk publik selama sebulan. Tanyakan langsung kepada node.
tailscale serve status
tailscale funnel status
tailscale serve status --jsonKedua perintah status membaca konfigurasi yang sama, sehingga salah satunya dapat menampilkan gambaran lengkap. Gunakan bentuk --json di dalam skrip atau pemeriksaan terjadwal, karena output biasa ditujukan untuk manusia. Jika tidak ada yang dikonfigurasi, Anda akan mendapatkan satu baris:
No serve configJika output tersebut muncul setelah konfigurasi yang sebelumnya berhasil, berarti mapping dibuat di foreground dan prosesnya sudah berhenti. Buat ulang mapping tersebut dengan --bg.
Untuk menghapus satu mapping, ulangi perintah yang membuatnya lalu tambahkan off di bagian akhir. Untuk menghapus semua mapping serve dan funnel pada node, gunakan reset.
sudo tailscale funnel --https=443 3000 off
sudo tailscale serve resetJalankan kembali tailscale serve status setelah salah satu tindakan tersebut, lalu baca hasil yang tersisa. Jangan berasumsi bahwa perintah tersebut melakukan hal yang Anda maksud.
Yang Anda dapatkan dan yang harus dikorbankan
Manfaatnya nyata. Itulah alasan orang memilihnya daripada reverse proxy.
- Sertifikat yang dipercaya browser dan diperbarui secara otomatis. Anda tidak perlu memasang klien ACME (automatic certificate management environment) atau mengingat pekerjaan pembaruan.
- Tidak ada port masuk pada firewall VPS.
tailscaledmelakukan koneksi keluar, sehingga firewall ufw default-deny pada VPS Anda dapat tetap dikonfigurasi seketat sebelumnya. - Tidak ada DNS record yang perlu dibeli, diarahkan, atau ditunggu.
- Tidak ada port forwarding. Hal ini sangat penting pada mesin di belakang NAT (network address translation), bukan pada VPS dengan IP publik.
Biayanya juga nyata, dan funnel mencakup semuanya.
- Nama tersebut bukan milik Anda. Pengunjung publik akan melihat
host.your-tailnet.ts.net. Funnel tidak mendukung custom domain, sehingga Anda tidak dapat menempatkanapp.example.comdi depannya. - Path tersebut bukan milik Anda. Trafik terlebih dahulu mencapai relay Tailscale, lalu relay meneruskan stream ke node Anda melalui tailnet. Tailscale menyatakan bahwa trafik funnel tunduk pada batas bandwidth yang tidak dipublikasikan dan tidak dapat dikonfigurasi. Karena itu, ukur throughput Anda sendiri sebelum mengandalkan angka tertentu.
- Kontrolnya tidak tersedia. Reverse proxy yang Anda jalankan sendiri memberi akses ke access log, rate limit, batas ukuran request, dan tempat untuk menerapkan autentikasi. Funnel hanya memberi Anda URL. Semua hal lainnya harus ditangani di dalam aplikasi Anda.
- Daftar port bersifat tetap, seperti dijelaskan di atas.
Kedua fitur tersebut juga bergantung pada infrastruktur yang dioperasikan Tailscale: penerbitan sertifikat untuk nama ts.net dan relay funnel itu sendiri. Jika Anda sedang mempertimbangkan control server Headscale yang di-host sendiri, jangan menganggap salah satunya akan ikut tersedia. Periksa catatan rilis untuk versi Headscale yang ingin Anda jalankan.
Yang mana yang harus saya gunakan?
Aturannya singkat.
Gunakan serve untuk hal-hal internal: antarmuka admin, dasbor, UI metrik yang tidak ingin Anda indeks, atau salinan staging sebuah situs. Keanggotaan tailnet menjadi kontrol akses, dan ini merupakan kontrol akses yang baik. Perangkat yang tidak berada di tailnet bahkan tidak dapat me-resolve nama tersebut.
Gunakan funnel untuk tautan demo, penerima webhook yang harus menerima permintaan POST dari pihak ketiga, atau callback OAuth selama pengembangan. Ini adalah cara tercepat untuk mendapatkan URL HTTPS publik, dan satu perintah off dapat mengakhirinya. Namun, publik berarti publik: hostname bukan rahasia, dan funnel di depan aplikasi tanpa login merupakan layanan terbuka. Apa pun yang berada di belakangnya harus mengautentikasi permintaannya sendiri, dengan kehati-hatian yang sama seperti yang diperlukan oleh endpoint API Ollama yang terekspos.
Gunakan reverse proxy sungguhan untuk segala sesuatu yang Anda anggap production. Domain Anda, sertifikat Anda, log Anda, rate limit Anda, dan tidak ada pihak lain dalam jalur permintaan. Perbandingan nginx, Caddy, dan Traefik sebagai reverse proxy membahas cara memilihnya.
Mode kegagalan dan string yang akan Anda lihat
Funnel menolak untuk dijalankan. Funnel not available; "funnel" node attribute not set. adalah masalah kebijakan, bukan masalah perintah. Tambahkan atribut funnel ke file kebijakan tailnet, simpan, lalu coba lagi.
Sebelumnya berhasil, tetapi sekarang tailscale serve status menampilkan No serve config. Pemetaan dibuat di foreground dan proses tersebut telah berakhir. Jalankan kembali perintah yang sama dengan --bg.
Nama berhasil di-resolve, tetapi tidak ada respons. Serve meneruskan proxy ke target yang Anda tentukan. Jika tidak ada proses yang listening di sana, tidak ada tujuan untuk proxy. Konfirmasikan dengan ss -ltnp | grep 3000 pada mesin yang sama yang menjalankan tailscaled. Penyebab yang sering terjadi adalah container memublikasikan port-nya pada alamat bridge Docker, bukan 127.0.0.1. Akibatnya, host tidak melihat listener pada lokasi yang Anda harapkan. Cara kerja jaringan Docker Compose menjelaskan lokasi sebenarnya dari port yang dipublikasikan.
Terjadi error sertifikat pada nama ts.net. Sertifikat HTTPS kemungkinan besar belum diaktifkan untuk tailnet. Aktifkan sertifikat tersebut di admin console, lalu jalankan langkah penerbitan sertifikat secara terpisah agar error-nya tidak tercampur dengan output serve:
sudo tailscale cert your-host.your-tailnet.ts.netFunnel dapat dimuat melalui data seluler, tetapi berperilaku berbeda dari laptop Anda. Laptop Anda terhubung ke tailnet, sehingga MagicDNS me-resolve nama tersebut ke alamat 100.x dan Anda mengakses service secara langsung tanpa melalui relay. Perilaku ini benar. Artinya, laptop Anda sama sekali tidak dapat menguji keterjangkauan publik. Gunakan curl dari mesin yang tidak terhubung ke tailnet.
FAQ
Apa perbedaan antara tailscale serve dan tailscale funnel?
Siapa yang dapat menjangkau hasilnya. tailscale serve memublikasikan port lokal pada URL HTTPS yang hanya dapat dijangkau oleh perangkat di tailnet Anda. tailscale funnel memublikasikan port yang sama pada URL yang dapat dijangkau oleh siapa pun di Internet, melalui server relay yang dioperasikan Tailscale. Flag dan target yang digunakan keduanya sama. Baris output pertama menunjukkan opsi yang Anda gunakan: Available within your tailnet atau Available on the internet.
Mengapa tailscale funnel menyatakan bahwa atribut node belum ditetapkan?
Karena funnel dinonaktifkan untuk sebuah tailnet sampai seseorang mengaktifkannya. Pesan tersebut adalah Funnel not available; "funnel" node attribute not set. dan berasal dari client Anda sendiri, sebelum client menghubungi relay mana pun. Tambahkan entri nodeAttrs yang memberikan atribut funnel kepada autogroup:member, atau kepada tag jika hanya satu mesin yang boleh memublikasikan layanan, dalam file kebijakan tailnet di bagian Access Controls. Admin tailnet juga dapat mengikuti URL persetujuan yang ditampilkan oleh CLI.
Port mana yang dapat digunakan Tailscale Funnel?
Hanya 443, 8443, dan 10000. Nilai defaultnya adalah 443. Anda dapat memilih port lain dengan --https=8443 atau --https=10000. Ini adalah batasan pada relay funnel, bukan pada server Anda. Karena itu, perubahan firewall atau konfigurasi pada VPS tidak dapat menghilangkan batasan tersebut. tailscale serve tidak memiliki batasan ini karena trafiknya tidak pernah keluar dari tailnet Anda.
Apakah URL serve atau funnel tetap tersedia setelah reboot?
Hanya jika Anda menggunakan --bg. Tanpa opsi tersebut, perintah berjalan di foreground, menampilkan Press Ctrl+C to exit., dan pemetaan akan hilang bersama prosesnya. Dengan --bg, pemetaan ditulis ke konfigurasi serve node dan aktif kembali melalui tailscaled setelah reboot. Periksa dengan tailscale serve status. Perintah tersebut menampilkan No serve config jika belum ada konfigurasi.
Apakah aman membiarkan funnel tetap berjalan?
Aman dari sisi transportasi: koneksi menggunakan HTTPS dan tidak ada port yang terbuka pada firewall Anda. Namun, hal ini tidak aman dalam pengertian yang biasanya dimaksud, karena URL tersebut bersifat publik. Dengan demikian, aplikasi di belakangnya juga bersifat publik. Biarkan funnel aktif hanya di depan aplikasi yang mengautentikasi request-nya sendiri. Hentikan funnel setelah demo atau pengujian webhook selesai dengan menjalankan perintah yang membuatnya, lalu menambahkan off di bagian akhir.
Sumber untuk perilaku perintah di atas adalah dokumentasi Tailscale Serve dan Funnel serta referensi CLI di tailscale.com/docs.