NAT dan sumber IP filtering di PF, menggunakan OpenBSD> = 4.7

8

Saya baru saja membaca buku tentang PF (The Book Of PF, No Starch), tetapi ada satu pertanyaan yang tidak dijawab olehnya.

Jika saya memiliki mesin gateway menggunakan dua antarmuka, $ int_if dan $ ext_if, dan saya NAT paket-paket yang berasal dari $ int_if: net (yang, katakanlah, 10.0.0.0/24) ke $ ext_if menggunakan match, ketika NAT diterapkan ? Sebelum atau sesudah aturan penyaringan?

Contoh:

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

Apakah itu bekerja? Atau mendapatkan IP sumber dari paket yang berasal dari 10.0.0.23 NATed ke alamat $ ext_if sebelum memeriksa apakah dari 10.0.0.23 dievaluasi?

Diagram ini tidak membantu untuk menjawab pertanyaan ini, saya pikir, tetapi tetap menarik: [ http://www.benzedrine.cx/pf_flow.png ]

Jika Anda membaca FAQ PF NAT [ http://www.openbsd.org/faq/pf/nat.html ], terutama bagian "Mengkonfigurasi NAT", Anda akan menemukan kalimat-kalimat ini:

Ketika sebuah paket dipilih oleh aturan kecocokan, parameter (misalnya nat-to) dalam aturan itu diingat dan diterapkan ke paket ketika aturan pass yang cocok dengan paket tersebut tercapai. Ini memungkinkan seluruh kelas paket untuk ditangani oleh aturan pertandingan tunggal dan kemudian keputusan khusus tentang apakah mengizinkan lalu lintas dapat dibuat dengan aturan blok dan lulus.

Saya pikir itu terdengar seperti tidak seperti yang saya nyatakan dalam paragraf di atas, jadi sumber IP akan "diingat" sampai ada keputusan tentang tindakan yang harus dilakukan dengan paket. Jika keputusan dibuat, NATting diterapkan.

Bagaimana menurut anda?

PS: Ini pertanyaan yang cukup teoretis. Jika Anda sedikit pragmatis, Anda akan melakukannya dengan cara ini:

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

Jadi blockaturan sudah diterapkan ketika paket masuk pada $ int_if.

EDIT: Kemungkinan lain, tentu saja, untuk memutuskan sebelum 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)

Jika paket dari .23 tiba, itu pertama kali cocok dengan aturan pertama, kemudian cocok dengan aturan kedua dan "aturan" ketiga. Tetapi karena aturan kedua adalah yang terakhir memutuskan tentang passing / pemblokiran, paket tersebut diblokir. Baik?

dermesser
sumber

Jawaban:

1

Ya, itu cukup teoretis, apa yang Anda tanyakan, tetapi pertanyaan yang sangat menarik.

The matchAturan akan diterapkan ketika bertindak atas aturan pencocokan lalu. matchaturan "lengket", seperti yang Anda sebutkan. Tujuan utama dari mereka adalah untuk dapat mengatur hal-hal seperti aturan NAT sekali, dan tidak harus menempatkan nat-to pada akhir banyak aturan yang Anda miliki tentang lalu lintas keluar.

Dalam contoh Anda paket akan dijatuhkan. Saya harus melihat kode atau meminta Henning Brauer untuk memastikan jika mereka melewatkan cek NAT sepenuhnya dalam drop case, tetapi itu tidak akan dibatalkan.

Saya pikir aturan ini ditutupi oleh Kitab PF (mendapat edisi ke-2?), Tapi saya tidak berpikir mereka eksplisit tentang hal itu dengan aturan pertandingan.

kurtm
sumber
0

Harap perbaiki saya jika saya salah, Anda ingin meneruskan semua paket keluar dari 10.0.0.0/24 tetapi Anda ingin memblokir 10.0.0.23? Jika demikian ubah aturan Anda menjadi:

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

Cukup gunakan quickuntuk mencegah firewall melanjutkan penyaringan (mirip dengan breakdalam beberapa bahasa pemrograman).

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

Kata Kunci cepat

Seperti yang ditunjukkan sebelumnya, setiap paket dievaluasi terhadap aturan filter dari atas ke bawah. Secara default, paket ditandai untuk bagian, yang dapat diubah dengan aturan apa pun, dan dapat diubah bolak-balik beberapa kali sebelum akhir aturan filter. Aturan pencocokan terakhir "menang". Ada pengecualian untuk ini: Opsi cepat pada aturan penyaringan memiliki efek membatalkan pemrosesan aturan lebih lanjut dan menyebabkan tindakan yang ditentukan untuk diambil. Mari kita lihat beberapa contoh:

Salah:

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

Dalam hal ini, garis blok dapat dievaluasi, tetapi tidak akan pernah memiliki efek apa pun, karena kemudian diikuti oleh garis yang akan melewati segalanya.

Lebih baik:

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

Aturan-aturan ini dievaluasi sedikit berbeda. Jika garis blok dicocokkan, karena opsi cepat, paket akan diblokir, dan sisa aturan akan diabaikan.


sumber
Saya mengetahui quickkata kunci tetapi saya tidak terlalu menyukainya - Saya selalu mencoba menggunakan urutan evaluasi pf;) Btw, saya menemukan jawabannya di halaman FAQ OpenBSD: "NAT ditentukan sebagai parameter nat-to opsional untuk aturan pass keluar. Seringkali, alih-alih ditetapkan langsung pada aturan pass, aturan pertandingan digunakan. Ketika sebuah paket dipilih oleh aturan pertandingan, parameter (misalnya nat-to) dalam aturan itu diingat dan diterapkan pada paket ketika aturan pass yang cocok dengan paket tercapai. " Jadi aturan saya tidak akan menyebabkan masalah dan dengan benar memblokir
0,23
(aturan yang cocok pada baris 2 membiarkan paket melewati setelah melewati semua aturan dan kemudian NAT diterapkan)
dermesser