- 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
Ý kiến trên Hacker News