Vì sao quy tắc chặn máy khách OpenVPN không bao giờ chạm tới FORWARD
Lưu lượng giữa các máy khách có thể ở lại bên trong tiến trình OpenVPN và không bao giờ đi qua chuỗi FORWARD của máy chủ, nên một bộ đếm bằng không chẳng chứng minh được gì.
Hai máy khách trên cùng một máy chủ OpenVPN vẫn có thể tới được nhau dù bạn đã thêm quy tắc DROP cho nhóm địa chỉ của chúng. Quy tắc nằm trong chuỗi FORWARD, lưu lượng rõ ràng đang chảy, vậy mà bộ đếm của quy tắc đó vẫn bằng không. Kết luận tự nhiên là tường lửa đã hỏng. Thường gặp hơn là gói tin chưa từng vào chuỗi.
Có hai đường mà một gói tin ngang hàng có thể đi qua máy chủ OpenVPN, và cấu hình quyết định chúng chứ không phải tường lửa. Biết đường nào đang được dùng sẽ cho bạn biết quy tắc trên máy chủ có nằm đúng chỗ hay không.
Hai đường mà gói tin ngang hàng có thể đi
Khi tùy chọn chuyển tiếp nội bộ bị tắt, một gói từ máy khách A đến giao diện đường hầm với đích nằm trong địa chỉ được cấp cho máy khách B. Bảng định tuyến của máy chủ gửi nó trở ra qua chính giao diện đường hầm đó, vì máy chủ sở hữu tuyến tới địa chỉ của B. Đây là một luồng vào và ra xuyên qua máy chủ, và đường chuyển tiếp IPv4 đánh giá nó.
Khi tùy chọn chuyển tiếp nội bộ được bật, tiến trình máy chủ khớp gói tin với một máy khách đang kết nối và ghi nó trở lại trực tiếp cho chính máy khách đó. Gói tin được xử lý bên trong daemon và không bao giờ quay lại thiết bị đường hầm, nên đường chuyển tiếp của máy chủ bị bỏ qua hoàn toàn. Hướng dẫn OpenVPN 2.6 mô tả tùy chọn này là chuyển tiếp nội bộ từ máy khách tới máy khách, và đó chính là lý do một quy tắc tường lửa trên máy chủ không thể thấy nó.
Có một biến thể thứ ba trong các triển khai chuyển kênh dữ liệu sang một mô-đun nhân. Quyết định chuyển tiếp và việc mã hóa rời khỏi không gian người dùng, và việc netfilter có thấy luồng hay không phụ thuộc vào cách đường chuyển được xây dựng. Đừng bao giờ giả định rằng một bộ quy tắc cũ hành xử trên máy chủ đã chuyển giống như trên máy chủ trong không gian người dùng. Hãy xác nhận chế độ từ cấu hình đang chạy, không phải từ phiên bản gói.
Khi bộ đếm không bao giờ nhúc nhích
Bộ đếm bằng không nghĩa là tại điểm đó gói tin không khớp với quy tắc ấy, và có nhiều lý do. Lý do đầu là việc đi vòng ở trên: lưu lượng chưa từng tới chuỗi. Lý do thứ hai là sự không khớp về giao diện, hướng, nguồn hoặc đích, điều thường gặp khi nhóm địa chỉ được đánh số lại và quy tắc vẫn nêu tiền tố cũ.
Lý do thứ ba là vị trí. Một quy tắc phía trước trong chuỗi có thể chấp nhận luồng trước khi DROP của bạn được đánh giá, và một quy tắc phía sau có thể là thứ thực sự quyết định kết quả. Hãy đọc chuỗi theo thứ tự với bộ đếm hiển thị, rồi kiểm tra bộ đếm của quy tắc nào tăng khi bạn lặp lại phép thử.
Hãy thực hiện một lần trao đổi có kiểm soát giữa hai máy khách mà bạn đã xác nhận địa chỉ thật từ trạng thái của chính máy chủ, chứ không phải từ một hợp đồng thuê bạn nhớ mang máng. Nếu bộ đếm liên quan vẫn không nhúc nhích, hãy nghi ngờ đường đi trước khi viết lại điều kiện khớp. Nếu nó nhúc nhích nhưng kết nối vẫn thành công, việc chặn đang bị ghi đè về sau và vấn đề là thứ tự. Câu trả lời đó quyết định việc sửa là thay đổi quy tắc hay thay đổi cấu trúc, nên hãy lấy nó trước khi sửa bất cứ thứ gì.
Chọn một ranh giới có thể lọc
Nếu chính sách buộc phải nằm trong tường lửa của máy chủ, hãy đặt lưu lượng ở nơi tường lửa có thể thấy nó. Tắt chuyển tiếp nội bộ là cách được hỗ trợ để lưu lượng giữa các máy ngang hàng đi qua giao diện đường hầm và đường chuyển tiếp, với cái giá là mọi gói tin ngang hàng đều phải đi qua ngăn xếp của máy chủ.
Sau đó khớp luồng cho chính xác. Lưu lượng đến giao diện đường hầm và rời giao diện đường hầm theo cả hai chiều, nên các quy tắc chỉ xét giao diện vật lý sẽ không khớp. Quy tắc dựa trên địa chỉ cần nhóm hiện tại, và phải tính đến chiều về cũng như chiều đi.
Nhiều triển khai được phục vụ tốt hơn khi lọc ở cấp máy khách hoặc nhóm, nơi danh tính đã biết và chính sách đi theo người dùng thay vì một địa chỉ thay đổi mỗi lần kết nối lại. Đó là cơ chế khác với chuỗi trên máy chủ, và không nên trộn hai thứ mà không có lý do rõ ràng.
Đừng mang nguyên bộ quy tắc của một cấu trúc cũ qua một lần di trú mà không thay đổi. Nhóm địa chỉ, tên giao diện và chế độ chuyển tiếp đều ảnh hưởng đến việc một quy tắc có khớp hay không, và một quy tắc sao chép từng chạy được là loại bằng chứng dễ gây nhầm lẫn nhất. Hãy bắt đầu từ luồng bạn muốn cho phép và viết quy tắc khớp với nó.
Kiểm tra cách ly thay vì tin vào một quy tắc
Hãy thử trường hợp bị cấm và trường hợp được phép trong cùng một lần chạy. Bắt đầu một kết nối mới từ máy khách này sang máy khách kia và xác nhận nó thất bại, rồi xác nhận một kết nối đáng lẽ được phép vẫn hoạt động. Nếu chỉ thử cái đầu, một tường lửa chặn tất cả trông như thành công.
Hãy lặp lại sau khi nạp lại cấu hình máy chủ và sau khi một máy khách kết nối lại, vì chuyển tiếp nội bộ và việc cấp nhóm địa chỉ là trạng thái lúc chạy. Kiểm tra bộ đếm theo cả hai chiều, vì một quy tắc khớp một chiều mà không khớp chiều trả lời sẽ tạo ra cách ly cục bộ rất khó nhận ra trong một phép thử nhanh.
Cách ly là kết quả quan sát được tại ranh giới thực sự mang lưu lượng. Một quy tắc DROP ở đâu đó trong máy chủ không phải là bằng chứng; một kết nối thất bại cùng bộ đếm đã nhúc nhích trên quy tắc gây ra nó mới là bằng chứng.