Обе команде објављују локалну услугу преко Tailscale HTTPS имена и са машине која их покреће изгледају готово идентично. Разлика је у томе ко после може да дође до URL-а, а та разлика одређује које контроле вашој апликацији још требају. Serve задржава публику унутар tailnet-а, а Funnel је премешта на отворени интернет. Прво изаберите публику, а затим команду која јој одговара.

Serve одговара на питање унутар вашег tailnet-а

Serve посредује локални порт или служи локални садржај уређајима на вашем tailnet-у, и правила приступа tailnet-а и даље важе за сваки захтев. Контролна табла на порту 3000 постаје доступна на HTTPS имену које само ваши уређаји могу да разреше и са којим могу да се повежу. То је исправан подразумевани избор за интерне алате, јер је публика већ аутентификована кроз tailnet и не додајете јавну површину. URL изгледа као обичан веб-сајт и управо зато га људи узимају за такав.

Serve такође може да прикачи заглавља идентитета која описују корисника tailnet-а захтевима које прослеђује. Ако ваша апликација верује тим заглављима као аутентикацији, вежите backend за localhost да ништа друго не може да дође до њега директно, јер backend који слуша на адреси која се може рутирати може да прима захтеве који никада нису прошли кроз прокси.

Funnel мења публику у отворени интернет

Funnel објављује изабрану услугу свакоме ко има URL, а посетиоцима не требају клијент, налог ни чланство у вашем tailnet-у. Ресурсу су зато потребни аутентикација, ограничавање брзине и закрпе које бисте применили на сваку јавну услугу. Јавни захтеви не носе Serve-ова заглавља идентитета tailnet-а, па апликација која се на њих ослањала под Funnel-ом нема никакав идентитет корисника. Избор друге команде за објављивање не решава питање аутентикације уместо вас.

Funnel има и ограничења која упутство из старијег издања можда не спомиње. Завршава TLS сертификатом који Tailscale прибавља за име и подржава само одређене портове за слушање, како описује документација Funnel-а. Ако ваша услуга очекује протокол осим HTTPS на једном од тих портова, Funnel је погрешан алат, а не загонетка са конфигурацијом.

Читајте режим из клијента, а не из порта

Проверите тренутно стање пре него што било шта поделите, јер се два режима могу конфигурисати за исти локални порт у различито време. Команде стања пријављују шта је заиста објављено и коме. Не закључујте о публици из чињенице да URL одговара.

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

Синтакса команди се мењала кроз верзије клијента, па копирани позив може да изабере други режим од оног који сте намеравали. Преферирајте документовани облик за верзију коју покрећете и читајте потврду коју клијент испише уместо да је претпостављате. Ако постоје и Serve и Funnel конфигурација, јавна је она која је важна за излагање. Ресетујте конфигурацију коју нисте намеравали уместо да преко ње слажете још једну.

Зауставите се и поново прочитајте статус ако излаз не именује публику. Објављени URL без наведене публике је нагађање, а нагађања су начин на који интерне контролне табле заврше на отвореном интернету.

Тестирајте са публиком коју сте заиста намеравали

Тестирајте изван tailnet-а, а не са машине која је објавила услугу. Захтев са уређаја на tailnet-у доказује да прокси ради, али не доказује да је странац искључен. Користите мрежу без Tailscale клијента и без руте у 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

За интерну контролну таблу спољни захтев треба да не успе да се повеже или да не прође ауторизацију, а унутрашњи захтев треба да успе са идентитетом који очекујете. За јавну услугу спољни захтев треба да успе, а апликација треба да затражи сопствене акредитиве. Запишите који сте од та два исхода приметили, јер сам URL то не говори. Ако је резултат супротан намери, прво уклоните јавну конфигурацију, а затим истражите.

Објављивање услуге није иста одлука као избор излазног чвора, који контролише одакле излази ваш одлазни саобраћај. Serve и Funnel одговарају ко може да дође до нечега што покрећете, а излазни чвор одговара одакле изгледа да долазе ваше сопствене везе. Држите та два питања одвојено и поређење остаје једноставно.

Повезани чланци