Định tuyến theo chính sách trả lời một câu hỏi khác với câu hỏi mà hầu hết ghi chú xử lý sự cố đặt ra. Bảng chính cho biết đích đến đi đâu; các quy tắc chính sách cho biết bảng nào được tra cứu, và chúng có thể quyết định điều đó dựa trên địa chỉ nguồn, một dấu gói tin, hoặc giao diện mà gói tin đến. Khi một đường hầm hành xử không nhất quán, tập quy tắc thường là nguyên nhân và bảng định tuyến thường không phải.

Quy tắc chọn bảng, rồi bảng chọn tuyến

Mỗi quy tắc mang một ưu tiên, một điều kiện khớp và một bảng đích. Nhân hệ điều hành duyệt các quy tắc theo thứ tự ưu tiên và dừng ở kết quả khớp đầu tiên, sau đó thực hiện tra cứu tiền tố dài nhất thông thường trong bảng đó. Một quy tắc trỏ tới bảng rỗng sẽ rơi xuống mục mà quy tắc tiếp theo chọn, và đó là cách một quy tắc viết cẩn thận có thể trông như không làm gì.

Vì vậy việc đổ bảng chính hiếm khi giải thích được một ứng dụng VPN đang hoạt động. Các ứng dụng thường chèn quy tắc ở số ưu tiên thấp, rất lâu trước quy tắc mặc định của bảng chính, nên gói tin không bao giờ tới tuyến mà bạn đang nhìn. Hạ một metric trong bảng chính không thay đổi gì với lưu lượng đã bị chuyển hướng.

Một quy tắc cũng có thể cố ý biến một tiền tố thành lỗ đen hoặc không thể tới được. Một số ứng dụng thêm quy tắc như vậy như công tắc an toàn, và khi đó việc bị chặn trông như đường hầm hỏng chứ không phải được cấu hình.

Hãy đọc tập quy tắc như một chuỗi, không phải một danh sách

In các quy tắc cùng ưu tiên và các bảng mà chúng tham chiếu, rồi in từng bảng có tuyến mặc định hoặc tuyến đường hầm. Thứ tự là phần quan trọng, và đó cũng là phần mà ảnh chụp màn hình thường bỏ sót:

ip rule show
ip route show table all | sed -n '1,60p'
ip route get 198.51.100.20 from 10.8.0.2
ip route get 198.51.100.20 from 10.8.0.2 mark 0x1

Hai lệnh cuối là những lệnh biến lý thuyết thành quan sát, vì chúng hỏi nhân hệ điều hành sẽ làm gì với nguồn đó và dấu đó. Nếu câu trả lời thay đổi khi dấu thay đổi, một quy tắc dựa trên dấu đang có hiệu lực và mọi phép thử bỏ qua dấu đang thử một gói tin khác. Kết nối bên ngoài xứng đáng có quy tắc riêng. Một đường hầm định tuyến toàn bộ lưu lượng qua chính nó phải loại trừ địa chỉ điểm cuối mà nó kết nối tới, nếu không các gói tin đã mã hóa sẽ bị gửi trở lại đường hầm mà chúng vừa rời. Hầu hết ứng dụng chèn ngoại lệ đó tự động, và tập quy tắc chỉnh tay là nơi nó bị thiếu.

Dấu và socket: hai cách ứng dụng phân chia lưu lượng

Một số ứng dụng đánh dấu gói tin trong tường lửa và thêm quy tắc khớp với dấu. Những ứng dụng khác dùng định tuyến ở mức socket, đặt tuyến trên socket trước khi nó kết nối. Cách thứ nhất thấy được trong ip rule; cách thứ hai thì không, và nó sẽ không xuất hiện trong một tra cứu chung.

Nếu một chương trình thử hành xử khác với ứng dụng mà nó được cho là đại diện, hãy kiểm tra xem ứng dụng có đặt dấu hay gắn với một thiết bị không. Sự khác biệt đó không còn là bí ẩn khi cơ chế được gọi tên, và nó giải thích vì sao một curl từ shell và một tab trình duyệt có thể đi những đường khác nhau trên cùng một máy. Cả hai kỹ thuật đều là định tuyến theo chính sách theo nghĩa rộng: chúng chọn đường bằng một thứ khác đích đến. Không cái nào cấp quyền cho lưu lượng, và không cái nào thay thế các quy tắc tường lửa hay thông tin đăng nhập mà phía đối tác mong đợi.

Theo dõi quyền sở hữu trước khi thêm một quy tắc nữa

Các quy tắc do một thứ gì đó cài đặt. Một ứng dụng VPN, một trình quản lý mạng và một script viết tay đều có thể thêm quy tắc khi khởi động, và logic kết nối lại có thể để lại tập trước đó. Hai quy tắc cũ từ một hồ sơ trước sẽ tiếp tục điều hướng lưu lượng rất lâu sau khi hồ sơ bị xóa.

Tìm xem tiến trình nào sở hữu quy tắc dựa trên ưu tiên và hình dạng của nó, và kiểm tra xem chủ sở hữu đó có ghi lại tập quy tắc ở mỗi kết nối không. Nếu có, một quy tắc thủ công thêm hôm nay sẽ biến mất ngày mai, và cách sửa thuộc về cấu hình của ứng dụng chứ không phải một tệp lịch sử shell. Xóa toàn bộ tập quy tắc để thử là một lối tắt hấp dẫn với chi phí có thể đoán trước: nó cũng gỡ những quy tắc mà ứng dụng cần để đường hầm của chính nó hoạt động. Xóa từng quy tắc một, hoặc thử trên một máy có thể khởi động lại.

Chứng minh phạm vi bằng hai luồng, không phải một

Một bản sửa chỉ được kiểm chứng bằng một luồng đáng lẽ bị ảnh hưởng và một luồng không đáng bị. Chọn một đích mà chính sách định tuyến vào đường hầm, và một đích phải ở ngoài, rồi so sánh các tra cứu và các bản bắt gói cho cả hai:

ip route get 198.51.100.20 from 192.0.2.44
ip route get 198.51.100.21 from 192.0.2.44
tcpdump -ni any host 198.51.100.21 and port 443

Khi hai tra cứu trả về các giao diện khác nhau, quy tắc đang làm gì đó. Khi chúng trả về cùng một giao diện, quy tắc khớp rộng hơn dự định, và đó là lỗi âm thầm gửi cả một mạng con qua đường hầm chỉ dành cho một ứng dụng.

Ghi lại ưu tiên của các quy tắc và dịch vụ sở hữu trong phiếu, cùng hai địa chỉ thử. Người tiếp theo khi đó có một cặp tái tạo được thay vì mô tả triệu chứng, và có thể nói trong một phút liệu định tuyến theo chính sách còn hiệu lực hay không.

Bài viết liên quan