Bộ định tuyến của bạn đang chạy Linux và hành vi này rất dễ thực hiện trên bất kỳ bản phân phối Linux gốc nào. Tôi có thể đoán những quy tắc nào phải có trong tường lửa của bộ định tuyến để nó hoạt động như thế này. Nhưng hãy lưu ý rằng đây chỉ là suy đoán, chúng tôi không biết chính xác các quy tắc trông như thế nào trong thực tế.
Khi bạn chuyển tiếp một cổng tới máy chủ web của mình, nó đã thêm một quy tắc DNAT cụ thể, có thể giống như sau:
iptables -t nat -A PREROUTING -p tcp -d <your-external-address> --dport 443 -j DNAT --to-destination <raspberry-pi-address>
Nói cách khác, điều này có nghĩa là: "trước khi quyết định xem gói này được dành cho thiết bị hay phải được chuyển tiếp, hãy kiểm tra xem địa chỉ đích của gói có phải là địa chỉ bên ngoài của bạn không và cổng đích có phải là 443 hay không. Nếu trùng khớp, hãy thay đổi địa chỉ đích thành mạng LAN của raspberry pi Địa chỉ". Lưu ý, quy tắc này không lọc theo giao diện.
Ngoài ra, nó chắc chắn có quy tắc kiểu SNAT (để cung cấp quyền truy cập internet cho mạng LAN), có thể nó trông như thế này:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
Nói cách khác, sau khi bộ định tuyến quyết định gói phải đi đâu, trước khi gửi gói, nó sẽ thay đổi địa chỉ nguồn của nó thành bất kỳ địa chỉ nào mà giao diện gửi đi có (nếu gói được gửi từ mạng LAN). Một lần nữa, không có gì được lọc bởi một giao diện.
Bây giờ hãy xem xét kết nối HTTPS của bạn. Bạn đang chỉ định tên máy chủ trong trình duyệt, phải không? Bạn thiết lập nó để nó được phân giải thành địa chỉ bên ngoài của bộ định tuyến, địa chỉ này sẽ trở thành địa chỉ đích. Địa chỉ nguồn của bạn nằm trong mạng LAN. Vì vậy, có vẻ như cả hai quy tắc này đều áp dụng cho các gói kết nối của bạn.
Xử lý chúng, trước tiên, bộ định tuyến gặp quy tắc DNAT, kiểm tra địa chỉ đích và cổng và quyết định thay đổi địa chỉ đích thành địa chỉ của raspberry pi.Sau đó, nó phát hiện ra giao diện mà gói phải đi ra ngoài là mạng LAN. Sau đó, nó kiểm tra gói được dịch một phần theo quy tắc thứ hai và tìm ra địa chỉ nguồn là từ mạng LAN. Vì vậy, nó thay thế địa chỉ nguồn của gói bằng địa chỉ của giao diện LAN, 192.168.1.1. Đây là những gì mâm xôi pi của bạn nhìn thấy.
Hoạt động NAT có trạng thái, tức là nó cũng duy trì một bản ghi bảng cho biết cái nào được thay thế bằng cái gì và làm thế nào để phát hiện các gói chuyển tiếp và trả lời tiếp theo, vì vậy nó dịch tất cả chúng một cách chính xác. Vâng, hóa ra Linux có thể thực hiện DNAT và SNAT cùng lúc trong cùng một luồng.
Bạn có thể tin tưởng hành vi này? Tôi không biết. Nếu chương trình cơ sở của bộ định tuyến là nguồn mở, chúng tôi đã có cơ hội kiểm tra. Không có nguồn, chúng tôi không thể chắc chắn. Điều này luôn xảy ra khi nguồn đóng, đó là lý do tại sao phải tránh các sản phẩm nguồn đóng nếu bạn lo ngại về bảo mật.