Tailscale Funnel lỗi 502, TLS handshake, cert: cách sửa

Chia sẻ bài viết

Mục lục
Tailscale Funnel lỗi 502, TLS handshake, cert: cách sửa

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.

Tóm tắt nhanh
  • 502 = proxy của Tailscale sống nhưng app đích không trả lời: curl -i localhost:CỔNG là 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 status in 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áoTầng hỏngViệc cần làm
502 Bad GatewayỨng dụng đíchKiể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 certificatesCấu hình tailnetBật HTTPS Certificates trong trang quản trị, mục DNS. Cần bật MagicDNS trước
TLS handshake errorChứ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_longPhía trình duyệtBạ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_ERRORPhía trình duyệtCùng công thức trên
Funnel im lặng, trong tailnet vẫn chạyQuyền hoặc cổngFunnel 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 errorGiờ 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.1 bê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 để nghe 0.0.0.0.
  • Trỏ serve vào localhost trong khi ứng dụng ở container khác. Với mẫu sidecar dùng chung mạng, localhost là đú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_CONFIG trỏ 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 status liệ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.

Hạ tầng VPS tại Việt Nam của TND
Cloud VPS linh hoạt và VPS NVMe xung cao, IP công cộng riêng, đặt tại Việt Nam
Funnel hợp demo; dịch vụ chạy thật cần HTTPS tên miền riêng, băng thông không qua relay và ổ đĩa đủ nhanh cho app phía sau, một VPS NVMe TND với Caddy 3 dòng cấu hình là xong, vẫn quản trị qua tailnet. Nhu cầu nhẹ có Cloud VPS phổ thông, bàn giao 5 phút.
Dùng thử VPS NVMe, bàn giao trong 5 phútNhu cầu nhẹ hơn? Xem Cloud VPS

Bài viết liên quan