Tailscale Serve hay Funnel: ai thực sự có thể mở liên kết?
Serve chia sẻ dịch vụ với tailnet của bạn, còn Funnel phơi bày nó ra internet mở. Hãy so sánh đối tượng truy cập, các tiêu đề danh tính và các cổng mà Funnel cho phép.
Cả hai lệnh đều công bố một dịch vụ cục bộ qua tên HTTPS của Tailscale, và từ máy chạy chúng, chúng trông gần như giống hệt nhau. Khác biệt nằm ở việc ai có thể truy cập URL sau đó, và chính khác biệt ấy quyết định ứng dụng của bạn còn cần những kiểm soát nào. Serve giữ đối tượng truy cập bên trong tailnet, còn Funnel chuyển nó ra internet mở. Hãy chọn đối tượng truy cập trước, rồi chọn lệnh phù hợp với nó.
Serve trả lời một câu hỏi bên trong tailnet của bạn
Serve làm proxy cho một cổng cục bộ hoặc phục vụ nội dung cục bộ cho các thiết bị trong tailnet của bạn, và các quy tắc truy cập của tailnet vẫn áp dụng cho mọi yêu cầu. Một bảng điều khiển trên cổng 3000 trở nên truy cập được qua một tên HTTPS mà chỉ thiết bị của bạn mới phân giải và kết nối được. Đây là mặc định đúng cho các công cụ nội bộ, vì đối tượng truy cập đã được tailnet xác thực và bạn không thêm bề mặt công khai nào. URL trông như một trang web bình thường, và chính vì thế người ta nhầm nó là một trang như vậy.
Serve cũng có thể đính kèm các tiêu đề danh tính mô tả người dùng tailnet vào các yêu cầu mà nó chuyển tiếp. Nếu ứng dụng của bạn tin các tiêu đề đó như xác thực, hãy gắn backend vào localhost để không gì khác có thể chạm tới nó trực tiếp; một backend lắng nghe trên địa chỉ có thể định tuyến có thể nhận các yêu cầu chưa bao giờ đi qua proxy.
Funnel thay đổi đối tượng truy cập thành internet mở
Funnel công bố một dịch vụ đã chọn cho bất kỳ ai có URL, và khách truy cập không cần ứng dụng khách, tài khoản hay tư cách thành viên trong tailnet của bạn. Do đó tài nguyên cần xác thực, giới hạn tốc độ và các bản vá mà bạn sẽ áp dụng cho bất kỳ dịch vụ công khai nào. Các yêu cầu công khai không mang tiêu đề danh tính tailnet của Serve, nên một ứng dụng từng dựa vào chúng hoàn toàn không có danh tính người dùng dưới Funnel. Chọn một lệnh công bố khác không trả lời câu hỏi xác thực thay bạn.
Funnel cũng có những ràng buộc mà một hướng dẫn từ bản phát hành cũ hơn có thể không nhắc tới. Nó kết thúc TLS bằng chứng chỉ mà Tailscale lấy cho tên đó, và chỉ hỗ trợ một số cổng lắng nghe nhất định, như tài liệu của Funnel mô tả. Nếu dịch vụ của bạn mong đợi một giao thức khác HTTPS trên một trong các cổng đó, Funnel là công cụ sai chứ không phải một câu đố cấu hình.
Đọc chế độ từ ứng dụng khách, không phải từ cổng
Kiểm tra trạng thái hiện tại trước khi chia sẻ bất cứ điều gì, vì hai chế độ có thể được cấu hình cho cùng một cổng cục bộ ở những thời điểm khác nhau. Các lệnh trạng thái báo cáo điều gì thực sự được công bố và cho ai. Đừng suy ra đối tượng truy cập từ việc một URL phản hồi.
tailscale serve status
tailscale funnel status
tailscale status --json | head -40
Cú pháp lệnh đã thay đổi giữa các phiên bản ứng dụng khách, nên một lệnh gọi được sao chép có thể chọn chế độ khác với ý định của bạn. Hãy ưu tiên dạng được ghi trong tài liệu cho phiên bản bạn chạy, và đọc phần xác nhận mà ứng dụng khách in ra thay vì giả định. Nếu tồn tại cả cấu hình Serve và Funnel, cấu hình công khai là cái quan trọng cho việc phơi bày. Hãy đặt lại cấu hình mà bạn không định dùng thay vì chồng thêm một cái khác lên.
Dừng lại và đọc lại trạng thái nếu đầu ra không nêu đối tượng truy cập. Một URL được công bố mà không nêu đối tượng truy cập là một phỏng đoán, và phỏng đoán là cách các bảng điều khiển nội bộ kết thúc trên internet mở.
Kiểm thử với đúng đối tượng truy cập mà bạn nhắm tới
Kiểm thử từ bên ngoài tailnet, không phải từ máy đã công bố dịch vụ. Một yêu cầu từ thiết bị trong tailnet chứng minh proxy hoạt động; nó không chứng minh rằng người lạ bị loại trừ. Hãy dùng một mạng không có ứng dụng khách Tailscale và không có tuyến vào 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
Với một bảng điều khiển nội bộ, yêu cầu bên ngoài phải không kết nối được hoặc không được phép, còn yêu cầu bên trong phải thành công với danh tính bạn mong đợi. Với một dịch vụ công khai, yêu cầu bên ngoài phải thành công và ứng dụng phải yêu cầu thông tin xác thực của chính nó. Hãy ghi lại bạn đã quan sát kết quả nào trong hai kết quả đó, vì chỉ URL không cho bạn biết. Nếu kết quả ngược với ý định, hãy gỡ cấu hình công khai trước rồi mới điều tra.
Công bố một dịch vụ cũng không phải là quyết định giống như chọn một nút thoát, thứ kiểm soát nơi lưu lượng đi ra của bạn rời mạng. Serve và Funnel trả lời ai có thể chạm tới thứ bạn chạy; một nút thoát trả lời các kết nối của chính bạn trông như đến từ đâu. Hãy tách hai câu hỏi đó ra và việc so sánh vẫn đơn giản.