Kapan status track modul conntrack iptable dari paket?

Aug 15 2020

Pertama-tama perlu menyimpan negara bagian. Dengan beberapa BSD firewall lama yang saya gunakan, saya kira bernama IPFW, saya biasa meletakkan aturan yang "melacak status paket yang pergi", dan ini ditempatkan pada arah antarmuka keluar. Kemudian, aturan lain di arah masuk yang memeriksanya terhadap status yang dibuat oleh aturan di arah keluar. Jadi dulu ada 2 aturan: (1) untuk mengisi tabel negara bagian, ini pada arah keluar, dan (2) untuk mencari tabel negara bagian, ini pada arah masuk.

Tetapi dengan connntrack, saya melihatnya diterapkan pada rantai INPUT, seperti aturan ini:

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Ini membuat saya bertanya-tanya, apa sebenarnya yang dilakukan pernyataan itu?

  • Apakah dikatakan bahwa itu akan mulai melacak paket yang cocok dengan aturan itu dengan meletakkan informasinya di tabel status?
  • Atau apakah itu mengatakan bahwa itu sudah memiliki informasi negara bagian, dan itu akan bertindak terhadap pesan masuk berdasarkan itu? (mis. terima jika mereka termasuk dalam koneksi yang diterima sebelumnya?). Tapi, dalam kasus ini, di mana tabel negara bagian diisi? Aturan mana yang melakukannya? Atau apakah itu tanpa aturan dan implisit?

Jawaban

5 A.B Aug 15 2020 at 21:43

Presentasi pengantar Netfilter dan conntrack

Pertama skema wajib tentang aliran Paket di Netfilter dan Jaringan Umum:

Netfilter adalah kerangka penyaringan paket yang memasukkan dirinya sendiri ke seluruh tumpukan jaringan (diwakili oleh "keputusan perutean" dan bagian kotak bermata bulat putih lainnya). Netfilter menyediakan hook dan API untuk subsistem dan "klien" lain. Di antara bagian-bagian ini adalah conntrack (pelacak koneksi) dan iptables (atau nftables ). Pemisahan antara Netfilter dan conntrack cukup kabur. Anda bisa mempertimbangkan conntrack sebagai bagian terintegrasi dari Netfilter.

Dalam skema yang menjelaskan berbagai langkah yang dilalui paket, Anda dapat melihat bahwa di beberapa titik (antara raw / PREROUTING dan mangle / PREROUTING, atau antara raw / OUTPUT dan mangle / OUTPUT) paket melintasi conntrack .

Pada titik ini, conntrack akan mencari di tabel pencariannya sendiri (database pencarian mini disimpan dalam memori kernel):

  • jika karakteristik paket ini tidak ditemukan (dan jika tidak dinyatakan UNTRACKED dalam tabel mentah), entri tuple dua arah conntrack baru (protokol, lalu informasi keluarga dan protokol tertentu: sumber dan port awal, tujuan dan port awal, sumber balasan dan port, tujuan balasan dan port (dua yang terakhir biasanya kebalikannya, kecuali NAT atau beberapa protokol aneh yang terlibat, seperti gema balasan yang cocok dengan permintaan gema untuk ICMP)) yang menjelaskan aliran dibuat dengan status BARU.
  • jika cocok (ke segala arah) entri sebelumnya dan kompatibel dengan status aliran ini, status aliran mungkin diubah (misalnya: berubah dari BARU ke ESTABLISHED jika sebelumnya tidak demikian).
  • jika karena alasan tertentu paket tidak dapat mencocokkan aliran yang ada meskipun memiliki karakteristiknya (misalnya: paket TCP terlambat diterima setelah transmisi ulang berhasil dilakukan, jadi keluar dari jendela sehubungan dengan urutan dan nilai SACK) paket akan diberi tag INVALID.
  • ada beberapa kasus lain seperti TERKAIT: ini tentang paket yang bukan bagian dari aliran itu sendiri tetapi terkait dengan aliran baru yang dapat dikaitkan dengan aliran lain yang ada (yaitu: dalam database). Dua contoh adalah kesalahan ICMP yang dibuat dari menerima paket (misalnya: UDP port unreachable) atau ketika pembantu protokol khusus seperti modul kernel nf_conntrack_ftp, yang merupakan plugin untuk subsistem conntrack , mendeteksi bahwa paket adalah bagian dari aliran data terpisah yang terkait dengan perintah FTP PASV / EPSV atau PORT / EPRT dilakukan pada alur perintah (pada port 21).

Mengatasi pertanyaan itu

