Vì sao nftables không thấy lưu lượng OpenVPN giữa các máy khách
Lưu lượng giữa các đối tác được chuyển giao bên trong tiến trình VPN, nên các bộ đếm chuyển tiếp không bao giờ nhích. Muốn đếm nó, phải chọn giữa đường đi qua nhân và đường đi qua tiến trình.
Hai máy khách trên một máy chủ trao đổi tệp, việc truyền tải thành công, và mọi quy tắc chuyển tiếp bạn hướng vào đường hầm đều báo không gói tin nào. Các quy tắc không hỏng và chuỗi không đặt sai chỗ. Khi bật chuyển tiếp giữa các đối tác, gói tin được chuyển giao bên trong tiến trình máy chủ và ngăn xếp của máy chủ không bao giờ trở thành bộ định tuyến, nên tường lửa của nhân không có gì để đếm. Hiểu được sự phân tách đó quyết định việc bạn giữ lối tắt hay dựng lại đường đi qua nhân.
Theo dõi một gói tin đi qua máy chủ
Trong một đường hầm được định tuyến, tiến trình nền giao gói tin đã giải mã của từng máy khách cho thiết bị đường hầm. Từ đó máy chủ định tuyến nó, móc chuyển tiếp chạy, và một quy tắc khớp với thiết bị đường hầm có thể đếm hoặc bỏ lưu lượng. Đó là con đường mà hầu hết ví dụ về tường lửa giả định.
| Forwarding path | Who decides | What the host firewall sees |
|---|---|---|
| Kernel routing between clients | Host routing table and forward rules | Every inner packet, with interface names |
| Peer forwarding inside the server process | The VPN daemon's own peer table | Only the outer encrypted transport |
Lối tắt loại bỏ máy chủ khỏi vị trí trung gian. Gói tin đã giải mã của một phiên được giao cho phiên khác bên trong tiến trình nền, và gói tin bên trong không bao giờ được phát ra trên thiết bị đường hầm và máy chủ không định tuyến nó. Lưu lượng được đóng gói vẫn đi qua giao diện vật lý, nên bản ghi bên ngoài trông bận rộn trong khi các quy tắc bên trong vẫn im lặng. Bản ghi lấy trên thiết bị đường hầm không cho thấy gì cả, điều khiến bất kỳ ai mong xem việc truyền tải ở đó phải ngạc nhiên. Sự bất đối xứng đó là cách nhanh nhất để nhận ra lối tắt từ bên ngoài tiến trình nền.
Phép thử bộ đếm quyết định đường nào đã chạy
Gắn một bộ đếm vào quy tắc lẽ ra phải áp dụng, chạy một lần truyền giữa hai máy khách mà quy tắc đó lẽ ra phải chặn, rồi đọc bộ đếm sau đó.
sudo nft list ruleset
sudo nft add rule inet filter forward iifname "tun0" oifname "tun0" counter accept
sudo nft list chain inet filter forward
Nếu việc truyền thành công và bộ đếm vẫn bằng không, nhân chưa bao giờ xử lý những gói tin đó, và không việc sửa quy tắc nào thay đổi được điều này. Lặp lại phép thử tương tự với một dịch vụ trên chính máy chủ, vì luồng đó thực sự đi qua ngăn xếp của máy chủ và bộ đếm của nó nhích lên. Chính việc so sánh hai kết quả mới cho ra câu trả lời.
Hai chi tiết ngăn một cách đọc sai. Tên giao diện ghi trong nhãn chuỗi không tự nó lọc gì cả, vì việc khớp diễn ra trên các trường giao diện bên trong quy tắc. Và một thiết kế cầu ở lớp 2 lại hành xử khác nữa: ở đó các máy khách chia sẻ một miền quảng bá, nên việc phát hiện đối tác là điều được mong đợi chứ không phải lỗi định tuyến.
Bộ chuyển mạch không phải danh sách truy cập
Đây là phần khiến mất một buổi chiều. Chuyển tiếp giữa các đối tác là một thiết lập bật hoặc tắt, và chừng nào nó bật thì tiến trình nền là điểm chuyển tiếp duy nhất. Tường lửa của máy chủ không thể diễn đạt ai được đến với ai, và các tệp theo từng máy khách không biến bộ chuyển mạch thành ma trận chính sách.
Nếu bạn cần quy tắc theo từng đối tác, lựa chọn là giữa từ bỏ lối tắt và từ bỏ tường lửa của máy chủ như công cụ kiểm soát. Tắt nó sẽ khôi phục chuyển tiếp của nhân, điều này đòi hỏi bật chuyển tiếp IP trên máy chủ và các quy tắc rõ ràng cho những luồng bạn muốn. Để nó bật nghĩa là chính sách sống trong cấu hình của tiến trình nền, mà trên thực tế là mọi đối tác hoặc không đối tác nào.
Các tiến trình máy chủ riêng với bể địa chỉ và cổng của chúng là con đường trung gian khả thi. Mỗi tiến trình mang đúng một quyết định truy cập, nên hai nhóm có thể có quy tắc khác nhau mà không cần ma trận chính sách. Máy chủ có thể định tuyến giữa các bể khi đó là ý định, và khi ấy tường lửa thấy những luồng đó vì chúng đi qua máy chủ. Cái giá là thêm cổng, thêm chứng chỉ và một hồ sơ cho mỗi nhóm.
Chọn điểm chuyển tiếp
Hãy chọn chuyển tiếp qua nhân khi tường lửa là cỗ máy chính sách, khi bạn cần ghi nhật ký theo luồng, hoặc khi việc tính toán quan trọng. Cái giá là thông lượng qua ngăn xếp của máy chủ và nhiều quy tắc hơn để bảo trì. Lợi ích là mọi công cụ sẵn có, từ bộ đếm đến bộ xuất luồng, lại mô tả lưu lượng. Trên một máy chủ nhỏ cái giá đó vô hình; trên một bộ tiếp chuyển bận rộn thì không.
Hãy chọn chuyển tiếp bên trong tiến trình khi lưu lượng giữa các đối tác hoặc được cho phép toàn bộ hoặc bị cấm toàn bộ và máy chủ được định cỡ cho việc đó. Cái giá là các bộ đếm, kỷ luật hàng đợi và theo dõi kết nối không còn mô tả các luồng bên trong; điều đó chỉ chấp nhận được nếu về sau không ai dựa vào chúng.
Dù bạn chọn gì, hãy ghi nó bên cạnh các quy tắc tường lửa. Một tập quy tắc trông như cho phép lưu lượng giữa các đối tác trong khi tiến trình nền vẫn quyết định sẽ đánh lừa người tiếp theo gỡ lỗi một lần truyền thất bại. Ai chỉ đọc quy tắc sẽ cho rằng nhân là cổng.
Cần kiểm tra gì trước khi thay đổi quy tắc
Hãy đọc cấu hình mà máy chủ thực sự đã nạp, không phải tệp bạn nhớ là đã sửa, và xác nhận xem tùy chọn đối tác có hiện diện không. Nếu bạn đã thay đổi nó, hãy chắc rằng dịch vụ đã nạp lại chứ không chỉ ghi lại một tệp trên đĩa.
Sau đó lặp lại phép thử với một luồng từ máy khách đến máy chủ để chứng minh quy tắc có khớp chút nào không, và kiểm tra các tuyến được đẩy xuống, vì một tuyến thiếu trông từ phía máy khách đúng như một chặn của tường lửa. Chỉ đổi thứ tự quy tắc sau khi bạn biết điểm chuyển tiếp nào nắm quyết định.