NAT và lọc IP nguồn trong PF, sử dụng OpenBSD> = 4.7


8

Tôi mới đọc một cuốn sách về PF (Cuốn sách của PF, Không có tinh bột), nhưng có một câu hỏi không được trả lời bởi nó.

Nếu tôi có một máy cổng sử dụng hai giao diện, $ int_if và $ ext_if và tôi NAT các gói đến từ $ int_if: net (nghĩa là, 10.0.0.0/24) đến $ ext_if sử dụng match, khi NAT được áp dụng ? Trước hay sau quy tắc lọc?

Thí dụ:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23

Nó có hoạt động không? Hoặc lấy IP nguồn của gói đến từ 10.0.0.23 NATed đến địa chỉ của $ ext_if trước khi kiểm tra nếu nó từ 10.0.0.23 được đánh giá?

Sơ đồ này không hữu ích để trả lời câu hỏi này, tôi nghĩ vậy, tuy nhiên nó rất thú vị: [ http://www.benzedrine.cx/pf_flow.png ]

Nếu bạn đọc Câu hỏi thường gặp về PF NAT [ http://www.openbsd.org/faq/pf/nat.html ], đặc biệt là phần "Định cấu hình NAT", bạn sẽ bắt gặp câu này:

Khi một gói được chọn theo quy tắc khớp, các tham số (ví dụ: nat-to) trong quy tắc đó được ghi nhớ và được áp dụng cho gói khi đạt được quy tắc phù hợp với gói. Điều này cho phép cả lớp các gói được xử lý theo một quy tắc khớp duy nhất và sau đó đưa ra các quyết định cụ thể về việc có cho phép lưu lượng truy cập có thể được thực hiện với các quy tắc chặn và vượt qua hay không.

Tôi nghĩ rằng âm thanh như thể nó không như tôi đã nêu trong đoạn trên, vì vậy IP nguồn sẽ được "ghi nhớ" cho đến khi có quyết định về hành động được thực hiện với gói. Nếu quyết định được đưa ra, NATting sẽ được áp dụng.

Bạn nghĩ sao?

PS: Đây là một câu hỏi khá lý thuyết. Nếu bạn hơi thực dụng một chút, bạn sẽ làm theo cách này:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23

Vì vậy, blockquy tắc đã được áp dụng khi gói đến trong $ int_if.

EDIT: Tất nhiên, một khả năng khác là quyết định trước NAT:

pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)

Nếu một gói từ 0,23 đến, đầu tiên nó khớp với quy tắc đầu tiên, sau đó khớp với quy tắc thứ hai và "quy tắc" thứ ba. Nhưng vì quy tắc thứ hai là quyết định cuối cùng về việc truyền / chặn, gói bị chặn. Đúng?

Câu trả lời:


1

Vâng, nó khá lý thuyết, những gì bạn hỏi, nhưng một câu hỏi rất thú vị.

Các matchquy tắc sẽ được áp dụng khi nó được hoạt động trên nguyên tắc phù hợp cuối cùng. matchquy tắc là "dính", như bạn đã đề cập. Mục đích chính của chúng là có thể thiết lập những thứ như quy tắc NAT một lần và không phải đặt tự nhiên vào cuối một loạt các quy tắc bạn có về lưu lượng truy cập đi.

Trong ví dụ của bạn, gói sẽ bị loại bỏ. Tôi phải xem mã hoặc yêu cầu Henning Brauer chắc chắn nếu họ bỏ qua kiểm tra NAT hoàn toàn trong trường hợp thả, nhưng nó sẽ không bị loại bỏ.

Tôi nghĩ rằng quy tắc của bạn được bao phủ bởi Sách PF (có phiên bản thứ 2?), Nhưng tôi không nghĩ họ rõ ràng về quy tắc đó với quy tắc đối sánh.


0

Vui lòng sửa cho tôi nếu tôi sai, bạn muốn chuyển tất cả các gói đi từ 10.0.0.0/24 nhưng bạn muốn chặn 10.0.0.23? Nếu vậy thay đổi quy tắc của bạn thành:

match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop out quick on $ext_if from 10.0.0.23
pass out on $ext_if from 10.0.0.0/24

Chỉ cần sử dụng quickđể ngăn chặn tường lửa tiếp tục lọc (tương tự như breaktrong một số ngôn ngữ lập trình).

http://www.openbsd.org/faq/pf/filter.html#quick

Từ khóa nhanh

Như đã chỉ ra trước đó, mỗi gói được đánh giá theo bộ quy tắc bộ lọc từ trên xuống dưới. Theo mặc định, gói được đánh dấu cho đoạn văn, có thể được thay đổi theo bất kỳ quy tắc nào và có thể được thay đổi qua lại nhiều lần trước khi kết thúc quy tắc bộ lọc. Quy tắc kết hợp cuối cùng "chiến thắng". Có một ngoại lệ cho điều này: Tùy chọn nhanh về quy tắc lọc có tác dụng hủy bỏ mọi xử lý quy tắc tiếp theo và khiến hành động được chỉ định được thực hiện. Hãy xem xét một vài ví dụ:

Sai lầm:

block in on fxp0 proto tcp to port ssh
pass  in all 

Trong trường hợp này, dòng khối có thể được đánh giá, nhưng sẽ không bao giờ có bất kỳ ảnh hưởng nào, vì sau đó nó được theo sau bởi một dòng sẽ vượt qua mọi thứ.

Tốt hơn:

block in quick on fxp0 proto tcp to port ssh
pass  in all 

Các quy tắc này được đánh giá một chút khác nhau. Nếu dòng khối được khớp, do tùy chọn nhanh, gói sẽ bị chặn và phần còn lại của quy tắc sẽ bị bỏ qua.


Tôi biết về quicktừ khóa nhưng tôi không thực sự thích nó - Tôi luôn cố gắng sử dụng thứ tự đánh giá của pf;) Btw, tôi đã tìm thấy câu trả lời trên trang Câu hỏi thường gặp của OpenBSD: "NAT được chỉ định làm tham số tùy chọn tự nhiên cho Thông thường, thay vì được đặt trực tiếp trên quy tắc vượt qua, quy tắc đối sánh được sử dụng. Khi gói được chọn theo quy tắc khớp, các tham số (ví dụ: nat-to) trong quy tắc đó được ghi nhớ và được áp dụng cho gói khi đạt được quy tắc phù hợp với gói. ". Vì vậy, bộ quy tắc của tôi sẽ không gây ra bất kỳ vấn đề nào và chặn chính xác .23
dermesser

(quy tắc khớp trong dòng 2 cho phép các gói đi qua sau khi trải qua tất cả các quy tắc và sau đó NAT được áp dụng)
dermesser
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.