Semua ini dikatakan, berikut adalah jawaban untuk kedua peluru Anda:

  • di jaringan utama ruang nama conntrack mulai melacak koneksi segera setelah modulnya (termasuk kemungkinan sub-modul khusus protokol yang relevan) dimuat. Untuk ruang nama jaringan non-inisial (kontainer ...) ini juga memerlukan beberapa subsistem lain yang mereferensikannya (seperti modul conntrack OP iptables atau menggunakan sekali perintah yang conntrackdijelaskan nanti). Ini adalah default dan paket harus secara khusus ditandai sebagai tidak terlacak sebelumnya yang conntrack subsistem melihatnya untuk paket ini untuk tidak akan dilacak. Di Linux hanya ada beberapa kasus di mana tidak diperlukan pelacakan, tetapi tentu saja firewall stateful dan NAT stateful / dinamis tidak akan tersedia lagi (NAT steless yang bahkan mungkin perlu menggunakan UNTRACKED di tempat pertama, masih bisa selesai, tetapi tidak dengan iptables . tc atau nftables can). Untuk menghindari penanganan conntrack beberapa paket, aturan iptables semacam ini dapat digunakan (misalnya: port 80 / tcp):

    iptables -t raw -A PREROUTING -p tcp --dport 80 -j CT --notrack
    iptables -t raw -A OUTPUT -p tcp --sport 80 -j CT --notrack
    
  • Ketika paket melintasi filter / INPUT dan mencapai aturan ini:

     iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    

    The iptables 's modul kernel tertentu xt_conntrackquery conntrack subsistem (ditangani oleh berbagai modul kernel yang relevan nf_conntrack*) dan bertanya tentang keadaan paket ini dalam database lookup nya. Jika jawabannya adalah RELATEDatau ESTABLISHEDpaketnya cocok dan melanjutkan ke putusan ACCEPT. Sebenarnya hasilnya sudah di-cache dalam paket saat pertama kali pencarian dilakukan (biasanya oleh conntrack ) jadi ini adalah "pencarian" yang murah. Dengan demikian, ini adalah aturan umum untuk menangani aliran yang telah diterima sebelumnya. Alur tersebut pada awalnya dapat diterima dalam aturan yang secara eksplisit menyebutkan -m conntrack --ctstate NEWatau hanya aturan yang tidak menyebutkannya tetapi ditempatkan setelah aturan umum ini (namun perlu diingat status INVALID, yang biasanya harus DIHAPUS sebelum melakukannya).

  • menambahkan peluru: penanganan paket masuk dan paket keluar cukup simetris antara PREROUTING dan OUTPUT (bahkan jika tidak terlihat simetris): antarmuka conntrack di PREROUTING serta OUTPUT (dan di beberapa tempat lain, mengingat NAT adalah bekerja dengan conntrack , kecuali untuk paket pertama dalam status NEW traversing tabel nat iptables ). Ini mungkin sedikit berbeda dari uraian yang Anda tulis tentang IPFW. Jika aplikasi yang menjalankan server juga membatasi aliran keluar, kemungkinan besar server tersebut memerlukan aturan iptables umum yang sama baik di filter / OUTPUT dan di filter / INPUT, untuk memungkinkan paket balasan keluar dari lalu lintas masuk yang sudah diterima untuk lewat.


Informasi tambahan

Ada alat khusus untuk berinteraksi dengan conntrack tabel lookup subsistem ini dari conntrack-alat .

  • conntrack: untuk menanyakan, menghapus atau memperbarui konten tabel pencarian yang ditangani oleh conntrack .

    Beberapa contoh.

    Anda dapat membuat daftar semua entri terlacak (yang bisa menjadi besar tanpa filter tambahan) dengan:

    conntrack -L
    

    Jika sistem Anda melakukan NAT (misalnya router di depan LAN pribadi, atau menjalankan VM dan kontainer), Anda dapat menggunakan --any-nat, --src-natatau --dst-nathanya menampilkan resp. semua NAT, semua NAT sumber (masquerade), atau semua NAT tujuan (biasanya untuk port yang diteruskan):

    Pemantauan peristiwa conntrack waktu nyata :

    conntrack -E
    
  • conntrackd: daemon yang dua tujuan utamanya adalah (conntrack) flow accounting dan statistik, atau sinkronisasi status cluster firewall stateful ketersediaan tinggi .

2 TeroKilkanen Aug 15 2020 at 20:46

Pelacakan koneksi adalah fungsi terpisah dari Netfilter, dan tidak dikonfigurasi dengan IPTables.

Pada gambar, ada dua conntracklangkah di jalur INPUT dan satu di jalur OUTPUT. Langkah-langkah ini mengaitkan paket individual dengan koneksi yang sudah ada yang dilacak di tabel pelacakan koneksi, atau membuat entri pelacakan koneksi baru di tabel.

Fungsionalitas Conntrack adalah modul kernel Linux, dan sering kali disertakan di kernel dalam konfigurasi default.

Operasi Conntrack dapat disetel dengan menyesuaikan net.netfilter.nf_conntracknilai sysctl.

Alternatif kedua Anda adalah apa yang terjadi. Informasi status dicatat oleh fungsi Conntrack, dan aturan IPTables hanya berkonsultasi dengan tabel Conntrack untuk informasi.