Tài liệu

Bắt đầu nhanh + mô tả chức năng của từng phần, từng thiết bị (đang tiếp tục cập nhật)

Phát hiện máy chủ NAT và gợi ý xuyên NAT

Bài viết này giới thiệu cách bảng điều khiển tự động nhận diện máy chủ NAT, phân biệt「NAT có thể thiết lập cổng」với「NAT không thể thiết lập cổng」, và khi cần sẽ hướng dẫn người dùng dùng tính năng vận hành xuyên NAT.

Trước tiên: NAT là gì

Máy chủ NAT là máy chủ「chỉ có IP nội bộ, không có IP công cộng riêng」. Ví dụ nhiều NAT VPS giá rẻ, nhà cung cấp đưa cho bạn một địa chỉ nội bộ (như 192.168.x.x), bạn không thể truy cập trực tiếp từ mạng công cộng, chỉ có thể truy cập thông qua ánh xạ cổng mà nhà cung cấp đưa (chuyển một cổng công cộng vào mạng nội bộ của bạn).

Giới thiệu chức năng

Sau khi thêm máy chủ, khi SSH kết nối thành công bảng điều khiển sẽ tự động phát hiện máy này có phải là kiểu NAT hay không (máy chỉ có địa chỉ nội bộ, không có IP công cộng riêng). Khi phát hiện NAT, trên thẻ máy chủ sẽ hiện một nhãn nhỏ, đồng thời ở đầu tab「Tổng quan」hiện một phần giải thích tập trung. Người dùng có thể nhấn vào nhãn màu vàng để xác nhận máy chủ NAT này có thể tự thiết lập chuyển tiếp cổng trong bảng điều khiển của nhà cung cấp hay không, từ đó quyết định có cần dùng vận hành xuyên NAT hay không.

Vì sao cần phân biệt NAT

「IP nội bộ」≠「cần xuyên NAT」. Máy chủ NAT chia làm hai loại:

LoạiĐặc điểmCó cần xuyên NAT
NAT có thể thiết lập cổngNhà cung cấp có bảng ánh xạ cổng, người dùng có thể tự ánh xạ cổng công cộng vào cổng nội bộ❌ Không cần, cổng tự xử lý được
NAT không thể thiết lập cổngNhà cung cấp chỉ ánh xạ cố định vài cổng như SSH(22), các cổng khác từ mạng công cộng không vào được✅ Cần vận hành xuyên NAT

Chỉ「NAT không thể thiết lập cổng」mới cần vận hành xuyên NAT. NAT có thể thiết lập cổng thì cổng tự ánh xạ được, dùng chẳng khác gì máy có IP công cộng, không nên bị nhắc đi nhắc lại.

Nguyên lý phát hiện

Sau khi SSH kết nối thành công, bảng điều khiển chạy lệnh chỉ đọc ip -4 addr show để đọc IP card mạng cục bộ của máy chủ, phán đoán xem tất cả có thuộc dải nội bộ hay không:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
  • 100.64.0.0/10 (CGNAT — NAT cấp nhà mạng)
  • 127.0.0.0/8, 169.254.0.0/16, 0.0.0.0/8

Chỉ cần tồn tại bất kỳ một IP thuộc dải công cộng, kết luận là「có IP công cộng」(không phải NAT); nếu tất cả đều thuộc dải nội bộ thì kết luận là「NAT」.

> Lệnh phát hiện là chỉ đọc, không thay đổi bất kỳ trạng thái nào của máy chủ. Kết quả phát hiện được ghi vào cơ sở dữ liệu, chỉ phát hiện một lần ở lần kết nối đầu tiên, sau đó dùng lại kết quả, không làm chậm kết nối.

Vị trí nhãn và phần giải thích

Sau khi phát hiện NAT, gợi ý được hiển thị ở hai nơi:

1. Tab「Tổng quan」trong bảng Quản lý hệ thống: sau khi nhấn「Quản lý hệ thống」trên thẻ của một máy chủ để vào bảng điều khiển, tab đầu tiên「Tổng quan」sẽ hiện băng gợi ý NAT tương ứng — máy chủ có nhãn vàng hiện giải thích màu vàng (kèm hướng dẫn xóa nhãn), máy chủ có nhãn đỏ hiện hướng dẫn xuyên NAT màu đỏ. Gợi ý chỉ xuất hiện trên máy chủ kết nối trực tiếp đang là NAT và chưa xác nhận, không chiếm chỗ trên thẻ.

2. Nhãn nhỏ trên thẻ: trên thẻ chỉ giữ một nhãn nhỏ, chia làm ba trạng thái:

NhãnMàuÝ nghĩaHành vi khi nhấn
NATVàngPhát hiện NAT (IP cục bộ thuộc dải nội bộ), chờ xác nhậnHiện hộp xác nhận
Cần xuyên NATĐỏCổng không thể truy cập từ mạng công cộng, cần xuyên NATHiện hướng dẫn vận hành xuyên NAT
(không có nhãn)—Đã xác nhận「cổng không vấn đề」, nhãn đã được xóa—

Nhãn NAT màu vàng là trạng thái「chờ xác nhận」: nhấn vào sẽ hiện hộp xác nhận, có thể chọn một trong hai:

  • 「Cổng không vấn đề, xóa nhãn」→ nhãn biến mất, sau đó không nhắc nữa;
  • 「Cổng không truy cập được, đánh dấu cần xuyên NAT」→ nhãn chuyển đỏ, hướng dẫn sang vận hành xuyên NAT.

Nhãn Cần xuyên NAT màu đỏ là「cảnh báo」: nhấn vào sẽ đến thẳng vận hành xuyên NAT + xuyên cổng.

> Vì sao không làm「tự động dò xem cổng có truy cập được không」: máy chủ bảng điều khiển và máy chủ đích có thể ở cùng một phòng máy, việc dò từ bảng điều khiển đi qua mạng nội bộ, đo được「thông」không có nghĩa là khách bên ngoài cũng thông, kết quả không đáng tin. Nên「cần xuyên NAT」do người dùng tự đánh dấu trong hộp thoại giải thích màu vàng.

Vì sao máy chủ NAT「dùng một lúc thì bị ngắt kết nối」

Máy chủ NAT có idle timeout (hết thời gian chờ kết nối nhàn rỗi) tại gateway của nhà cung cấp. Sau khi kết nối SSH nhàn rỗi vài phút, gateway sẽ âm thầm cắt kết nối (TCP nửa mở), mà cả hai phía đều không nhận ra.

Bảng điều khiển xử lý triệt để bằng hai điểm sau:

1. Bật keepalive cho kết nối SSH: mọi kết nối sau khi thiết lập sẽ gửi một gói keepalive mỗi 30 giây, vừa ngăn NAT cắt kết nối khi nhàn rỗi, vừa kịp thời phát hiện kết nối nửa chết.

2. Dọn định kỳ pool kết nối: luồng nền mỗi 2 phút đóng các kết nối đã nhàn rỗi quá 2 phút, ngăn kết nối nửa chết tích tụ vô hạn.

Lưu ý

1. Phát hiện phụ thuộc vào SSH kết nối thành công: khi máy chủ ngoại tuyến hoặc sai mật khẩu thì không phát hiện được, không hiện nhãn.

2. Máy chủ không hiện nhãn: máy chủ có IP công cộng, máy Android (Termux), thiết bị đã xuyên NAT (có tunnel_token) đều không hiện nhãn NAT — chúng vốn đi theo kênh riêng, không cần nhắc NAT.

3. Trường hợp đặc biệt vẫn có đường lùi: rất ít máy「NAT 1:1」(máy chủ mở toàn bộ cổng) có IP cục bộ cũng là mạng nội bộ, sẽ bị phát hiện là NAT. Khi đó người dùng chỉ cần chọn「được」trong hộp xác nhận, không ảnh hưởng sử dụng.

4. Xác nhận xong vẫn đổi được: trạng thái nhãn do người dùng xác nhận quyết định, có thể điều chỉnh bất cứ lúc nào bằng cách nhấn vào nhãn.

Tài liệu liên quan