
Trả lời nhanh: Bốn lỗi, bốn gốc: 502, Serve/Funnel chạy nhưng app đích chết hoặc trỏ sai cổng (curl localhost kiểm ngay); TLS handshake error / can't generate certificates, chưa bật HTTPS Certificates trong admin console mục DNS; https support is disabled, cùng nguyên nhân, bật là hết; ssl_error_rx_record_too_long, mở https vào một cổng đang nói http (sai scheme/port).
Serve và Funnel hứa hẹn HTTPS một lệnh, và giữ lời trong đa số trường hợp, nhưng khi trục trặc thì thông báo lỗi khá khó lần: 502 từ proxy, TLS handshake từ tầng chứng chỉ, ssl_error từ trình duyệt. Bài này gom cả cụm lỗi HTTPS của Tailscale về một quy trình lần ngược: app đích → cấu hình serve → chứng chỉ → client, kèm lệnh kiểm tại mỗi chặng.
- 502 = proxy của Tailscale sống nhưng app đích không trả lời:
curl -i localhost:CỔNGlà biết ngay - TLS handshake / can't generate certificates: bật HTTPS Certificates trong console (mục DNS) rồi chờ cấp cert lần đầu
tailscale serve statusin cấu hình đang chạy, đọc kỹ trước khi đổ lỗi cho ai- ssl_error_rx_record_too_long: client gõ https vào cổng http, sửa URL, không phải sửa server
- Funnel còn thêm điều kiện riêng: chỉ cổng 443/8443/10000 và quyền funnel trong policy
Lần ngược từ 502: app đích trước tiên
502 Bad Gateway nghĩa là tầng proxy của Tailscale nhận yêu cầu ngon lành nhưng gọi vào app của bạn thì thất bại. Kiểm app trước khi nghi Tailscale:
tailscale serve status # dang tro vao dau?
curl -i http://localhost:3000 # app co song o cong do khong?
ss -tlnp | grep 3000 # co process nao dang nghe?Ba ca ra 502 nhiều nhất: app chết/chưa chạy (restart app); serve trỏ sai cổng (gõ tailscale serve reset rồi khai lại đúng); app chỉ nghe trên một IP cụ thể thay vì localhost (sửa app nghe 127.0.0.1 hoặc 0.0.0.0). Với app trong Docker, nhớ cổng phải chạm được từ nơi tailscaled đứng, host hay sidecar, xem bài Docker sidecar.
TLS handshake, can't generate certificates: chuyện chứng chỉ
Serve/Funnel cần chứng chỉ TLS cho tên ten-may.ten-tailnet.ts.net: và chỉ xin được khi tailnet đã bật HTTPS Certificates: admin console → DNS → HTTPS Certificates → Enable (cần MagicDNS bật kèm). Chưa bật là gặp đủ bộ: can't generate certificates, Tailscale's HTTPS support is disabled, client thì thấy TLS handshake error. Bật xong, lần xin cert đầu tiên mất chút thời gian (đừng spam lệnh); kiểm bằng tailscale cert ten-may.ten-tailnet.ts.net: lệnh trả về cặp cert/key là hệ chứng chỉ hoạt động. Còn gặp cert 500 internal server error: kiểm giờ hệ thống (lại nó!) và thử lại sau vài phút.
ssl_error_rx_record_too_long và các lỗi phía client
Lỗi này của trình duyệt, nghĩa đen: tôi chào TLS mà đầu kia đáp bằng HTTP thường. Nguyên nhân hầu như luôn ở URL: gõ https:// vào cổng đang phục vụ http (ví dụ https://may:3000 trong khi app nghe http ở 3000). Quy tắc nhớ: với serve/funnel, client luôn đi qua cổng chuẩn https (443), https://ten-may.ten-tailnet.ts.net/: còn cổng 3000 là chuyện nội bộ giữa proxy và app, client không gõ trực tiếp. Lỗi anh em ERR_SSL_PROTOCOL_ERROR xử cùng công thức: kiểm URL, scheme, cổng trước khi động vào server.
Funnel không lên công khai: hai điều kiện riêng
Serve chạy trong tailnet ngon mà funnel ra internet lại câm? Hai chốt riêng của funnel: cổng, công khai chỉ được 443, 8443, 10000 (app cổng khác cứ để serve proxy về, funnel mở ở 443); quyền, policy tailnet phải cho node này funnel (lần đầu chạy lệnh sẽ in link dẫn thẳng đến chỗ bật, hoặc admin console sửa policy thêm attr funnel). Kiểm trạng thái: tailscale funnel status. Nhớ đặc tính đã nói ở bài Funnel & Serve: traffic công khai đi qua relay, chậm hơn direct là bình thường, không phải lỗi.
Quy trình chốt: 5 lệnh theo thứ tự
1. curl -i http://localhost:CONG # app song?
2. tailscale serve status # tro dung cho?
3. tailscale cert ten-may.tailnet.ts.net # chung chi ok?
4. tailscale funnel status # (neu funnel) quyen + cong ok?
5. curl -vk https://ten-may.tailnet.ts.net/ # nhin loi tan mat tu clientĐi đủ 5 bước là khoanh được lỗi nằm ở chặng nào, app, cấu hình, chứng chỉ hay client. Còn nếu mọi chặng xanh mà bên ngoài vẫn không vào được funnel: kiểm mạng người truy cập (một số mạng công ty chặn tên miền lạ) và thử từ 4G.
Quy trình lần ngược, năm lệnh theo thứ tự
1. curl -i http://localhost:3000 # app dich co song khong 2. tailscale serve status # dang tro vao dau, cong nao 3. tailscale cert may.tailnet.ts.net # he chung chi co hoat dong khong 4. tailscale funnel status # da bat cong khai chua 5. curl -vI https://may.tailnet.ts.net # tu MAY NGOAI tailnet, xem bat tay TLS
Dừng ở bước đầu tiên báo lỗi, đừng làm tiếp. Hơn nửa số ca dừng ngay ở bước một, tức là vấn đề nằm ở ứng dụng của bạn chứ không phải ở Tailscale.
Bảng lỗi, nguyên nhân, việc cần làm
| Thông báo | Tầng hỏng | Việc cần làm |
|---|---|---|
502 Bad Gateway | Ứng dụng đích | Kiểm ứng dụng còn chạy, đúng cổng, và nghe trên 127.0.0.1 hoặc 0.0.0.0 chứ không phải một địa chỉ khác |
can't generate certificates | Cấu hình tailnet | Bật HTTPS Certificates trong trang quản trị, mục DNS. Cần bật MagicDNS trước |
TLS handshake error | Chứng chỉ | Cùng nguyên nhân trên, hoặc lần cấp chứng chỉ đầu tiên chưa xong. Chờ rồi thử lại, đừng gõ lệnh liên tục |
ssl_error_rx_record_too_long | Phía trình duyệt | Bạn đang gõ https vào một cổng đang phục vụ http. Sửa địa chỉ, không phải sửa máy chủ |
ERR_SSL_PROTOCOL_ERROR | Phía trình duyệt | Cùng công thức trên |
| Funnel im lặng, trong tailnet vẫn chạy | Quyền hoặc cổng | Funnel chỉ mở được cổng 443, 8443, 10000, và node phải được cấp quyền funnel trong chính sách |
cert 500 internal server error | Giờ hệ thống hoặc phía dịch vụ | Kiểm giờ máy, chờ vài phút rồi thử lại |
Ba lỗi cấu hình hay gặp khi ứng dụng chạy trong container
- Ứng dụng chỉ nghe trên
127.0.0.1bên trong container. Tailscale ở container khác hoặc ở host không gọi vào được. Sửa cấu hình ứng dụng để nghe0.0.0.0. - Trỏ serve vào
localhosttrong khi ứng dụng ở container khác. Với mẫu sidecar dùng chung mạng,localhostlà đúng. Với hai container riêng mạng, phải dùng tên dịch vụ trong compose. - Cấu hình serve không bền qua lần khởi động lại. Dùng biến
TS_SERVE_CONFIGtrỏ vào một tệp cấu hình nằm trên volume, thay vì gõ lệnh serve bằng tay mỗi lần.
Trước khi mở ra internet, ba việc bắt buộc
- Đặt xác thực trước ứng dụng. Funnel mở đường cho cả internet vào. Ứng dụng không có đăng nhập thì ai biết địa chỉ cũng vào được. Đây là điều nhiều người quên vì quen với việc chỉ dùng trong tailnet.
- Kiểm những gì đang phơi ra:
tailscale funnel statusliệt kê đúng các đường dẫn đang công khai. Chạy lại sau mỗi lần đổi cấu hình. - Chấp nhận độ trễ. Lưu lượng công khai đi qua máy chủ trung chuyển nên chậm hơn kết nối trực tiếp trong tailnet. Đây là thiết kế, không phải lỗi. Dịch vụ cần tốc độ cao thì dùng đường khác.
Câu hỏi thường gặp
Serve chạy được trong tailnet nhưng 502 khi qua funnel?
Hiếm khi là hai cấu hình khác nhau, funnel đứng trên serve. Kiểm tailscale serve status xem có hai entry lệch nhau không, reset rồi khai lại một lần từ đầu: tailscale funnel CỔNG.
Chứng chỉ ts.net có phải gia hạn tay không?
Không, Tailscale tự xin và tự gia hạn. Nếu cert hết hạn thật (rất hiếm), thường do máy tắt lâu hoặc giờ hệ thống sai; chạy lại tailscale cert và kiểm NTP.
Dùng tên miền riêng với serve/funnel bị lỗi cert thì sao?
Serve/Funnel không hỗ trợ tên miền riêng, chỉ ts.net. Tên miền riêng cần VPS + reverse proxy (Caddy tự lo cert) hoặc Cloudflare Tunnel; đừng cố trỏ CNAME vào ts.net, cert sẽ không bao giờ khớp.
Lỗi 504 gateway timeout khác gì 502?
502 là app từ chối/chết ngay; 504 là app nhận nhưng xử quá chậm không kịp trả lời, nhìn vào hiệu năng app: database nghẽn, cold start, hoặc app đang treo. Đo thử trực tiếp curl localhost xem mất bao lâu.
Bài viết liên quan
- Tailscale Funnel & Serve: đưa web ra internet không mở port
- Tailscale + Docker: sidecar đưa container vào tailnet
- Tailscale không kết nối được: chẩn đoán direct, relay, DNS
- Build AI Slack bot tự host bằng Claude API trên VPS
- RAM ECC vs RAM thường trên VPS: khác biệt thực tế (cho server chạy 24/7)
- Điện Toán Đám Mây - Phần 1
- RAID 10 là gì? Vì sao VPS nên chạy RAID 10 thay vì ổ đơn
- Setup MeiliSearch trên VPS: search engine ngon cho app startup
- Chrome DevTools MCP cho Claude, Codex, Gemini - AI agent thật sự control browser, debug như senior dev



