Dấu được đặt trong nftables đáng lẽ phải đưa một lớp lưu lượng qua đường hầm, nhưng lưu lượng vẫn tiếp tục đi ra qua giao diện vật lý. Bộ quy tắc trông đúng khi xét riêng lẻ. Điều thường xảy ra là một thứ khác đã ghi cùng dấu đó, hoặc quy tắc định tuyến khớp với một mặt nạ mà giá trị mới không còn thỏa mãn.

Kiểm tra 1: đọc quy tắc mà nhân khớp

Hãy bắt đầu từ quy tắc chính sách chứ không phải tường lửa. Nhân duyệt các quy tắc theo thứ tự ưu tiên và kết quả khớp đầu tiên quyết định bảng. Đọc giá trị fwmark và mặt nạ từ chính quy tắc, rồi xác nhận rằng gói có dấu bạn đã đặt thực sự khớp với nó. Một quy tắc chờ giá trị đầy đủ 32 bit sẽ không khớp với gói chỉ mang một bit.

Sau đó xác nhận quy tắc đó chọn bảng nào và bảng chứa gì. Một quy tắc trỏ tới bảng rỗng tạo ra tra cứu thất bại, điều này trên nhiều hệ thống nghĩa là gói rơi xuống quy tắc tiếp theo và đi ra ngoài qua giao diện vật lý.

Hai lệnh giải quyết việc này: danh sách quy tắc và tra cứu tuyến cho đích trong bảng đó.

Kiểm tra 2: dấu gói hay dấu kết nối

nftables có thể đặt dấu trên gói và dấu trên mục theo dõi kết nối, và đây là những đối tượng khác nhau. Dấu gói tồn tại trong suốt lượt xử lý gói, còn dấu kết nối tồn tại cho luồng và phải được sao chép có chủ đích. Đặt một cái và chờ cái kia là cách sửa nửa vời phổ biến.

Nếu quy tắc định tuyến dựa vào dấu gói, việc khôi phục dấu kết nối về sau trên đường đi không làm gì cho quyết định đó, vì quyết định đã được đưa ra rồi.

Hãy quyết định đối tượng nào sở hữu tín hiệu định tuyến, rồi đặt nó tại điểm đưa ra quyết định định tuyến.

Kiểm tra 3: ai khác cũng ghi dấu đó

Công cụ của chính WireGuard đánh dấu các gói UDP của nó để lưu lượng mã hóa không bị định tuyến trở lại đường hầm mà nó thuộc về. Nếu bộ quy tắc của bạn gán một giá trị không liên quan cho cùng trường đó, việc loại trừ đó biến mất và lưu lượng bên ngoài của đường hầm cố gắng đi vào chính nó. Triệu chứng là một đường hầm được thiết lập rồi ngừng truyền lưu lượng.

Dấu cũng được các công cụ tường lửa khác, mạng container và định tuyến theo chính sách dùng cho mục đích khác, nên việc hai hệ thống con ghi toàn bộ trường là xung đột dù mỗi bên đúng riêng lẻ.

Hãy liệt kê những người ghi trước khi thêm một cái nữa.

Kiểm tra 4: mặt nạ quyết định thứ bạn giữ lại

Dấu là một trường 32 bit, và mặt nạ là cách nhiều chủ sở hữu chia sẻ nó. Đặt giá trị có mặt nạ sẽ giữ lại các bit bạn không sở hữu; đặt toàn bộ trường sẽ phá hủy bit của tất cả những người khác. Hãy đọc mặt nạ trong mọi quy tắc chạm tới trường, kể cả những quy tắc bạn không viết.

Ghi lại việc phân bổ bit bên cạnh bộ quy tắc.

Nếu không, người tiếp theo sẽ dùng lại một giá trị đã có chủ, và xung đột ở đây trông giống lỗi định tuyến trong khi thực ra là lỗi đánh địa chỉ. Tài liệu của nftables về siêu dữ liệu gói mô tả chính các thao tác dấu.

Kiểm tra 5: xác minh bằng luồng thật, không phải bằng tra cứu

Một tra cứu tuyến thông thường không mang dấu, nên nó có thể hiển thị đường đi khác với gói thật. Hãy tạo lưu lượng bạn quan tâm và quan sát các bộ đếm, mục theo dõi kết nối và giao diện mà nó thực sự đi ra. Hãy thử cả lớp được bao gồm lẫn lớp bị loại trừ, vì một dấu quá rộng sẽ phá vỡ việc loại trừ trong khi trông có vẻ thành công. Nếu lớp được bao gồm hoạt động và lớp bị loại trừ cũng vào đường hầm, thì dấu quá rộng chứ không phải quá hẹp.

Tránh xóa trạng thái kết nối để buộc làm mới trong một phiên đang chạy, vì luồng mới và luồng hiện có có thể đi những đường khác nhau một cách hợp lệ.

Hãy ghi lại dấu, mặt nạ và bảng ở một chỗ, và lần chỉnh sửa tiếp theo sẽ có thể xem xét được.

Bài viết liên quan