2 điểm bởi GN⁺ 2023-09-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bài viết giải thích cách Linux thực hiện chuyển đổi địa chỉ mạng (NAT) cho lệnh ping sử dụng Internet Control Message Protocol (ICMP)
  • Tác giả đã khám phá mã mạng của Linux để hiểu cách NAT hoạt động với các gói ICMP, vốn không có trường cổng
  • Tác giả thiết lập một thí nghiệm dùng network namespace để mô phỏng nhiều thiết bị trên một máy Linux duy nhất, và dùng lệnh ping để kiểm tra quá trình NAT
  • Thí nghiệm bao gồm tạo hai client kết nối với một bridge, cùng với một hộp NAT và máy chủ, đồng thời cấu hình định tuyến và NAT
  • Tác giả bắt các gói ICMP trong network namespace của client và server rồi phân tích dữ liệu gói tin
  • Tác giả phát hiện mỗi client có trường "id" khác nhau, cho phép hộp NAT phân biệt các gói phản hồi cần chuyển đến từng client
  • Tác giả tìm hiểu mã nguồn Linux và RFC 792, tài liệu định nghĩa giao thức ICMP, để hiểu cách ID được chọn
  • Tác giả phát hiện lệnh ping chọn định danh một cách ngẫu nhiên; nếu hai tiến trình ping trên các host khác nhau chọn cùng một ID, kernel Linux sẽ chọn ngẫu nhiên một cổng còn trống, và cổng này sẽ được dùng làm ID của gói ICMP
  • Tác giả sử dụng công cụ bpftrace để lần theo các hàm của kernel và kiểm chứng hiểu biết của mình về mã netfilter
  • Kết luận của bài viết là Linux NAT ping bằng cách tạo kết nối cho từng client, ghi lại địa chỉ IP nguồn và/hoặc trường ICMP id trong gói đi ra, rồi đảo ngược các thay đổi đó khi xử lý gói phản hồi
  • Bài viết cung cấp phần giải thích chi tiết theo từng bước để người mới bắt đầu là kỹ sư phần mềm với kiến thức kỹ thuật nền tảng vẫn có thể tiếp cận

1 bình luận

 
GN⁺ 2023-09-11
Ý kiến trên Hacker News
  • Bài viết về cách Linux NAT xử lý các yêu cầu ping
  • Máy chủ gửi các gói ICMP echo request cố định tới một địa chỉ cố định, và ban đầu không kỳ vọng chúng sẽ quay trở lại
  • Khi máy khách cố gắng kết nối, nó gửi một gói ICMP time exceeded về máy chủ, trong đó có chứa gói cố định “gốc” mà máy chủ đã gửi
  • Máy khách hoạt động giống như một hop trên Internet, báo cho máy chủ rằng gói gốc đã không thể được chuyển tiếp
  • Thiết bị NAT chuyển tiếp gói ICMP time exceeded tới máy chủ phía sau NAT, bao gồm cả toàn bộ IP header của máy khách, nhờ đó máy chủ có thể biết được địa chỉ IP của máy khách
  • Khi một lệnh ping được gửi từ mạng cục bộ tới một thiết bị trên Internet, router thực hiện NAT sẽ ghi lại địa chỉ nguồn của ping thành địa chỉ IP công khai và ghi lại trường ID của gói ICMP thành một giá trị duy nhất
  • Router dùng giá trị ID duy nhất đó để chuyển phản hồi tới đúng thiết bị trong mạng cục bộ
  • Bài đăng cũng cung cấp tài liệu về một công cụ tên là Netfilter, được dùng cho việc can thiệp gói, chuyển đổi địa chỉ mạng và lọc gói
  • Bài viết được khen ngợi vì đào sâu qua mọi tầng trừu tượng cho tới tận mã nguồn để phân tích
  • Vì ICMP không có cổng, NAT không cần xử lý bài toán gửi ICMP echo reply trở lại đúng cổng
  • ICMP echo request có trường ID, về bản chất tương đương với số cổng nguồn
  • Việc NAT cho ICMP echo đòi hỏi ánh xạ lại ID theo cả hai chiều, tương tự như cách UDP ánh xạ lại cổng nguồn
  • Một số người dùng bày tỏ sự khó chịu về việc liên kết tới các dòng mã cụ thể trong bài blog vì chúng có thể thay đổi theo thời gian
  • Một số người dùng chỉ trích NAT là một lớp trừu tượng tệ và kêu gọi chấm dứt IPv4
  • Có suy đoán về khả năng dùng ping qua UDP để gửi các thông điệp ngắn cho mạng ngang hàng mà không cần máy chủ trung tâm
  • Có thể tóm tắt bài viết là: gói ICMP có trường ID và Netfilter xử lý gói ICMP như một “trường hợp đặc biệt”