Một quy tắc NAT lẽ ra phải cấp cho một nhóm máy khách VPN địa chỉ công cộng riêng của nó lại đứng ở không gói, trong khi cùng nhóm đó vẫn đi ra với nguồn sai. Quy tắc thường không sai ở địa chỉ; nó sai ở giao diện. -o eth0:0 trỏ tới một thiết bị không tồn tại, vì eth0:0 là một nhãn gắn với một địa chỉ trên eth0. Nhìn vào các bộ đếm là cách nhanh nhất để xác nhận điều đó, và cách sửa còn nhỏ hơn những gì cuộc điều tra gợi ý.

Kiểm tra xem nhân gọi thiết bị là gì

Đọc hai khung nhìn riêng rẽ trước khi thay đổi bất cứ điều gì:

ip link show
ip address show dev eth0
ip route get 203.0.113.20

Danh sách liên kết hiển thị các giao diện. Danh sách địa chỉ có thể hiển thị địa chỉ IPv4 thứ hai mang nhãn eth0:0, và thiết bị cho địa chỉ đó vẫn là eth0. Sổ tay địa chỉ của iproute2 coi nhãn là tên của địa chỉ, không phải một liên kết thứ hai, và chính sự phân biệt đó là nơi toàn bộ vấn đề xoay quanh.

Lịch sử giải thích sự nhầm lẫn. Cú pháp cũ ifconfig eth0:0 thực sự trông giống một giao diện mới, và các kịch bản thời đó vẫn còn tham chiếu tới nó. Trên một hệ thống hiện nay, bí danh là một nhãn trên địa chỉ, và không gì trên đường định tuyến hay netfilter coi nó là một điểm ra riêng.

Kiểm tra xem quy tắc thực sự khớp với cái gì

Đọc các bộ đếm cùng với danh sách quy tắc thay vì từ trí nhớ:

iptables -t nat -L POSTROUTING -v -n --line-numbers

Một quy tắc có bộ đếm gói đứng ở không trong khi lưu lượng khớp vẫn chảy là quy tắc không được đánh giá, và một điều kiện giao diện ra nêu tên eth0:0 là nguyên nhân phổ biến. Thiết bị ra mà tuyến đã chọn là eth0, nên một điều kiện tìm tên khác sẽ không bao giờ đúng, dù nhân chọn địa chỉ nguồn nào.

Đổi điều kiện sang thiết bị thật và để nhãn ra ngoài. Nếu cần phân biệt hai nhóm máy khách dùng chung thiết bị đó, hãy phân biệt bằng tiền tố nguồn, không bằng tên giao diện không thể tồn tại. Hai quy tắc với các khớp -s -s không chồng lấn thì đọc được và kiểm thử được; một quy tắc với thiết bị hư cấu thì không phải cả hai. Hãy ghi chú cho mỗi quy tắc nêu tên nhóm, vì nửa năm nữa chỉ tiền tố sẽ không nói cho ai biết vì sao nó ở đó.

Kiểm tra tuyến đã chọn thiết bị

NAT postrouting chạy sau khi tuyến đã chọn giao diện ra, nên giao diện trong quy tắc phải là giao diện mà tuyến đã chọn. Hỏi nhân trực tiếp bằng ip route get cho một địa chỉ máy khách tiêu biểu và đọc cả thiết bị lẫn nguồn mà nó báo cáo.

Nếu câu trả lời nêu eth0, phần giao diện của quy tắc đã rõ. Nếu nó nêu một thiết bị đường hầm, gói không bao giờ tới quy tắc bạn đang sửa, và việc tìm kiếm chuyển sang bảng định tuyến cùng các ưu tiên của nó. Một quy tắc không bao giờ khớp vì gói đã đi ra chỗ khác trông giống hệt trong đầu ra bộ đếm với một quy tắc có thiết bị viết sai. Hãy xác nhận bạn thuộc trường hợp nào trong hai trường hợp trước khi sửa bất cứ điều gì, vì trường hợp thứ hai cần thay đổi định tuyến chứ không phải văn bản.

Chọn nguồn đã dịch một cách có chủ đích

Khi thiết bị đã đúng, địa chỉ nguồn là một quyết định riêng. Đây chỉ là một nhóm IPv4 minh họa và một địa chỉ ví dụ:

iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 \
  -j SNAT --to-source 203.0.113.20

Việc ghi một địa chỉ vào --to-source không khiến ai định tuyến nó trở lại bạn. Nhà cung cấp thượng nguồn hoặc chủ sở hữu địa chỉ phải chuyển các trả lời cho địa chỉ đó tới máy chủ này, và địa chỉ phải là địa chỉ bạn được phép dùng. Nếu không, quy tắc sẽ khớp và dịch và các trả lời vẫn đi chỗ khác.

Đổi địa chỉ nguồn không giống như đổi liên kết thượng nguồn. Khi yêu cầu thật là một đường vật lý khác, chính sách định tuyến phải chọn đường đó trước; sau đó SNAT viết lại nguồn trên thiết bị mà chính sách đã chọn. Thêm nhãn trên eth0 không cho cả tuyến lẫn quyền.

Kiểm chứng bằng một kết nối vừa mở

Mở kết nối máy khách mới thay vì dùng lại kết nối sẵn có. Theo dõi kết nối giữ lại bản dịch đã ghi khi luồng bắt đầu, nên một phiên cũ có thể tiếp tục dùng địa chỉ nguồn trước đó và làm một quy tắc mới đúng trông như hỏng. Xem bộ đếm tăng lên, rồi quan sát nguồn đã dịch trên đường dây hoặc ở đầu xa.

Với nhiều nhóm dùng chung một giao diện, hãy cấp cho mỗi nhóm một khớp nguồn rõ ràng và địa chỉ dịch riêng, giữ chúng trong cấu hình được quản lý của tường lửa và ghi lại thứ tự chúng được đánh giá. Sau đó ghi lại điều bạn đã kiểm chứng: thiết bị từ ip route get, bộ đếm đã nhích, và nguồn mà phía xa đã thấy. Bản ghi đó trả lời báo cáo tiếp theo mà không lặp lại sự nhầm lẫn về nhãn.

Bài viết liên quan