STUN Server là một máy chủ của giao thức Session Traversal Utilities for NAT (STUN) cho phép máy khách xác định địa chỉ IP bên ngoài và cổng của nó, cũng như loại Network Address Translation (NAT) mà nó đang ở phía sau. Theo IETF RFC 5389, 2008, STUN là một thành phần bắt buộc của cơ sở hạ tầng WebRTC, cho phép thiết lập kết nối ngang hàng trực tiếp giữa các máy khách ở phía sau NAT.
Những điểm chính
STUN Server (Session Traversal Utilities for NAT) là một dịch vụ mạng hoạt động theo giao thức được định nghĩa trong RFC 5389 và cập nhật trong RFC 8489. Nhiệm vụ chính của máy chủ STUN là cung cấp cho máy khách thông tin về địa chỉ IP công khai và cổng của nó như được nhìn thấy từ mạng bên ngoài, cũng như xác định loại thiết bị NAT giữa máy khách và internet.
Kiến trúc STUN bao gồm hai thành phần: một máy khách STUN được nhúng trong ứng dụng (ví dụ: trình duyệt hoặc ứng dụng WebRTC gốc) và một máy chủ STUN được triển khai trong mạng công khai. Máy khách gửi một Binding Request đến máy chủ, máy chủ trong phản hồi của nó chỉ ra địa chỉ IP nguồn và cổng của yêu cầu — tức là các địa chỉ công khai của máy khách như máy chủ nhìn thấy. Bằng cách so sánh dữ liệu này với các địa chỉ cục bộ của mình, máy khách có thể xác định loại NAT đang được sử dụng trong mạng của nó.
STUN hoạt động trên UDP (cổng 3478 mặc định) hoặc TCP (cổng 3478 hoặc 5349 cho TLS). Một thông điệp STUN bao gồm phần đầu 20 byte và một số lượng thuộc tính thay đổi. Phần đầu chứa loại thông điệp (Binding Request, Binding Response, Binding Error Response), độ dài và một định danh giao dịch duy nhất (96 bit) cho phép so khớp các yêu cầu và phản hồi. Mỗi Binding Response chứa thuộc tính XOR-MAPPED-ADDRESS — địa chỉ bên ngoài của máy khách, được mã hóa với mặt nạ để bảo vệ khỏi các cuộc tấn công dựa trên việc chặn lưu lượng STUN.
Một máy chủ STUN hoạt động theo giao thức yêu cầu-phản hồi đơn giản. Máy khách ở phía sau NAT tạo một Binding Request và gửi nó đến máy chủ STUN. Máy chủ nhận gói tin, trích xuất địa chỉ IP nguồn và cổng người gửi từ phần đầu UDP, sau đó tạo một Binding Response, đóng gói địa chỉ này vào thuộc tính XOR-MAPPED-ADDRESS. Phản hồi được gửi trở lại địa chỉ nguồn của yêu cầu.
Máy khách nhận được phản hồi và trích xuất XOR-MAPPED-ADDRESS, chứa địa chỉ IP bên ngoài và cổng được chỉ định bởi thiết bị NAT. Sau đó, máy khách so sánh địa chỉ này với địa chỉ cục bộ (RFC 1919 — riêng tư) của nó. Nếu các địa chỉ trùng khớp — máy khách không ở phía sau NAT. Nếu chúng khác nhau — máy khách ở phía sau NAT, và địa chỉ bên ngoài được sử dụng làm ứng viên cho ICE (Interactive Connectivity Establishment) trong WebRTC.
Máy chủ STUN cho phép xác định loại NAT thông qua một chuỗi các yêu cầu kiểm tra. Máy khách gửi các yêu cầu với các cờ khác nhau (CHANGE-REQUEST) và phân tích các phản hồi. Chu kỳ khám phá đầy đủ bao gồm việc gửi các yêu cầu đến các địa chỉ IP và cổng khác nhau của máy chủ STUN. Nếu máy chủ trả lời yêu cầu với một cổng đã thay đổi — NAT thuộc loại Restricted Cone. Nếu nó không trả lời yêu cầu với cổng và IP đã thay đổi — NAT thuộc loại Symmetric. Thông tin này rất quan trọng để chọn chiến lược ICE trong WebRTC.
Một máy chủ STUN có thể phát hiện bốn loại NAT chính, mỗi loại ảnh hưởng khác nhau đến khả năng thiết lập kết nối P2P. Loại NAT xác định liệu STUN có thể cho phép kết nối trực tiếp giữa hai máy khách hay không. Nó cũng xác định ứng viên ICE nào — host, server reflexive hay relay — sẽ được sử dụng cho kết nối.
| Loại NAT | Hành vi | STUN hoạt động | Dự phòng ICE |
|---|---|---|---|
| Full Cone | Bất kỳ máy chủ bên ngoài nào cũng có thể gửi gói tin đến máy khách | Có | Server Reflexive |
| Restricted Cone | Chỉ các máy chủ mà máy khách đã gửi gói tin | Có | Server Reflexive |
| Port Restricted | Giống Restricted, nhưng cũng lọc theo cổng nguồn | Có | Server Reflexive |
| Symmetric NAT | Địa chỉ bên ngoài là duy nhất cho mỗi cặp máy chủ:cổng | Không | Relay (TURN) |
Symmetric NAT là loại duy nhất mà STUN không thể xử lý. Với Symmetric NAT, mỗi yêu cầu mới đến một máy chủ đích mới nhận được một địa chỉ bên ngoài khác (IP và/hoặc cổng). Vì máy chủ STUN báo cáo địa chỉ cho kết nối với chính máy chủ STUN, địa chỉ này không phù hợp để kết nối với một máy khách khác. Trong những trường hợp như vậy, WebRTC sử dụng máy chủ TURN để chuyển tiếp lưu lượng. Theo nghiên cứu (Ford et al., RFC 3489, 2003), khoảng 8–10% tất cả các thiết bị NAT trên internet là đối xứng.
Máy chủ STUN được tích hợp vào WebRTC thông qua cấu hình RTCPeerConnection. Trình duyệt hoặc ứng dụng gốc sử dụng STUN để thu thập các ứng viên ICE, sau đó được trao đổi qua Signaling Server. Trong cấu hình WebRTC, máy chủ STUN được chỉ định trong mảng iceServers với tiền tố stun: cho UDP hoặc stuns: cho các kết nối TLS.
Hãy xem xét một ví dụ về cấu hình máy chủ STUN trong JavaScript khi tạo RTCPeerConnection cho một ứng dụng WebRTC.
const config = {
iceServers: [
{
urls: "stun:stun.l.google.com:19302"
},
{
urls: "stun:stun1.l.google.com:19302"
}
]
};
const pc = new RTCPeerConnection(config);
pc.onicecandidate = (event) => {
if (event.candidate) {
console.log("Ứng viên ICE:", event.candidate.candidate);
}
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
Ví dụ này sử dụng các máy chủ STUN công khai của Google (stun.l.google.com:19302). Khi tạo offer hoặc answer, trình duyệt tự động gửi một Binding Request STUN đến các máy chủ được chỉ định, nhận địa chỉ bên ngoài (ứng viên server reflexive) và thêm nó vào danh sách các ứng viên ICE. Sau khi thu thập tất cả các ứng viên, chúng được gửi đến peer từ xa qua Signaling Server để thử thiết lập kết nối P2P trực tiếp.
Trong quá trình ICE, có ba loại ứng viên: host (địa chỉ cục bộ), srflx (server reflexive — thu được từ STUN) và relay (được chuyển tiếp qua TURN). Máy chủ STUN cho phép tạo các ứng viên srflx, có ưu tiên cao hơn các ứng viên relay vì kết nối dựa trên STUN là trực tiếp và không yêu cầu chuyển tiếp. Quá trình ICE kiểm tra tất cả các tổ hợp ứng viên (cục bộ và thu được từ STUN) của cả hai peer, bắt đầu từ các ưu tiên cao nhất.
Máy chủ STUN có những hạn chế cơ bản liên quan đến kiến trúc giao thức. Hạn chế chính là không thể hoạt động với Symmetric NAT, nơi mỗi yêu cầu mới đến một máy chủ bên ngoài nhận được một cổng bên ngoài duy nhất. Trong trường hợp này, địa chỉ thu được từ máy chủ STUN không thể được sử dụng để kết nối với một peer khác vì NAT đã tạo một ràng buộc chỉ cho việc giao tiếp với chính máy chủ STUN.
Hạn chế thứ hai là STUN không cung cấp chuyển tiếp dữ liệu. Nếu kết nối P2P trực tiếp không thể thực hiện được (cả hai peer ở phía sau Symmetric NAT), STUN không cung cấp một đường dẫn thay thế để truyền dữ liệu. Trong trường hợp này, cần có một máy chủ TURN, nó hoạt động như một bộ chuyển tiếp lưu lượng phương tiện giữa các peer, nhận dữ liệu từ một người tham gia và gửi nó đến người khác thông qua địa chỉ IP công khai của nó.
Bất chấp những hạn chế, máy chủ STUN vẫn là một thành phần quan trọng của cơ sở hạ tầng WebRTC. Trong hầu hết các trường hợp (80–90%), kết nối P2P trực tiếp có thể được thiết lập bằng STUN, giúp tránh chi phí chuyển tiếp TURN và giảm độ trễ truyền dữ liệu phương tiện. Đối với các ứng dụng WebRTC công khai, nên sử dụng kết hợp các máy chủ STUN và TURN với dự phòng tự động để đảm bảo kết nối trong mọi điều kiện mạng.
Câu hỏi thường gặp
Máy chủ STUN là một “tấm gương” trên internet cho máy khách biết địa chỉ IP bên ngoài của nó. Khi máy tính ở phía sau bộ định tuyến (NAT), nó không biết địa chỉ công khai của mình. Máy chủ STUN giúp tìm ra nó để các máy tính khác có thể kết nối trực tiếp.
Trong WebRTC, máy chủ STUN được chỉ định trong cấu hình RTCPeerConnection. Trình duyệt gửi một yêu cầu STUN để lấy địa chỉ ứng viên bên ngoài (srflx). Ứng viên này được truyền đến peer từ xa qua Signaling Server, và ICE cố gắng thiết lập kết nối trực tiếp giữa chúng.
STUN giúp tìm địa chỉ bên ngoài cho kết nối P2P trực tiếp. TURN chuyển tiếp lưu lượng qua máy chủ của nó khi P2P không thể thực hiện được. STUN là “tấm gương”, TURN là “người trung gian”. TURN tạo tải trên máy chủ và thêm độ trễ, vì vậy STUN được ưu tiên hơn.
Google cung cấp máy chủ STUN miễn phí: stun.l.google.com:19302, stun1.l.google.com:19302. Twilio cũng cung cấp cơ sở hạ tầng STUN + TURN thông qua Network Traversal Service. Đối với các ứng dụng sản xuất, tốt hơn nên sử dụng máy chủ STUN/TURN riêng hoặc thương mại với khả năng khả dụng được đảm bảo.
Symmetric NAT tạo một ánh xạ cổng bên ngoài duy nhất cho mỗi cặp “địa chỉ cục bộ:địa chỉ bên ngoài đích”. Địa chỉ mà máy khách nhận được từ máy chủ STUN được gắn với kết nối với máy chủ STUN đó. Khi một peer khác cố gắng sử dụng địa chỉ này, Symmetric NAT chặn gói tin vì ánh xạ cổng khác nhau cho địa chỉ đích mới.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm